Es posible que deba definir índices en torno a las amistades en lugar de duplicar el número de filas:
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)
);
De esta manera, duplica el almacenamiento para los índices pero no para los datos de la tabla. Como resultado, esto debería ser un ahorro del 25% en el espacio en disco. MySQL Query Optimizer elegirá realizar escaneos de rango de índice solamente, por eso el concepto de cubrir índices funciona bien aquí.
Aquí hay algunos enlaces agradables sobre los índices de cobertura:
ADVERTENCIA
Si la amistad no es mutua, tienes la base para otro tipo de relación: SEGUIR
Si friend_to no es amigo de friend_of, simplemente puede dejar esa relación fuera de la mesa.
Si desea definir relaciones para todos los tipos, sean mutuos o no, probablemente podría usar el siguiente diseño de tabla:
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');
Desde la tabla de relaciones, puede organizar las relaciones para incluir lo siguiente:
- Los amigos deben ser mutuos
- Los enemigos pueden ser mutuos o no
- Los seguidores pueden ser mutuos o no
- Las otras relaciones estarían sujetas a interpretación (por parte del olvidado o abandonado o el receptor de la venganza (fijo))
- Posibles relaciones pueden extenderse aún más
Esto debería ser más robusto para todas las relaciones, ya sea que la relación sea mutua o no.