Je ne vois pas de réponse qui souligne (ce que je considère comme) le point vraiment fondamental - à savoir, qu'une clé primaire est ce qui garantit que vous n'obtiendrez pas deux entrées dans le tableau pour la même entité du monde réel (comme modélisé dans la base de données). Cette observation permet d'établir ce qui est bon et ce qui est de mauvais choix pour la clé primaire.
Par exemple, dans un tableau de noms et de codes d'état (américains), le nom ou le code peut être la clé primaire - ils constituent deux clés candidates différentes, et l'une d'entre elles (normalement la plus courte - le code) est choisie comme clé clé primaire. Dans la théorie des dépendances fonctionnelles (et des dépendances de jointure - 1NF à 5NF - ce sont les clés candidates qui sont cruciales plutôt qu'une clé primaire.
Pour un contre-exemple, les noms humains font généralement un mauvais choix pour la clé primaire. Il y a beaucoup de gens qui s'appellent "John Smith" ou d'autres noms similaires; même en tenant compte des prénoms (rappelez-vous: tout le monde n'en a pas - par exemple, je n'en ai pas), il y a beaucoup de possibilités de duplication. Par conséquent, les gens n'utilisent pas de noms comme clés primaires. Ils inventent des clés artificielles telles que le numéro de sécurité sociale (SSN) ou le numéro d'employé et les utilisent pour désigner l'individu.
Une clé primaire idéale est courte, unique, mémorable et naturelle. Parmi ces caractéristiques, l'unicité est obligatoire; les autres doivent fléchir compte tenu des contraintes des données du monde réel.
Lorsqu'il s'agit de déterminer la clé primaire d'une table donnée, vous devez donc regarder ce que représente cette table. Quel ensemble ou ensembles de valeurs de colonne dans la table identifie de manière unique chaque ligne de la table? Ce sont les clés candidates. Maintenant, si chaque clé candidate se compose de 4 ou 5 colonnes, vous pouvez décider que celles-ci sont trop maladroites pour constituer une bonne clé primaire (principalement pour des raisons de brièveté). Dans ces circonstances, vous pouvez introduire une clé de substitution - un nombre généré artificiellement. Très souvent (mais pas toujours) un simple entier de 32 bits est suffisant pour la clé de substitution. Désignez ensuite cette clé de substitution comme clé primaire.
Cependant, vous devez toujours vous assurer que les autres clés candidates (car la clé de substitution est également une clé candidate, ainsi que la clé primaire choisie) sont toutes conservées en tant qu'identifiant unique - normalement en plaçant une contrainte unique sur ces ensembles de colonnes.
Parfois, les gens ont du mal à identifier ce qui rend une ligne unique, mais il devrait y avoir quelque chose à faire, car simplement répéter une information ne la rend pas plus vraie. Et si vous ne faites pas attention et que vous obtenez deux (ou plus) lignes censées stocker les mêmes informations, et que vous devez ensuite mettre à jour les informations, il existe un danger (surtout si vous utilisez des curseurs) que vous ne mettiez à jour qu'une seule ligne. plutôt que chaque ligne, de sorte que les lignes ne sont pas synchronisées et personne ne sait quelle ligne contient les informations correctes.
C'est une vision assez dure, à certains égards.
Je n'ai aucun problème particulier avec l'utilisation d'un GUID quand ils sont nécessaires, mais ils ont tendance à être gros (comme dans 16-64 octets), et ils sont utilisés trop souvent. Très souvent, une valeur de 4 octets parfaitement bonne suffit. L'utilisation d'un GUID où une valeur de 4 octets suffirait gaspille de l'espace disque et ralentit même l'accès indexé aux données car il y a moins de valeurs par page d'index, donc l'index sera plus profond et plus de pages devront être lues pour accéder au information.