Imagina que vives en un ejemplo de tierra muy simplificado, e imagina que tienes una mesa de gente en su base de datos MySQL:Tengo una tabla de personas, a la que quiero vincular, many-to-many, con enlaces bidireccionales
create table person (
person_id int,
name text
)
select * from person;
+-------------------------------+
| person_id | name |
+-------------------------------+
| 1 | Alice |
| 2 | Bob |
| 3 | Carol |
+-------------------------------+
y estas personas necesitan colaborar/trabajar juntos, por lo que tiene una mesa de enlace que une un registro persona a otra:
create table person__person (
person__person_id int,
person_id int,
other_person_id int
)
Esta configuración significa que los vínculos entre las personas son unidireccionales, es decir, Alicia puede vincular a Bob, sin que Bob se vincule con Alicia e, incluso, w orse, Alice puede vincular a Bob y Bob puede vincular a Alice al mismo tiempo, en dos registros de enlace separados. Como estos enlaces representan relaciones de trabajo, en el mundo real son relaciones mutuas bidireccionales. Los siguientes son posibles en esta configuración:
select * from person__person;
+---------------------+-----------+--------------------+
| person__person_id | person_id | other_person_id |
+---------------------+-----------+--------------------+
| 1 | 1 | 2 |
| 2 | 2 | 1 |
| 3 | 2 | 2 |
| 4 | 3 | 1 |
+---------------------+-----------+--------------------+
Por ejemplo, con person__person_id = 4 anterior, cuando se ve el perfil de Carol (person_id = 3), debería ver una relación con Alice (person_id = 1) y cuando ves el perfil de Alicia, deberías ver una relación con Carol, a pesar de que el enlace va en dirección opuesta.
Me doy cuenta de que puedo hacer consultas unitarias y distintas y qué no para presentar las relaciones como mutuas en la interfaz de usuario, pero ¿hay una mejor manera? Tengo la sensación de que es una mejor manera, una donde este problema desaparecería limpiamente configurando la base de datos correctamente, pero no puedo verlo. Alguien tiene una mejor idea?
¡Esta es la pregunta mejor formateada que he visto de un usuario de <50 repetidores! ¡Aclamaciones! –
Cambié las etiquetas de 'mysql many-to-many' a 'data-modeling many-to-many' (+1 buena pregunta!) – lexu
+1 pregunta bien planteada. nit-pick: person__person es un nombre de tabla horrible; solo diga que es para propósitos de iluminación;) – msw