Si nous avions une table comme celle-ci:
Livres (faire semblant que "ISBN" n'existe pas)
On pourrait faire valoir que {Auteur, Titre, Édition} pourrait être un candidat/clé primaire.
Qu'est-ce qui détermine si la clé candidate/primaire doit être {Auteur, Titre, Édition} ou si une colonne ID doit être utilisée, avec {Auteur, Titre, Édition} une contrainte d'index/clé unique?
Tout comme
mieux, ou:
où {Auteur, Titre, Édition} est un index/contrainte unique supplémentaire?
Supposons que {Author,Title,Edition}
Identifie de façon unique un livre, puis ce qui suit tient:
Il s'agit d'une (super) clé - identifie de façon unique un tuple (ligne).
Il est irréductible - la suppression de l'une des colonnes n'en fait plus une clé.
Il s'agit d'une clé candidate - une clé irréductible est une clé candidate.
Considérons maintenant l'ID (entier)
Je peux penser que la clé de table Book
apparaîtra dans quelques autres tables comme une clé étrangère et aussi dans quelques index. Ainsi, cela prendra un peu d'espace - disons trois colonnes x 40 caractères (ou peu importe ...) - dans chacune de ces tables plus dans les index correspondants.
Afin de rendre ces "autres" tables et index plus petits, je peux ajouter une colonne d'entier unique à la table Book
à utiliser comme clé qui sera référencée comme clé étrangère. Dites quelque chose comme:
alter table `Book` add `BookID` integer not null identity;
Avec BookID
étant (doit être) également unique, la table Book
a maintenant deux clés candidates.
Maintenant, je peux sélectionner le BookID
comme clé primaire.
alter table Book add constraint pk_Book primary key (BookID);
Cependant, le {Author,Title,Edition}
doit rester une clé (unique) afin de empêcher quelque chose comme ceci:
BookID Author Title Edition
-----------------------------------------------
1 C.J.Date Database Design 1
2 C.J.Date Database Design 1
Pour résumer, l'ajout de BookID
- et le choix comme primaire - n'a pas empêché {Author,Title,Edition}
D'être une clé (candidate). Il doit toujours avoir sa propre contrainte unique et généralement l'index correspondant.
Notez également que du point de vue de la conception, cette décision a été prise au "niveau physique". En général, au niveau logique de la conception, ce ID
n'existe pas - il a été introduit lors de l'examen des tailles de colonne et des index. Le schéma physique était donc dérivé du schéma logique. Selon la taille de la base de données, le SGBDR et le matériel utilisé, aucun de ces raisonnements de taille peut avoir un effet mesurable - donc l'utilisation de {Author,Title,Edition}
Comme PK peut être parfaitement bien conçue - jusqu'à preuve du contraire.
En général, vous ne voulez pas que la clé primaire change de valeur. C'est pourquoi des clés primaires aveugles ou de substitution sont utilisées.
Supposons que vous ayez créé votre table Book avec Author dans le cadre de la clé primaire.
Supposons que vous ayez découvert après environ un an que vous avez mal orthographié "Ray Bradbury". Ou pire encore, vous avez mal orthographié "Rachael Bloom". Imaginez simplement combien de lignes de base de données vous devriez modifier pour corriger l'orthographe. Imaginez simplement combien de références d'index doivent être modifiées.
Cependant, si vous avez une table Author avec une clé de substitution, vous n'avez qu'à corriger une ligne. Aucun index ne doit être modifié.
Enfin, les noms de table de base de données sont généralement au singulier (Livre) plutôt qu'au pluriel (Livres).
Une autre bonne raison d'utiliser le scénario de clé primaire de substitution est de savoir si la contrainte d'unicité devrait changer à l'avenir (par exemple, l'ISBN doit être ajouté pour rendre un livre unique). La recomposition de vos données sera beaucoup plus facile.
Il existe de nombreux articles à ce sujet. Les problèmes avec la clé composite dans votre cas:
Il serait également bon de normaliser vos données et de stocker juste un ID à l'auteur comme (dasblinkenlight) suggéré. Dans le pire des cas, il/elle changera son nom (par exemple, elle se marie et elle aime son nouveau nom).