Vous devrez peut-être définir des index autour des amitiés au lieu de doubler le nombre de lignes:
CREATE TABLE person
(
person_id INT NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY (person_id)
);
CREATE TABLE friendship
(
friend_of INT NOT NULL,
friend_to INT NOT NULL,
PRIMARY KEY (friend_of,friend_to),
UNIQUE KEY friend_to (friend_to,friend_of)
);
De cette façon, vous doublez le stockage pour les index mais pas pour les données de la table. En conséquence, cela devrait représenter une économie de 25% sur l’espace disque. L'optimiseur de requêtes MySQL choisit uniquement d'effectuer des analyses de plages d'index. C'est pourquoi le concept de couverture d'index fonctionne bien ici.
Voici quelques liens intéressants sur les index de couverture:
CAVEAT
Si l'amitié n'est pas réciproque, vous avez la base d'un autre type de relation: SUIVEZ
Si friend_to n'est pas un ami de friend_of, vous pouvez simplement laisser cette relation en dehors de la table.
Si vous souhaitez définir des relations pour tous les types, qu'elles soient mutuelles ou non, vous pouvez probablement utiliser la disposition de tableau suivante:
CREATE TABLE person
(
person_id INT NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY (person_id)
);
CREATE TABLE relationship
(
rel_id INT NOT NULL AUTO_INCREMENT,
person_id1 INT NOT NULL,
person_id2 INT NOT NULL,
reltype_id TINYINT,
PRIMARY KEY (rel_id),
UNIQUE KEY outer_affinity (reltype_id,person_id1,person_id2),
UNIQUE KEY inner_affinity (reltype_id,person_id2,person_id1),
KEY has_relationship_to (person1_id,reltype_id),
KEY has_relationship_by (person2_id,reltype_id)
);
CREATE TABLE relation
(
reltype_id TINYINT NOT NULL AUTO_INCREMENT,
rel_name VARCHAR(20),
PRIMARY KEY (reltype_id),
UNIQUE KEY (rel_name)
);
INSERT INTO relation (relation_name) VALUES
('friend'),('follower'),('foe'),
('forgotabout'),('forsaken'),('fixed');
À partir de la table de relations, vous pouvez organiser les relations de manière à inclure les éléments suivants:
- Les amis devraient être mutuels
- Les ennemis peuvent être mutuels ou non
- Les adeptes peuvent être mutuels ou non
- Les autres relations seraient sujettes à interprétation (par l'oubli ou l'abandon ou le destinataire de la vengeance (fixe))
- Les relations possibles peuvent être étendues
Cela devrait être plus robuste pour toutes les relations, qu'elles soient mutuelles ou non.