190 votes

Clés de substitution ou clés naturelles/professionnelles

Nous y revoilà, le vieil argument est toujours d'actualité...

Serait-il préférable d'avoir une clé de gestion comme clé primaire ou plutôt un identifiant de substitution (c'est-à-dire une identité SQL Server) avec une contrainte unique sur le champ de la clé de gestion ?

Veuillez fournir des exemples ou des preuves à l'appui de votre théorie.

25 votes

@Joachim Sauer : Un argument sur la question de savoir si une chose est subjective peut lui-même être subjectif, sans que cela soit lié d'une quelconque manière à l'objectivité ou à la subjectivité de la chose en question. A moins que vous ne soyez prêt à énoncer les critères objectifs exacts qui font qu'une chose est objective. Il y a des choses appelées "concepts ouverts", comme le nombre de poils nécessaires pour faire une barbe. On peut objectivement dire qu'une personne qui n'a pas de poils au menton n'a pas de barbe, et qu'une personne qui a 5 000 poils d'un pouce de long a une barbe, mais quelque part au milieu, un jugement subjectif est nécessaire pour faire une détermination objective.

1 votes

@Manrico : il suffit de se poser la question suivante : si je n'utilise pas de clé de substitution, ma clé primaire sera-t-elle toujours immuable ? Si la réponse est non, alors vous devriez sérieusement envisager l'utilisation d'une clé de substitution. De même, si la clé primaire est composée, même partiellement, d'entrées utilisateur, vous devez envisager d'utiliser une clé de substitution. Pourquoi ? En raison du risque d'anomalies dans les données.

1 votes

@TylerRick Mais ce n'est pas une bonne question. Elle demande une solution applicable à toutes les situations, alors qu'il n'y en a manifestement pas, comme le prouve la "guerre de religion" dont l'auteur de la question est parfaitement conscient (citation : "Here we go again, the old argument still arises..."). Au lieu de se demander si le monde a changé et si l'on a enfin trouvé une raison convaincante de choisir un camp à tout moment, il vaut mieux poser cette question encore et encore pour chaque situation concrète, et poster sur SO quand on n'est pas sûr. Cela ne fait que susciter le dogmatisme.

5voto

user7658 Points 428

Dans la mesure du possible, utilisez toujours une clé de substitution à une seule colonne. Les jointures ainsi que les insertions/mises à jour/suppressions sont ainsi beaucoup plus propres, car vous n'êtes responsable que du suivi d'un seul élément d'information pour maintenir l'enregistrement.

Ensuite, si nécessaire, empilez vos clés de gestion sous forme de contraintes ou d'index uniques. Vous conserverez ainsi l'intégrité de vos données.

La logique commerciale/les clés naturelles peuvent changer, mais la clé physique d'une table ne doit JAMAIS changer.

5voto

Stefanos Kargas Points 1810

Cas 1 : Votre table est un tableau de consultation avec moins de 50 enregistrements (50 types)

Dans ce cas, utilisez des clés nommées manuellement, en fonction de la signification de chaque enregistrement .

Par exemple :

Table: JOB with 50 records
CODE (primary key)       NAME               DESCRIPTION
PRG                      PROGRAMMER         A programmer is writing code
MNG                      MANAGER            A manager is doing whatever
CLN                      CLEANER            A cleaner cleans
...............
joined with
Table: PEOPLE with 100000 inserts

foreign key JOBCODE in table PEOPLE
looks at
primary key CODE in table JOB

Cas 2 : Votre table est un tableau avec des milliers d'enregistrements

Utilisation clés de substitution/auto-incrément .

Par exemple :

Table: ASSIGNMENT with 1000000 records
joined with
Table: PEOPLE with 100000 records

foreign key PEOPLEID in table ASSIGNMENT
looks at
primary key ID in table PEOPLE (autoincrement)

Dans le premier cas :

  • Vous pouvez sélectionner tous les programmeurs dans le tableau PEOPLE sans utilisation de la jointure avec la table JOB mais juste avec : SELECT * FROM PEOPLE WHERE JOBCODE = 'PRG'

Dans le second cas :

  • Les requêtes de votre base de données sont plus rapides parce que votre clé primaire est un nombre entier.
  • Vous n'avez pas besoin de vous préoccuper de trouver la prochaine clé unique car la base de données elle-même vous donne le prochain autoincrément.

4voto

Santiago Cepas Points 2127

Dans le cas d'un entrepôt de données, je pense qu'il est préférable de suivre la voie de la clé de substitution. Deux raisons à cela :

  • Vous êtes indépendant du système source, et les changements qui y sont apportés - par exemple un changement de type de données - ne vous affecteront pas.
  • Votre DW aura besoin de moins d'espace physique puisque vous n'utiliserez que des types de données entiers pour vos clés de substitution. Vos index fonctionneront également mieux.

4voto

David Thornley Points 39051

Les clés de substitution peuvent être utiles lorsque les informations commerciales peuvent changer ou être identiques. Après tout, il n'est pas nécessaire que les noms d'entreprise soient uniques dans tout le pays. Supposons que vous traitiez avec deux entreprises nommées Smith Electronics, l'une au Kansas et l'autre au Michigan. Vous pouvez les distinguer par leur adresse, mais celle-ci changera. Même l'État peut changer ; que se passe-t-il si Smith Electronics de Kansas City, Kansas, déménage de l'autre côté de la rivière à Kansas City, Missouri ? Il n'existe aucun moyen évident de distinguer ces entreprises à l'aide d'informations clés naturelles, c'est pourquoi une clé de substitution est très utile.

Pensez à la clé de substitution comme à un numéro ISBN. En général, on identifie un livre par son titre et son auteur. Cependant, j'ai deux livres intitulés "Pearl Harbor" par H. P. Willmott, et il s'agit bien de livres différents, et pas seulement d'éditions différentes. Dans ce cas, je pourrais me référer à l'aspect des livres, ou à l'édition la plus ancienne par rapport à la plus récente, mais c'est aussi bien d'avoir l'ISBN pour m'y référer.

2voto

Charles Graham Points 8132

Il s'agit de l'un des cas où une clé de substitution peut être utilisée à peu près à n'importe quel moment. toujours a du sens. Dans certains cas, vous pouvez choisir ce qui est le mieux pour la base de données ou ce qui est le mieux pour votre modèle d'objet, mais dans les deux cas, l'utilisation d'une clé ou d'un GUID sans signification est une meilleure idée. L'indexation est plus facile et plus rapide, et l'identité de l'objet ne change pas.

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