web-dev-qa-db-fra.com

Pourquoi utiliser plusieurs colonnes comme clés primaires (clé primaire composite)

Cet exemple est pris de w3schools .

CREATE TABLE Persons
(
    P_Id int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255),
    CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
)

Je crois comprendre que les deux colonnes ensemble (P_Id et LastName) représentent une clé primaire pour la table Persons. Est-ce correct?

  • Pourquoi quelqu'un voudrait-il utiliser plusieurs colonnes comme clés primaires au lieu d'une seule colonne?
  • Combien de colonnes peuvent être utilisées ensemble en tant que clé primaire dans une table donnée?
100
rockbala

Votre compréhension est correcte.

Vous feriez cela dans de nombreux cas. Un exemple est dans une relation comme OrderHeader et OrderDetail. La PK dans OrderHeader pourrait être OrderNumber. La PK dans OrderDetail pourrait être OrderNumber ET LineNumber. Si c'était l'un ou l'autre, ce ne serait pas unique, mais la combinaison des deux est garantie unique.

L'alternative consiste à utiliser une clé primaire générée (non intelligente), par exemple dans ce cas OrderDetailId. Mais vous ne verriez pas toujours la relation aussi facilement. Certaines personnes préfèrent un sens; certains préfèrent l'inverse.

111
MJB

L'utilisation des tables d'association est un autre exemple de clé primaire composée. Supposons que vous disposiez d'une table de personnes contenant un ensemble de personnes et d'une table de groupes contenant un ensemble de groupes. Maintenant, vous voulez créer une relation plusieurs à plusieurs sur une personne et un groupe. Cela signifie que chaque personne peut appartenir à plusieurs groupes. Voici à quoi ressemblerait la structure de la table avec une clé primaire composée.

Create Table Person(
PersonID int Not Null,
FirstName varchar(50),
LastName varchar(50),
Constraint PK_Person PRIMARY KEY (PersonID))

Create Table Group (
GroupId int Not Null,
GroupName varchar(50),
Constraint PK_Group PRIMARY KEY (GroupId))

Create Table GroupMember (
GroupId int Not Null,
PersonId int Not Null,
CONSTRAINT FK_GroupMember_Group FOREIGN KEY (GroupId) References Group(GroupId),
CONSTRAINT FK_GroupMember_Person FOREIGN KEY (PersonId) References Person(PersonId),
CONSTRAINT PK_GroupMember PRIMARY KEY (GroupId, PersonID))
24
John Hartsock

L'exemple W3Schools ne dit pas quand vous devez utiliser des clés primaires composées, mais donne uniquement un exemple de syntaxe utilisant le même tableau d'exemple que pour les autres clés.

Leur choix d’exemple vous induit peut-être en erreur en combinant une clé sans signification (P_Id) et une clé naturelle (LastName). Ce choix étrange de clé primaire indique que les lignes suivantes sont valides selon le schéma et sont nécessaires pour identifier de manière unique un étudiant. Intuitivement, cela n'a pas de sens.

1234     Jobs
1234     Gates

Lectures supplémentaires: Le grand débat clé-clé ou seulement Google meaningless primary keys ou même parcourir ceci SO question

FWIW - Mon objectif principal est d'éviter les clés primaires multicolonnes, d'utiliser un seul champ id généré (clé de substitution) comme clé primaire et d'ajouter des contraintes (uniques) supplémentaires si nécessaire.

9
Robert Paulson

Vous utilisez une clé composée (une clé avec plusieurs attributs) chaque fois que vous souhaitez vous assurer de l'unicité d'une combinaison de plusieurs attributs. Une clé d'attribut unique ne permettrait pas d'obtenir la même chose.

3
nvogel

Oui, ils forment tous les deux la clé primaire. Surtout dans les tables où vous n'avez pas de clé de substitution , il peut être nécessaire de spécifier plusieurs attributs en tant qu'identificateur unique pour chaque enregistrement (exemple incorrect: une table avec à la fois un nom et un nom peut exiger que leur combinaison soit unique).

2
ig0774

Plusieurs colonnes dans une clé vont, en général, fonctionner plus mal qu'une clé de substitution. Je préfère avoir une clé de substitution, puis un index unique sur une clé multicolonne. De cette façon, vous pouvez obtenir de meilleures performances et l'unicité requise est maintenue. Et mieux encore, lorsque l'une des valeurs de cette clé change, vous ne devez pas également mettre à jour un million d'entrées enfants dans 215 tables enfants.

2
HLGEM

Votre deuxième question

Combien de colonnes peuvent être utilisées ensemble en tant que clé primaire dans une table donnée?

est spécifique à l'implémentation: il est défini dans le SGBD réel utilisé.[1], [2], [3] Vous devez vérifier les spécifications techniques du système de base de données que vous utilisez. Certains sont très détaillés, d'autres non. Rechercher sur le Web à propos de telles limitations peut être difficile car la terminologie varie. Le terme de clé primaire composite devrait être obligatoire;)

Si vous ne trouvez pas d'informations explicites, essayez de créer une base de données de test pour vous assurer que vous pouvez vous attendre à un traitement stable (et spécifique) des violations de limites (à prévoir). Veillez à obtenir les bonnes informations à ce sujet: parfois, les limites sont accumulées, et vous verrez des résultats différents avec différentes présentations de base de données.


2
Wolf

L'utilisation d'une clé primaire sur plusieurs tables est pratique lorsque vous utilisez une table intermédiaire dans une base de données relationnelle.

Je vais utiliser une base de données que j'ai déjà créée pour un exemple et plus précisément trois tables à l'intérieur de cette table. J'ai créé une base de données pour un webcomic il y a quelques années. Une des tables s'appelait "bandes dessinées" - une liste de toutes les bandes dessinées, leurs titres, le nom du fichier image, etc. La clé primaire était "comicnum".

La seconde table était composée de "personnages", leurs noms et une brève description. La clé primaire était sur "charname".

Étant donné que chaque bande dessinée, à quelques exceptions près, comportait plusieurs caractères et que chaque caractère figurait dans plusieurs bandes dessinées, il était impossible de placer une colonne dans "caractères" ou "bandes dessinées" pour refléter cela. Au lieu de cela, j'ai créé un troisième table s'appelait "comicchars", et c’était une liste des personnages dans lesquels figuraient des bandes dessinées. Comme cette table a essentiellement joint les deux tables, il ne lui fallait que deux colonnes: charname et comicnum, et la clé primaire était sur les deux.

1
Mr. Initial Man

Nous créons des clés primaires composites pour garantir les valeurs de colonne d'unicité qui composent un seul enregistrement. C’est une contrainte qui permet d’empêcher l’insertion de données qui ne doivent pas être dupliquées.

i.e: Si tous les numéros d'étudiant et de certificat de naissance sont attribués de manière unique à une seule personne. Dans ce cas, il serait judicieux de définir comme clé primaire pour une personne une composition composée d'un identifiant d'étudiant et d'un numéro d'acte de naissance, car cela vous éviterait d'insérer accidentellement deux personnes possédant un identifiant d'étudiant différent et le même acte de naissance.

0
kiwicomb123