2011-02-04 12 views
25

Cari esperti di database/programmatori:progettazione di database per "follower" e "followings"?

Ho una tabella MySQL con le informazioni degli utenti, come ad esempio

id  user_id   name etc. 
1  userA    
2  userB 
3  userC 
..  .. 
..  .. 

Voglio creare una caratteristica come 'seguire' gli altri utenti qualcosa di simile a Twitter. Un utente A può seguire l'utente B, oppure l'utente B può seguire l'utente A, oppure entrambi possono seguirsi l'un l'altro. A tal fine, devo creare 1 tavolo, consente di dire seguaci

id  user_id  follower_id 
1   userA  userB 
2   userC  userA 
3   userA  userC 
4   userB  userC 
5   userX  userA 

Ora voglio trovare chi sta seguendo un userA. Mi piacerebbe così: Seleziona * dai follower dove user_id = userA Questo selezionerà userB e userC. Quello è ciò di cui ho bisogno.

Ora voglio trovare, che le persone userA sta seguendo (per esempio in tabella sopra, userA sta seguendo UtenteC e userX. Allora dovrei eseguire qualcosa di simile Select * from seguaci dove follower_id = userA.

mio domanda è che, è questo disegno di database corretto per questo problema (considerando in ridondanza dei database mente e ottimizzazione?) Oppure ci può essere l'approccio migliore di questo? Grazie.

+0

BTW, seguendo ** s ** è errato –

risposta

11

in generale, il disegno è corretto.

Ma , se user_id è univoco nella tabella "users", non è necessario il colonna "id" in "utenti". (Una singola tabella contenente un "id" unico e un "user_id" univoco è piuttosto insolito.) Inoltre, nella tabella "follower" non è necessaria la colonna "id".

La chiave primaria in "follower" deve essere (user_id, follower_id) e assicurarsi che ciascuna di queste colonne abbia una chiave esterna che fa riferimento a "user_id" in "users".

5

Consiglio generale. Utilizza numeri interi per ID anziché stringhe. C'è una differenza di prestazioni significativa. Quindi rilascia users.user_id e rinomina users.id in users.user_id. In secondo luogo, la tabella dei follower dovrebbe avere indici su user_id e follower_id. Ancora una volta c'è un significativo vantaggio in termini di prestazioni. Mi piace anche l'idea di avere un indice univoco su (user_id, follower_id), che chiama la tua chiave primaria e rilascia la colonna id.

+0

Sono d'accordo sul punto principale che gli interi sono migliori come chiavi primarie/esterne. Tuttavia, penso che ciò che ha chiamato 'user_id' potrebbe essere qualcosa come 'login name' (e dovrebbe quindi essere rinominato correttamente, ma non rimosso), una cosa che è necessaria e che deve essere unica all'interno del sistema. Comunque la tabella 'follow' dovrebbe usare i riferimenti interi, proprio come suggerisce. –

1

Sì, il tuo design è il solito modo di gestire relazioni molti-a-molti. Cerca "modellazione di database molti-a-molti" e troverai molte risorse che ti forniscono esempi di questo.

Aggiungere chiavi esterne dalla tabella delle relazioni alla tabella utenti.

Se la relazione implica ulteriori informazioni, la inserirai come colonna nella tabella di connessione. Forse, ad esempio, la data in cui un utente ha iniziato a seguirne un altro.

Una chiave surrogata separata nella tabella di connessione, come la colonna ID che è stata aggiunta, può essere utile se si desidera che altre tabelle facciano riferimento alla tabella.

0

Ecco il mio disegno.

Id userId(PK) followerId  followedDate   unfollewedDate 
1  123   456   YYYY-MM-DD HH:MI:SS YYYY-MM-DD HH:MI:SS 
... ...   ...   ...     ... 

ho assunto userId-followerId combiation è unico. Le date possono essere utili.Ad esempio, sto pensando di usarlo se l'utente smette di seguire e ricominciare tra 5 minuti, non genera notifiche. Presumo che l'utente l'abbia fatto per errore. E posso analizzare le seguenti statistiche per data.

Problemi correlati