me he encontrado con el mismo problema en dos piezas diferentes de trabajo de este mes:¿Hay una manera elegante para almacenar una relación dual (es decir, el usuario 1 y el usuario 2 son amigos)
Version 1: User 1 & User 2 are friends
Version 2: Axis 1 & Axis 2 when graphed should have the quadrants colored...
El problema es , No veo una manera elegante, usando un RDBMS, para almacenar y consultar esta información.
Hay dos enfoques obvios:
Enfoque 1:
store the information twice (i.e. two db rows rows per relationship):
u1, u2, true
u2, u1, true
u..n, u..i, true
u..i, u..n, true
have rules to always look for the inverse on updates:
on read, no management needed
on create, create inverse
on delete, delete inverse
on update, update inverse
Advantage: management logic is always the same.
Disadvantage: possibility of race conditions, extra storage (which is admittedly cheap, but feels wrong)
Enfoque 2:
store the information once (i.e. one db row per relationship)
u1, u2, true
u..n, u..i, true
have rules to check for corollaries:
on read, if u1, u2 fails, check for u2, u1
on create u1, u2: check for u2, u1, if it doesn't exist, create u1, u2
on delete, no management needed
on update, optionally redo same check as create
Advantage: Only store once
Disadvantage: Management requires different set of cleanup depending on the operation
Me pregunto si hay un enfoque tercero que va a lo largo de las líneas de " tecla usando f (x, y) donde f (x, y) es único para cada combinación x, y y donde f (x, y) === f (y, x) "
Mi instinto me dice que debe haber una combinación de operaciones bit a bit que puedan cumplir estos requisitos. Algo así como una de dos columnas:
key1 = x & & y clave2 = x + y
que espero que la gente que pasaban más tiempo en el departamento de matemáticas, y menos tiempo en el departamento de sociología tienen visto una prueba de la posibilidad o imposibilidad de esto y puede proporcionar un rápido "[Usted es idiota,] es fácilmente probado (im) posible, consulte este enlace" (nombre de llamada opcional)
Cualquier otro enfoque elegante también sería muy Bienvenido.
Gracias
¿No puedes usar una base de datos basada en gráficos? Neo4j por ejemplo. Esto le permitiría capturar completamente sus relaciones gráficas. También puede usar Mongo y almacenarlo todo en un objeto Json. – Steve
Esto es algo que ni siquiera las bases de datos 'documentadas' o 'NoSQL' admiten de forma elegante. –
@steve sí, Neo4j es una opción real (aunque no soy un gran admirador de su licencia). Neo4j resuma esto, pero tienen que resolver el problema fundamental de alguna manera. Me gustaría entender cómo. – Ted