55 votes

Quand utiliser une clé primaire auto-incrémentée et quand ne pas l'utiliser?

Je suis à essayer de comprendre les "meilleures pratiques" pour décider si ou de ne pas ajouter une auto-incrémentation entier comme la clé primaire d'une table.

Disons que j'ai une table contenant des données sur les éléments chimiques. Le numéro atomique de chaque élément est unique et ne changera jamais. Ainsi, plutôt que d'utiliser un auto-incrémentation entier pour chaque colonne, il serait probablement plus judicieux de n'utiliser que le numéro atomique, correct?

Serait la même si j'avais une table de livres? Dois-je utiliser de l'ISBN ou de l'auto-incrémentation entier pour la clé primaire? Ou une table de salariés contenant chacun SSN?

16voto

Pablo Santa Cruz Points 73944

Il y a beaucoup de déjà abordé des questions sur un Débordement de Pile qui peut vous aider avec vos questions. Voir ici, ici, ici et ici.

Le terme que vous devriez être à la recherche pour: surrogated clés.

Espérons que cela aide.

10voto

Jay Points 14781

C'est une question très débattue, avec beaucoup d'émotion sur les deux côtés.

À mon humble avis, si il y a un bon, utilisable clé naturelle disponible -- comme un ISBN -- je l'utilise. Je vais stocker dans la base de données de toute façon. Oui, une clé naturelle est généralement plus grand qu'un entier auto-incrément de la clé, mais je pense que ce problème est exagérée. L'espace disque est bon marché aujourd'hui. Je serais vous inquiétez plus au sujet de ce que ça prend plus de temps à traiter. Si vous parlions d'une 80 octets de texte champ comme clé primaire, je dirais que non. Mais si vous songez à utiliser un 10 octets ISBN au lieu de 8 octets grand entier, je ne peux pas imaginer qu'apporte beaucoup de performances.

Parfois, il y a un avantage de performance à des clés naturelles. Supposons, par exemple, je veux savoir combien d'exemplaires du livre ont été vendus. Je n'aime pas parler de toutes les données à partir du Livre d'enregistrement maître. Si la clé primaire est l'ISBN, je pourrais écrire tout simplement "select count(*) de vente où isbn='143573338X'". Si j'ai utilisé un auto-incrémentation de la clé, je dois faire une jointure pour rechercher l'isbn, et la requête devient plus complexe et plus lent, comme "select count(*) from livre adhérer à la vente en utilisant (bookid) où isbn='143573338X'". (Et je peux vous assurer que ce particulier ISBN est de mon livre, le nombre de vente des enregistrements est très petite, donc faire la jointure et la lecture d'un enregistrement supplémentaire est un grand pourcentage de la différence!)

Un autre avantage de la lumière de touches est que lorsque vous avez à travailler sur la base de données et que vous regardez les dossiers que vous référer à ce tableau par la clé, il est facile de voir ce dossier, ils parle.

D'autre part, si il n'est pas bon, tout naturellement la clé, ne pas essayer de bricoler un fou. J'ai vu des gens essayer de faire une clé naturelle par la concaténation de l'ensemble des 6 premières lettres des clients prénom, son année de naissance et son code postal, et puis prier pour que qui sera unique. Ce genre de bêtise est juste faire des problèmes pour vous-même. Souvent, les gens finissent par prendre sur un numéro de séquence pour s'assurer qu'il est unique, de toute façon, et à ce point, pourquoi s'embêter? Pourquoi ne pas simplement utiliser le numéro de séquence par lui-même comme la clé?

4voto

Craig Warren Points 780

Vous avez l'idée là.

Auto-incrément doit être utilisé comme une clé unique lorsque aucune clé unique existe déjà sur les éléments, vous êtes à la modélisation. Donc, pour les Éléments, vous pouvez utiliser le Numéro Atomique ou des Livres le numéro ISBN.

Mais si les gens sont postant des messages sur un forum, alors ces besoin d'un IDENTIFIANT unique, mais ne contiennent pas d'une nature si nous attribuer le numéro suivant de la liste.

Il est préférable d'utiliser des clés naturelles si possible, n'oubliez pas de rendre le champ comme clé primaire, et de s'assurer qu'elle est indexée à la performance

3voto

Rob Goodwin Points 1243

Le principal problème que j'ai vu avec l'auto incrémentation d'un entier approche est lorsque vous exportez vos données pour mettre dans une autre instance db, ou même des archives et de la restauration. Parce que l'entier a aucun rapport avec les données qu'il référence, il n'existe aucun moyen de déterminer si vous avez des doublons lors de la restauration ou de l'ajout de données à une base de données existante. Si vous ne voulez pas de relation entre les données contenues dans la ligne et le PK, je voudrais juste utiliser un guid. Pas très convivial pour regarder, mais il résout le problème ci-dessus.

2voto

Cat Man Do Points 11771

Je suis à essayer de comprendre les "meilleures pratiques" pour décider si ou de ne pas ajouter une auto-incrémentation entier comme la clé primaire d'une table.

L'utiliser comme un identifiant unique à un ensemble de données où les PKey ne fait pas partie de l'utilisateur de données gérées.

Disons que j'ai une table contenant des données sur les éléments chimiques. Le numéro atomique de chaque élément est unique et ne changera jamais. Ainsi, plutôt que d'utiliser un auto-incrémentation entier pour chaque colonne, il serait probablement plus judicieux de n'utiliser que le numéro atomique, correct?

Oui.

Serait la même si j'avais une table de livres? Dois-je utiliser de l'ISBN ou de l'auto-incrémentation entier pour la clé primaire? Ou une table de salariés contenant chacun SSN?

Isbn/SS#s sont affectés par des tiers et, en raison de leur grande taille de stockage serait une très moyen inefficace pour identifier de manière unique une ligne. Rappelez-vous, PKeys sont utiles lorsque vous rejoignez les tables. Pourquoi utiliser un grand format de données comme un ISBN qui serait nombreux textuelle des personnages que l'identifiant Unique d'un petit et compact format Entier est disponible?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X