Möglicherweise müssen Sie Indizes für Freundschaften definieren, anstatt die Anzahl der Zeilen zu verdoppeln:
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)
);
Auf diese Weise verdoppeln Sie den Speicher für Indizes, jedoch nicht für die Tabellendaten. Infolgedessen sollte dies eine Einsparung von 25% des Speicherplatzes bedeuten. Der MySQL Query Optimizer wählt nur die Ausführung von Indexbereichs-Scans aus, weshalb das Konzept der Indexabdeckung hier gut funktioniert.
Hier sind ein paar nette Links zu den Titelindizes:
VORBEHALT
Wenn Freundschaft nicht auf Gegenseitigkeit beruht, haben Sie die Grundlage für eine andere Art von Beziehung: FOLLOWER
Wenn friend_to kein Freund von friend_of ist, können Sie diese Beziehung einfach aus der Tabelle streichen.
Wenn Sie Beziehungen für alle Typen definieren möchten, unabhängig davon, ob sie wechselseitig sind oder nicht, können Sie möglicherweise das folgende Tabellenlayout verwenden:
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');
In der Beziehungstabelle können Sie die Beziehungen so anordnen, dass sie Folgendes enthalten:
- Freunde sollten gegenseitig sein
- Feinde können gegenseitig sein oder nicht
- Anhänger können gegenseitig sein oder nicht
- Die anderen Beziehungen würden interpretiert (durch den Vergessenen oder Verlassenen oder den Empfänger von Rache (fixiert))
- Possibie-Beziehungen können weiter ausgebaut werden
Dies sollte für alle Beziehungen robuster sein, unabhängig davon, ob die Beziehung wechselseitig ist oder nicht.