Можливо, вам потрібно буде визначити індекси навколо дружби замість подвоєння кількості рядків:
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)
);
Таким чином, ви подвоюєте сховище для індексів, але не для даних таблиці. Як результат, це має бути 25% економія на диску. Оптимізатор запитів MySQL вибере лише виконувати сканування діапазону індексів, тому тут добре працює концепція покриття індексів.
Ось кілька приємних посилань на покриття індексів:
КАВАТИ
Якщо дружба не є взаємною, у вас є підстава для іншого типу відносин: НАЙКРАЩИЙ
Якщо friend_to не є другом friend_of, ви можете просто залишити ці відносини поза столом.
Якщо ви хочете визначити відносини для всіх типів, незалежно від того, є вони взаємними чи ні, ви, ймовірно, можете використовувати такий макет таблиці:
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');
З таблиці відносин ви можете впорядкувати відносини, щоб вони включали наступні:
- Друзі повинні бути взаємними
- Недруги можуть бути взаємними чи ні
- Послідовники можуть бути взаємними чи ні
- Інші відносини підлягають тлумаченню (забутим або залишеним або одержувачем помсти (виправлено))
- Посибські стосунки можна продовжити
Це повинно бути більш надійним для всіх відносин, незалежно від того, стосунки взаємні чи ні.