Voici une simplification excessive d'une configuration intense avec laquelle je travaille. table_1
et les table_2
deux ont des clés primaires de substitution à incrémentation automatique comme ID. info
est une table qui contient des informations sur table_1
et sur table_2
.
table_1 (id, field)
table_2 (id, field, field)
info ( ???, field)
J'essaie de décider si je devrais créer la clé primaire d' info
un composite des ID de table_1
et table_2
. Si je devais faire cela, lequel de ces éléments a le plus de sens?
(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 autre chose?
Serait-ce bien de l'utiliser comme clé primaire sur une base de données MYSQL MYISAM?
Réponses:
J'utiliserais une clé composite (multi-colonnes).
De cette façon, vous pouvez également avoir t1ID et t2ID comme clés étrangères pointant vers leurs tables respectives.
la source
UPDATE info ... WHERE t1ID=11209 AND t2ID=437
?Je ne ferais pas de la clé primaire de la table "info" un composite des deux valeurs d'autres tables.
D'autres peuvent mieux articuler les raisons, mais il est faux d'avoir une colonne qui est vraiment composée de deux informations. Que faire si vous souhaitez trier l'ID de la deuxième table pour une raison quelconque? Que faire si vous souhaitez compter le nombre de fois qu'une valeur de l'une ou l'autre table est présente?
Je garderais toujours ces deux colonnes distinctes. Vous pouvez 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 à incrémentation automatique.
la source
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:
pour ajouter cette contrainte à une table existante, vous devez suivre la syntaxe suivante
la source
Supposons que vous ayez déjà créé une table, vous pouvez maintenant utiliser cette requête pour créer une clé primaire composite
la source
Outre les préférences de conception personnelles, 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 au moyen de clés étrangères.
À titre d'exemple, chaque État américain a un ensemble de districts du Congrès uniques. Alors que de nombreux états peuvent posséder individuellement un CD-5, il n'y en aura jamais plus d'un CD-5 dans l'un des 50 états, et vice versa. Par conséquent, la création d'un champ de numérotation automatique pour le Massachusetts CD-5 serait redondante.
Si la base de données gère une page Web dynamique, écrire du code à interroger sur une combinaison de deux champs peut être beaucoup plus simple que d'extraire / de resoumettre une clé numérotée automatiquement.
Donc, même si je ne réponds pas à la question initiale, j'apprécie certainement la réponse directe d'Adam.
la source
Les clés primaires composites sont ce que vous voulez lorsque vous souhaitez créer une relation plusieurs à plusieurs avec une table de faits. Par exemple, vous pouvez avoir un forfait 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 d'un certain nombre de forfaits de location, seule ou avec d'autres propriétés. Dans ce scénario, vous établissez la relation entre la propriété et le package de location avec une table de faits propriété / package. L'association entre une propriété et un package sera unique, vous ne joindrez jamais en utilisant property_id avec la table de propriétés et / ou package_id avec la table de package. Chaque relation est unique et une clé auto_increment est redondante car elle ne figurera dans aucune autre table. La réponse est donc la définition de la clé composite.
la source
la source
@AlexCuse Je voulais ajouter ceci comme commentaire à votre réponse mais j'ai abandonné après plusieurs tentatives infructueuses pour ajouter des nouvelles lignes dans les commentaires.
Cela dit, t1ID est unique dans la table_1 mais cela ne le rend pas non plus unique dans la table INFO.
Par exemple:
Table_1 a:
Champ Id
1 A
2 B
Table_2 a:
Champ Id
1 X
2 Y
INFO peut alors avoir:
t1ID t2ID champ
1 1 certains
1 2 données
2 1 dans chaque ligne
2 2
Ainsi, dans la table INFO pour identifier de manière unique une ligne, vous avez besoin à la fois de t1ID et de t2ID
la source