Estoy creando un gráfico social para mi sitio web. Los usuarios crearán relaciones (del formulario seguidor/seguido) donde cada parte puede seguir independientemente a la otra. Mi tabla de usuarios es el siguiente:Seguidor de modelado SQL/Relaciones seguidas para redes sociales
Users table
- UserId (PK, Auto-incrementing integer)
Pensando en cómo modelar esto, yo he llegado con varias alternativas, tales como:
(a) Una tabla contiene cada acción 'seguir' como una fila separada.
Relationships table
- FollowerId (FK to Users.UserId)
- FollowedId (FK to Users.UserId)
Esto tiene la desventaja de que dado a muchos usuarios, crearía una gran cantidad de filas.
(b) Una tabla contiene la lista de usuarios cada usuario está siguiendo como CSV u otra estructura: (? Y costoso)
Relationships table
- FollowerId (FK to Users.UserId)
- FollowingUsers (e.g. 2,488,28,40)
Esto tiene el inconveniente de que las consultas serán mucho más complicado. También tendría que mantener la orden de los valores de cadena, etc ...
(c) Una relación por fila, donde un usuario puede estar en cualquier 'lado' de la relación:
Relationships table
- Party1Id (FK to Users.UserId)
- FollowingParty2 (boolean)
- Party2Id (FK to Users.UserId)
- FollowingParty1 (boolean)
Esto ahorra filas sobre (a), pero las consultas son más complejas porque el usuario puede ser cualquiera de las partes.
(d) La colocación de ambos 'siguiente' y 'seguido de' tan listas como (b)
Relationships table
- UserId (FK to Users.UserId)
- FollowingUsers (e.g. 2,488,28,40)
- FollowedBy (e.g. 2,488,28,40)
Este parece ser el mejor de los mundos, pero ahora tengo que usar las transacciones para actualizar varias filas .
Asumiendo que estoy buscando escalar a un tamaño grande, aunque soy consciente de que "los problemas de Facebook no son mis problemas", ¿qué opción o qué otra opción se prefiere?