214 votes

Comment créer correctement des clés primaires composites - MYSQL

Voici une simplification excessive d'une configuration intense avec laquelle je travaille. table_1 y table_2 Les deux ont des clés primaires substitutives auto-incrémentées comme ID. info est un tableau qui contient des informations sur les deux table_1 y table_2 .

table_1 (id, field)  
table_2 (id, field, field)
info ( ???, field)

J'essaye de décider si je dois faire de la clé primaire de info un composite des ID de table_1 y table_2 . Si je devais le faire, laquelle de ces propositions est la plus logique ?
(dans cet exemple, je combine l'ID 11209 avec l'ID 437).

INT(9) 11209437 (je peux imaginer pourquoi c'est mauvais)
VARCHAR (10) 11209-437
DECIMAL (10,4) 11209.437

Ou quelque chose d'autre ?

Serait-il possible de l'utiliser comme clé primaire dans une base de données MYSQL MYISAM ?

0 votes

402voto

AlexCuse Points 9823

J'utiliserais une clé composite (multi-colonnes).

CREATE TABLE INFO (
    t1ID INT,
    t2ID INT,
    PRIMARY KEY (t1ID, t2ID)
) 

De cette façon, vous pouvez avoir t1ID et t2ID comme clés étrangères pointant vers leurs tables respectives également.

2 votes

Oh wow, c'est donc comme ça qu'on fait une clé composite ! On dirait que je n'ai pas du tout compris le concept. Merci ! Donc quelque chose comme ça est entièrement destiné à l'indexation, n'est-ce pas ? C'est-à-dire que je ne pourrais pas référencer un enregistrement en utilisant cette clé composite, je devrais toujours faire une recherche de type UPDATE info ... WHERE t1ID=11209 AND t2ID=437 ?

2 votes

Correct. Bien que puisque les deux colonnes doivent être uniques, où t1ID = 11209 serait probablement suffisant.

47 votes

@AlexCuse le combinaison des deux colonnes est unique, mais pour t1ID = 11209, il peut y avoir un nombre quelconque de t2ID.

24voto

wmorse Points 81

Je ne ferais pas de la clé primaire de la table "info" un composite des deux valeurs des autres tables.

D'autres peuvent mieux expliquer les raisons, mais il est difficile d'avoir une colonne qui est en fait composée de deux éléments d'information. Que faire si vous voulez trier sur l'ID de la deuxième table pour une raison quelconque ? Et si vous voulez compter le nombre de fois qu'une valeur de l'une ou l'autre table est présente ?

Je les garderais toujours comme deux colonnes distinctes. Vous pourriez utiliser une clé primaire à deux colonnes dans mysql ...PRIMARY KEY(id_a, id_b)... mais je préfère utiliser un index unique à deux colonnes, et avoir un champ de clé primaire auto-incrémenté.

1 votes

Vous avez tout à fait raison de garder des colonnes distinctes. Je ne savais pas que l'on pouvait avoir un index unique à deux colonnes et je pense que c'est une bonne option pour moi. Puis-je vous demander pourquoi vous préférez garder la clé primaire en auto-incrément ?

3 votes

Je n'ai pas de raisons vraiment convaincantes, et je concède que c'est un point de discorde entre moi et certains de mes collègues, parce qu'il est plus économique d'avoir moins de colonnes. Je trouve qu'il est plus facile d'écrire des jointures sur une seule clé étrangère. Parfois, la signification de ces tables "Mappings entre deux tables" devient aussi importante que les tables originales, et sa clé primaire devient une colonne de clé étrangère dans d'autres tables encore.

0 votes

Merci. Je pense que ce que vous dites a beaucoup de sens et je vais l'essayer comme un index unique à deux colonnes + clé primaire auto-incrémentée.

20voto

Ritabrata Gautam Points 1151

La syntaxe est CONSTRAINT constraint_name PRIMARY KEY(col1,col2,col3) par exemple : :

CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)

l'exemple ci-dessus fonctionnera si vous l'écrivez pendant que vous créez la table par exemple : :

CREATE TABLE person (
   P_Id int ,
   ............,
   ............,
   CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
);

pour ajouter cette contrainte à une table existante, vous devez suivre la syntaxe suivante

ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY (P_Id,LastName)

5voto

KiloVoltaire Points 21

En dehors des préférences personnelles de conception, il existe des cas où l'on souhaite utiliser des clés primaires composites. Les tables peuvent avoir deux champs ou plus qui fournissent une combinaison unique, et pas nécessairement par le biais de clés étrangères.

À titre d'exemple, chaque État américain possède un ensemble unique de districts du Congrès. Si plusieurs États peuvent avoir individuellement un CD-5, il n'y aura jamais plus d'un CD-5 dans chacun des 50 États, et vice versa. Par conséquent, la création d'un champ de numérotation automatique pour le CD-5 du Massachusetts serait redondante.

Si la base de données pilote une page web dynamique, l'écriture d'un code permettant d'interroger une combinaison de deux champs pourrait être beaucoup plus simple que l'extraction/la resoumission d'une clé autonumérotée.

Donc, bien que je ne réponde pas à la question originale, j'apprécie certainement la réponse directe d'Adam.

4voto

Adam Penny Points 21

Les clés primaires composites sont ce que vous voulez lorsque vous voulez créer une relation de plusieurs à plusieurs avec une table de faits. Par exemple, vous pouvez avoir un pack de location de vacances qui comprend un certain nombre de propriétés. D'autre part, la propriété pourrait également être disponible dans le cadre de plusieurs forfaits de location, soit seule, soit avec d'autres propriétés. Dans ce scénario, vous établissez la relation entre la propriété et le pack de location à l'aide d'une table de faits propriété/package. L'association entre un bien et un pack sera unique, vous ne ferez jamais de jointure en utilisant property_id avec la table des biens et/ou package_id avec la table des packs. Chaque relation est unique et une clé auto_incrémentée est redondante car elle ne figurera dans aucune autre table. La définition d'une clé composite est donc la solution.

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