2013-03-16 5 views
1

Je souhaite avoir une table de correspondance qui relie deux des mêmes éléments. Dites que j'ai une table «Personne» et je veux rechercher la relation entre deux personnes. Je vais avoir la colonne un de la recherche soit 'PersonId1' et la colonne deux soit 'PersonId2' et la troisième colonne soit 'Relationship'. Comme la relation va dans les deux sens, je n'ai pas besoin d'avoir des enregistrements en double avec le PlayerId commuté. Est-il possible de faire en sorte que mysql impose l'unicité sur les combinaisons PlayerId1 et PlayerId2, quel que soit l'ordre dans lequel elles se trouvent?Clé primaire composite Mysql

Est-ce que cela a du sens?

Répondre

0

Vous voulez que vous vouliez avoir un enregistrement de ligne unique de PersonID1 et PersonID2 Colonne (indépendamment de la colonne Relationship)? Si tel est le cas, vous pouvez utiliser la touche Composite (touche multi-colonnes).

Voici un exemple:

CREATE TABLE Person (
    PersonId1 INT, 
    PersonId2 INT, 
    PRIMARY KEY (PersonId1, PersonId2) 
) 
+0

Oui, mais si PersonId1 est 9 et 10 est PersonId2 dans un enregistrement mais dans un autre PersonId1 est 10 et personId2 9. Cela redéfinit la même relation. Je me demandais s'il y avait un moyen d'empêcher cela. – ForeverNoobie

+0

Si la commande est votre cas, vous pouvez utiliser un seul champ ayant le type de données 'varchar', puis concaténer' PersonId1' et 'PersonId2'. Et n'oubliez pas de le faire comme votre clé primaire. –

+0

Vous devez essayer de les insérer par paires ou cela ne fonctionnera pas. 'INSERT INTO relation (PersonId1, PersonId2) VALUES (9,10), (10,9)' et la transaction échouera si une ou plusieurs de ces paires sont en conflit. – tadman

2

Réponse courte: Non

réponse plus longue: Vous pouvez configurer un déclencheur pour échanger l'ordre des deux personnes ids si la seconde était plus petite que la première , puis écrivez-les et utilisez une clé composite. Réponse plus longue: Toutes les relations interpersonnelles ne sont pas commutatives (toutes les relations ne vont pas dans les deux sens). Qu'en est-il des relations «employé» ou «mère»? Même la relation «Ami», qui est vraisemblablement de pair à pair, pourrait être mieux représentée si vous aviez des rangées séparées en disant A est l'ami de B et B est l'ami de A. Alors peut-être que vous voulez une clé composite à trois champs sur cette table.

+0

+1 'une clé composite à trois champs' –

0

+1 pour le composite pk. Pour éviter des combinaisons en double, une colonne varchar supplémentaire avec par exemple personid1 + personid2 avec une contrainte unique, il peut être une solution ...

Voir aussi: person data model example