2012-10-22 28 views
5

Voglio creare un sistema di amici (qualcosa come in facebook).mysql ottimizza le tabelle

voglio salvare i dati relazionali in MySql, ma non so da che parte è meglio:

  1. Per salvare rapporto everysingle come una sola voce, come ad esempio:

    id | people1 | people2 
    1 | john | maria 
    2 | john | fred 
    3 | maria | fred 
    

    (lì dichiaro relazioni tra tutti questi 3 popoli)

  2. Per salvare tutti i nomi e elencare i suoi amici:

    id | people | friends 
    1 | fred | mary, john 
    2 | mary | john, fred 
    3 | john | fred, mary 
    

O forse c'è modo migliore?

+0

Direi, opzione uno, il tuo db diventa più grande, ma non prevedo alcun problema che vedo quando lo farei come l'opzione 2, l'inserimento e l'editing nell'opzione 2 lo renderebbero molto più difficile. Oppinione personale questo. – Dorvalla

+0

# 2 è giustamente considerato una cattiva pratica, vedi http://stackoverflow.com/questions/3653462/is-storing-a-comma-separated-list-in-a-database-column-really-that-bad –

+0

assolutamente sicuro - il primo modo. sebbene - usi numeri di identificazione numerici per le persone, non nomi. – Randy

risposta

11

No Caro,

si solo bisogno di un tavolo unico per make rapporto amico. la struttura è seguente ho usato

id (chiave primaria) | my_id (numero utente registrato intero) | friend_id (integer id utente di un altro utente che riceverà richiesta di amicizia da utente connesso)

come abbiamo due utenti nella nostra tabella utenti poi abbiamo due voci sia per l'utente di fare relazione con l'altro

id | name | age 
1 | vipan | 12 
2 | karan | 12 

poi voce dovrebbe essere

id | my_id | friend_id 
1  1  2 
2  2  1 

si prega di non votare in giù, in ogni caso, ma devo utilizzare questa struttura tavola nel mio sito e questo è stessa struttura utilizzata in joomsocial questo è meglio la struttura delle tabelle io la penso così lo uso e per favore non usare valori separati da virgola es nella tabella faranno problema si unisce e di relazione, in alcuni casi

Vedere 4 Numero commento in questo link seguente post

Separate comma separated values from mysql table

+1

Si prega di vedere 4 numero di commento in questo post http://stackoverflow.com/questions/9906430/separate-comma-separated-values-from-mysql-table –

+0

ma dovrò stampare tutti gli amici di qualche persona, quindi Avrò bisogno di nomi e non sembra molto veloce per recuperare il nome di ogni persona da un altro tavolo (se il numero di amici sarà superiore a 500 e le voci nella tabella utenti sopra 100k) –

4

Il primo è il migliore senza dubbio causano la seconda non rispetterebbe lo first normal form.

si deve evitare di valori multipli nella stessa colonna causa otterrà davvero doloroso per modificare

s' Here il link sulla normalizzazione dei database. La maggior parte delle volte rispettiamo la terza forma normale perché è un buon compromesso tra normalizzazione e prestazioni.

Inoltre, come ha detto Randy, è necessario utilizzare gli ID, quindi è possibile collegarli a una chiave esterna.

+0

ma dovrò stampare tutti gli amici di alcuni persona, quindi avrò bisogno di nomi e non sembra molto veloce per recuperare il nome di ogni persona da un altro tavolo (se il numero di amici sarà superiore a 500 e le voci nella tabella utenti superiore a 100k) –

+0

Bene, un join non costa così tanto e credimi, mysql può gestire abbastanza facilmente 100k righe, quindi per questo caso non sacrificherei la normalizzazione per le prestazioni. Non rispetterebbe la prima forma normale – Marc

+0

@MindaugasJakubauskas Inoltre, esempio: Devi sapere se John è un amico di Robert ... Inizierai ad analizzare tutta la stringa e la spaccatura? Non è molto buono per le prestazioni ed è doloroso. Invece, con l'opzione 1, fai semplicemente una selezione normale e se imposti i tuoi indici nel modo giusto, non ci vorrà neanche un secondo. – Marc