Question

Ainsi, le concept moderne de la liste de contacts:
Disons que nous avons une table appelée personne. Maintenant, cette personne a besoin d'avoir beaucoup de copains (dont chaque contact est également dans la classe de personne). La façon la plus évidente pour construire une relation serait par une table de jointure. i.e..

buddyID   person1_id   person2_id
0         1            2
1         3            6

Mais, lorsqu'un utilisateur veut voir leur liste d'amis, le programme devrait vérifier la colonne « person1_id » et « person2_id » pour trouver tous leurs copains.

Est-ce la façon appropriée de mettre en œuvre ce genre de table, ou serait-il préférable d'ajouter l'enregistrement deux fois .. i.e..

buddyID   person1_id   person2_id
0         1            2
1         2            1

Alors que seule colonne est à rechercher.

Merci à l'avance.

Était-ce utile?

La solution

Il est plusieurs à plusieurs, cette table de Relator est nécessaire.

create table Person (
   person_id int not null primary key,
   username varchar(100) not null,
   ... other_cols ...
)


create table Buddy (
   person_id1 int not null,
   person_id2 int not null,
   primary key (person_id1, person_id2),
   foreign key (person_id1) reference Person (person_id),
   foreign key (person_id2) reference Person (person_id)
)

la table personne contiendrait 1 ligne pour chaque personne évidemment. Il contiendra toutes les données que ce soit au sujet de copains qui rendraient dénormaliser. Au lieu de cela la table d'amis contiendrait les relations entre les personnes.

permet de dire que vous avez quelque chose comme ça dans le tableau Personne:

person_id    username
1            George
2            Henry
3            Jody
4            Cara

Henry et Cara sont copains, tout comme George et Cara donc:

person_id1   person_id2
2            4
1            4

Si vous avez besoin d'avoir de telle sorte que les relations ne sont pas implicitement mutuelle alors vous aurez besoin d'ajouter des lignes supplémentaires pour faire ce être explicite. Donc, permet maintenant de dire que Henry considère Cara un copain et Cara pense également d'Henry comme ami tandis que George considère Cara comme un ami, mais Cara ne pas aller et venir avec George:

person_id1   person_id2
2            4
4            2
1            4

Le manque 4 1 indique que Cara ne considère pas George comme un ami. Cela permet de rester très propre et évite de données anomolies. Vous pouvez régler les relations sans déblayage avec les données personne. Aussi, vous pouvez définir une règle de suppression en cascade sur les clés étrangères afin que la suppression personne supprimerait automatiquement toutes les relations associées pour vous. À l'inverse, vous pouvez empêcher qu'au lieu dans ce cas, vous pouvez spécifier limiter (la valeur par défaut) sur les clés étrangères qui empêcheraient la suppression d'une personne ayant des relations encore définies.

Les requêtes sont faciles aussi:

Combien de copains ne Cara ont (laisse supposer des relations pour les listes de contacts sont implicites):

select count(*) from Person 
                join Buddy on person_id = person_id1 or person_id = person_id2
 where name = 'Cara'

Pour le cas où les relations ne sont pas implicites, il pourrait être préférable de la place renommer les colonnes comme ceci:

person_id   considers_as_buddy_id
2           4
4           2
1           4
4           3

select count(*) from Person P
                join Buddy B on P.person_id = B.person_id
 where name = 'Cara'

Cette fonction renvoie le nombre de personnes Cara considère comme copains. Dans ce cas 2. Alors que Jody ne pense pas que de Cara comme Buddy - afin de trouver les relations mutuelles que vous feriez ceci:

select count(*) from Person P
                join Buddy B on P.person_id = B.person_id and 
                                B.considers_as_buddy_id = P.person_id
 where name = 'Cara'

Autres conseils

Il y a deux scénarios possibles ici.

Tout d'abord vous devez déterminer si la relation de jumelage peut être un moyen. personne A peut-il être un copain à la personne B sans B étant un ami de A? Je suppose que non, mais il vaut la peine d'être explicite.

Commonsense suggère que vous interrogez plus que vous mettez à jour les relations. En tant que tel, optimiser vos données pour cela. Lors de la création d'une relation de jumelage, créez deux recrods: A à B et B à A. Cela fera la requête triviale. Alors oui, aller avec les deux dossiers que vous avez déjà considéré.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top