Potrebbe essere necessario definire gli indici attorno alle amicizie invece di raddoppiare il numero di righe:
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)
);
In questo modo, raddoppi la memoria per gli indici ma non per i dati della tabella. Di conseguenza, questo dovrebbe essere un risparmio del 25% sullo spazio su disco. MySQL Query Optimizer sceglierà di eseguire solo scansioni dell'intervallo di indici, motivo per cui il concetto di copertura degli indici funziona bene qui.
Ecco alcuni link utili sugli indici di copertura:
AVVERTIMENTO
Se l'amicizia non è reciproca, hai le basi per un altro tipo di relazione: FOLLOWER
Se friend_to non è amico di friend_of, puoi semplicemente lasciare quella relazione fuori dal tavolo.
Se si desidera definire relazioni per tutti i tipi, siano essi reciproci o meno, è possibile utilizzare il seguente layout di tabella:
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');
Dalla tabella delle relazioni, è possibile organizzare le relazioni in modo da includere quanto segue:
- Gli amici dovrebbero essere reciproci
- I nemici potrebbero essere reciproci o no
- I follower potrebbero essere reciproci o meno
- Le altre relazioni sarebbero soggette a interpretazione (da parte dell'oblio o dell'oblio o dal destinatario della vendetta (fissa))
- Le relazioni possibili possono essere ulteriormente estese
Questo dovrebbe essere più solido per tutte le relazioni, indipendentemente dal fatto che la relazione sia reciproca o meno.