J'ai lu autour des raisons d'utiliser ou non Guid
et int
.
int
est plus petit, plus rapide, facile à retenir, conserve une séquence chronologique. Et pour ce Guid
qui est du seul avantage que j’ai trouvé, c’est que c’est unique. Dans quel cas un Guid
serait mieux que int
et pourquoi?
D'après ce que j'ai vu, int
il n'y a aucun défaut, si ce n'est la limite du nombre, qui dans de nombreux cas est sans importance.
Pourquoi exactement a été Guid
créé? En fait, je pense que cela a un but autre que celui de servir de clé primaire d'un simple tableau. (Un exemple d'application réelle utilisant Guid
quelque chose?)
(Guid = UniqueIdentifier) sur SQL Server
int
n'a de défaut que par la limite en nombre, qui dans de nombreux cas est sans importance.": en fait, dans ce contexte INT vs GUID, la limite supérieure d'un 32 bits signéINT
est totalement sans importance étant donné que la limite supérieure d'un signe 64 bitsBIGINT
est bien au-delà de presque toutes les utilisations (encore plus si vous commencez à numéroter à la limite inférieure; il en va de mêmeINT
) et qu’il a toujours la moitié de la taille d’un GUID (8 octets au lieu de 16) et séquentiel.Réponses:
Cela a été demandé dans Stack Overflow ici et ici .
Le post de Jeff explique beaucoup sur les avantages et les inconvénients de l'utilisation du GUID.
Si vous êtes certain des performances et que vous ne prévoyez pas de répliquer ou de fusionner des enregistrements, utilisez
int
-le et définissez-le comme une incrémentation automatique ( graine d'identité dans SQL Server ).la source
UNIQUEIDENTIFIER
plusINT
parceINT
que sa limite supérieure est un raisonnement plutôt médiocre, car être illimité, bien que vrai, ne constitue pas un avantage pratique . Vous pouvez facilement doubler la capacité réelle d'unINT
en le démarrant à la limite inférieure (-2,14 milliards) au lieu de 1. Sinon, si les 4,3 milliards ne suffisent pas, commencez avec une valeur deBIGINT
seulement 8 octets. comparé à 16 pour le GUID, et il est séquentiel.Si vous synchronisez vos données avec une source externe, un GUID persistant peut être bien meilleur. Un exemple rapide d'utilisation d'un GUID est un outil envoyé au client pour analyser son réseau et effectuer certaines classes de détection automatique, stocker les enregistrements trouvés, puis tous les enregistrements du client sont intégrés dans une base de données centrale. retour sur notre fin. Si nous utilisions un entier, nous aurions 7 398 "1", et il serait beaucoup plus difficile de savoir lequel "1" était lequel.
la source
J'ai utilisé une approche hybride avec succès. Les tables contiennent à la fois une
id
colonne d' entier de clé primaire à incrémentation automatique ET uneguid
colonne. Leguid
peut être utilisé selon les besoins pour identifier globalement la ligne de manière unique etid
peut être utilisé pour les requêtes, le tri et l'identification humaine de la ligne.la source
id
suffisant est déjà suffisant pour permettre aux humains d'identifier une ligne?INT
PK. Je trouve étrange que cette approche ne soit pas beaucoup plus commune étant donné que c’est le meilleur des deux mondes. Il semble que la plupart des gens préfèrent simplement résoudre des problèmes dans des termes très absolutistes, sans se rendre compte que la PK n'a pas besoin d'être un GUID pour que l'application puisse toujours utiliser des GUID pour une unicité et / ou une portabilité globales.Certaines pratiques recommandées mentionnent encore que vous devez utiliser un type de données qui héberge avec le moins de mémoire possible l’ensemble des valeurs que vous allez utiliser. Par exemple, si vous l'utilisez pour stocker le nombre d'employeurs dans une petite entreprise et que vous n'atteignez probablement pas 100, personne ne suggérera alors d'utiliser une valeur bigint alors que int (même de petite taille) ferait l'affaire.
Bien entendu, l’inconvénient est que «Dites non à l’évolutivité!
De plus, je sais que ce n'est pas totalement lié, mais il y a un autre facteur à ce sujet. Lorsque cela n’est pas excessif, j’essaie généralement de recommander l’utilisation d’une clé primaire non générée automatiquement, si cela a du sens. Par exemple, si vous enregistrez les informations du conducteur, ne créez pas une nouvelle colonne générée automatiquement pour "ID", utilisez simplement le numéro de licence.Je sais que cela semble vraiment évident, mais je vois cela être oublié assez souvent.Pour le contexte: cette partie de la réponse a été abordée à partir d’une approche théorique des données, dans laquelle vous souhaitez que votre PC soit l’identificateur de données unique d’un enregistrement. La plupart du temps, nous créons ceux qui existent déjà, d'où la réponse précédente.
Cependant, il est très rare que vous puissiez avoir un contrôle étroit sur ces points de données et, par conséquent, vous devrez peut-être apporter des corrections ou des ajustements. Vous ne pouvez pas faire cela avec des clés primaires (enfin, vous le pouvez, mais cela peut être pénible).
Merci @VahiD pour les éclaircissements.
la source
L'utilisation d'identifiants d'incrémentation automatique peut entraîner la fuite d'informations sur votre activité. Si vous exploitez un magasin et utilisez
order_id
pour identifier publiquement un achat, tout le monde peut connaître votre nombre mensuel de ventes à l'aide d'une simple arithmétique.la source
Une autre chose avec la façon dont les GUID sont générés. mrdenny a correctement fait remarquer que même si newsequentialid () est utilisé, le redémarrage des instances fait en sorte que les nouvelles valeurs commencent par les "trous" laissés dans le traitement précédent. Une autre chose qui affecte les GUID "séquentiels" est la carte réseau. Si je me souviens bien, l'UID de la carte réseau est utilisé dans le cadre de l'algorithme GUID. Si une carte réseau est remplacée, rien ne garantit que l'UID sera une valeur plus élevée pour conserver l'aspect séquentiel des choses. Je ne sais pas non plus comment plusieurs cartes d'interface réseau peuvent affecter l'affectation de valeurs à l'aide de l'algorithme.
Juste une pensée et j'espère que je me souviens bien. Passez une bonne journée!
la source
Utilise les deux
Utilisez int / Bigint pour la clé primaire car il est facile à gérer et à utiliser comme relation de clé étrangère.
Mais lier une colonne au GUID afin que chaque ligne ait également une colonne unique
la source
int
etguid
, comme vous le suggérez dans votre réponse. Et puis, je ne parlais pas d'expliquer votre suggestion juste à moi - je voulais simplement mettre à jour votre réponse . Au fait, savez-vous qu'un autre répondant a déjà suggéré la même chose (plus ou moins) à vous ?