una tabla relacional recursivas recursiva optimizar modelo lentas jerarquica hacer ejemplos ejemplo datos consultas consulta como mysql database database-design relational-database

mysql - tabla - modelo relacional base de datos pdf



mejor forma de almacenar relaciones de usuario 1: 1 en una base de datos relacional (4)

Tendría una tabla de enlaces para amigos, o lo que sea, con 2 columnas que son PK, y ambas son FK para la tabla de Usuario.

Ambas columnas serían el UID, y tendrías dos filas por relación de amigo (A, B y B, A). Siempre y cuando ambas columnas sean PK''s, aún debería estar en formato normal (aunque otras son libres de corregirme en esto)

Es una consulta un poco más compleja, pero nada que no pueda ser abstraída por un procedimiento almacenado o alguna lógica de negocios, y está en formato normal, lo que generalmente es bueno tener.

¿Cuál es la mejor manera de almacenar relaciones de usuario, por ejemplo, amistades, que deben ser bidireccionales (eres mi amigo, así soy tu amigo) en un rel. base de datos, por ejemplo, MYSql?

Puedo pensar de dos maneras:

  1. Cada vez que un usuario hace amistad con otro usuario, agrego dos filas a una base de datos, fila A que consiste en la identificación del usuario que ingresa seguido por el UID del usuario aceptante en la siguiente columna. La fila B sería al revés.
  2. Solo agregaría una fila, UID (usuario iniciador) seguido de UID (usuario aceptante); y luego solo busque en ambas columnas cuando intente averiguar si el usuario 1 es amigo del usuario 2.

Seguramente hay algo mejor?


Use un almacén de valores clave, como Cassandra, por ejemplo.


Puede verificar cuál de los dos ID_usuarios es el más bajo y almacenarlos en un orden específico. De esta manera, no necesita filas dobles para una amistad y aún así mantener sus consultas simples.

user_id_low | user_id_high

una consulta simple para verificar si ya eres amigo de alguien sería:

<?php $my_id = 2999; $friend_id = 500; $lowest = min($my_id, $friend_id); $highest= max($my_id, $friend_id); query("SELECT * FROM friends WHERE user_id_low=$lowest AND user_id_high=$highest"); ?>

O puede encontrar la ID de usuario más baja / más alta usando mysql

<?php query("SELECT * FROM friends WHERE user_id_low=LEAST($my_id, $friend_id) AND user_id_high=GREATEST($my_id, $friend_id)"); ?>

Y para obtener la id de todos tus amigos

<?php query("SELECT IF(user_id_low=$my_id,user_id_high,user_id_low) AS friend_id FROM friends WHERE $my_id IN (user_id_low, user_id_high)"); ?>


Usar filas dobles, mientras crea datos adicionales, simplificará en gran medida sus consultas y le permitirá indexar inteligentemente. También recuerdo haber visto información en la solución MySQL personalizada de Twitter, en la que utilizaron un campo adicional (amigo #, básicamente) para hacer la limitación automática y la paginación. Parece bastante sencillo: https://blog.twitter.com/2010/introducing-flockdb