Pode ser necessário definir índices em torno de amizades, em vez de dobrar o número de linhas:
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)
);
Dessa forma, você duplica o armazenamento para índices, mas não para os dados da tabela. Como resultado, isso deve economizar 25% no espaço em disco. O MySQL Query Optimizer escolherá executar apenas varreduras de intervalo de índice, razão pela qual o conceito de cobertura de índices funciona bem aqui.
Aqui estão alguns links interessantes sobre Cobertura de índices:
EMBARGO
Se a amizade não é mútua, você tem a base para outro tipo de relacionamento: SEGUINTE
Se friend_to não for amigo de friend_of, você pode simplesmente deixar esse relacionamento fora da tabela.
Se você deseja definir relacionamentos para todos os tipos, sejam eles mútuos ou não, provavelmente você pode usar o seguinte layout de tabela:
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');
Na tabela de relações, você pode organizar os relacionamentos para incluir o seguinte:
- Amigos devem ser mútuos
- Os inimigos podem ser mútuos ou não
- Os seguidores podem ser mútuos ou não
- Os outros relacionamentos estariam sujeitos à interpretação (pelo esquecido ou abandonado ou pelo destinatário de vingança (fixo))
- Possíveis relacionamentos podem ser ampliados
Isso deve ser mais robusto para todos os relacionamentos, seja o relacionamento mútuo ou não.