Może być konieczne zdefiniowanie indeksów wokół przyjaźni zamiast podwojenia liczby wierszy:
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)
);
W ten sposób podwajasz pamięć dla indeksów, ale nie dla danych tabeli. W rezultacie powinno to stanowić 25% oszczędności miejsca na dysku. Optymalizator zapytań MySQL wybierze tylko skanowanie zakresu indeksów, dlatego koncepcja pokrywania indeksów działa tutaj dobrze.
Oto kilka ciekawych linków na temat indeksów obejmujących:
CAVEAT
Jeśli przyjaźń nie jest wzajemna, masz podstawę do innego rodzaju relacji: OBSERWUJ
Jeśli friend_to nie jest przyjacielem friend_of, możesz po prostu pozostawić ten związek poza tabelą.
Jeśli chcesz zdefiniować relacje dla wszystkich typów, niezależnie od tego, czy są one wzajemne, czy nie, prawdopodobnie możesz użyć następującego układu tabeli:
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');
W tabeli relacji można ułożyć relacje w następujący sposób:
- Przyjaciele powinni być wzajemni
- Przeciwnicy mogą być wzajemni lub nie
- Obserwujący mogą być wzajemni lub nie
- Inne relacje podlegałyby interpretacji (przez zapomnianego, porzuconego lub odbiorcę zemsty (ustalony))
- Relacje z Possibie można dalej rozszerzać
Powinno to być bardziej niezawodne dla wszystkich relacji, niezależnie od tego, czy związek jest wzajemny, czy nie.