2012-03-23 12 views
5

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?

risposta

5

mi piacerebbe andare con l'opzione A.

  1. Qualsiasi tipo di analisi grafico sociale sarà impossibile utilizzare sarà impossibile utilizzare altre opzioni
  2. Non c'è altre opzioni
  3. applicare qualsiasi tipo di vincoli relazionali è necessario utilizzare il database relazionale se non si intende archiviare i dati in modo relazionale.

Una possibilità interessante potrebbe essere quella di considerare le relazioni tavolo modello: tavolo

relazioni

  • RelationshipId
  • UserId (FK a Users.UserId)
  • RelationType

Ora è possibile connettere gli utenti.

caso B segue A:

  • aggiungere RelationshipId1, UserAId, "IsFollowed"
  • aggiungere RelationshipId1, UserBId, "IsFollowing"

caso Un altro utente avvia seguente A:

  • aggiungi RelationshipId1, AnotherUserId, "IsFollowing"

caso Un altro utente avvia seguente B:

  • aggiungere RelationshipId2, AnotherUserId, "IsFollowing"

si può anche eliminare le righe non necessari se si vuole: A inizia seguente B:

  • aggiungi RelationshipId3, UserAId, "IsFollowedAndIsFollowing"
  • aggiungi RelationshipId3, UserBId, "IsFollowedAndIsFollowing"
  • rimuovere RelationshipId1, UserBId, "IsFollowing"
Problemi correlati