Sto costruendo un grafico sociale per il mio sito web. Gli utenti creeranno relazioni (del modulo seguace/seguito) in cui ciascuna parte può seguire in modo indipendente l'altra. Il mio tavolo utenti si presenta così:Modellatore SQL/Seguito relazioni per social network
Users table
- UserId (PK, Auto-incrementing integer)
Pensando a come modellare questo, mi è venuta in mente diverse alternative, come ad esempio:
(a) Una tabella tiene ogni azione 'seguire' come fila separata.
Relationships table
- FollowerId (FK to Users.UserId)
- FollowedId (FK to Users.UserId)
Questo ha lo svantaggio che dato a molti utenti, creerebbe un numero enorme di righe.
(b) Una tabella contiene l'elenco di utenti ciascun utente sta seguendo come CSV o altra struttura: (? E costosa)
Relationships table
- FollowerId (FK to Users.UserId)
- FollowingUsers (e.g. 2,488,28,40)
Questo ha l'inconveniente che le query saranno molto più complicata. Mi piacerebbe anche necessario mantenere ordinamento dei valori di stringa, ecc ...
(c) Un rapporto per fila, in cui un utente può essere su entrambi i 'lati' della relazione:
Relationships table
- Party1Id (FK to Users.UserId)
- FollowingParty2 (boolean)
- Party2Id (FK to Users.UserId)
- FollowingParty1 (boolean)
Questo salva le righe su (a), ma le query sono più complesse perché l'utente può essere una delle parti.
(d) l'assoggettamento sia 'dopo' e 'seguito da' come liste come (b)
Relationships table
- UserId (FK to Users.UserId)
- FollowingUsers (e.g. 2,488,28,40)
- FollowedBy (e.g. 2,488,28,40)
Questo sembra il migliore dei mondi possibili, ma ora devo utilizzare le transazioni per aggiornare più righe .
Supponendo che sto cercando di scalare a grandi dimensioni, anche se consapevole che "i problemi di Facebook non sono i miei problemi" - quale opzione, o quale altra opzione è preferibile?