2012-10-22 63 views
5

我想創建一個朋友系統(類似於facebook)。mysql優化表

我想保存在MySQL關係的數據,但我不知道哪種方式更好:

  1. 要保存everysingle關係爲一個條目,如:

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

    (在那裏我宣佈所有這3人之間的關係)

  2. 爲了保存每個人的名字和列出他的朋友:

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

或者,也許還有更好的辦法?

+0

我會說,選項一,你的數據庫變得更大,但我不認爲任何問題我看到,當我做它像選項2,插入和編輯選項2會使它更難。 Persnoal認爲這一點。 – Dorvalla

+0

#2被認爲是錯誤的做法,請參閱http://stackoverflow.com/questions/3653462/is-storing-a-comma-separated-list-in-a-database-column-really-that-bad –

+0

絕對確定 - 第一種方式。儘管 - 爲人們使用數字身份證號碼,而不是姓名。 – Randy

回答

11

不,親愛的,

你只需要一個單一的表格爲朋友關係。結構如下我已使用

id(主鍵)| my_id(整數記錄的用戶ID)|

像我們有我們的用戶表中的兩個用戶,那麼我們有兩個項目既爲用戶進行關係相互

id | name | age 
1 | vipan | 12 
2 | karan | 12 
friend_id(其他用戶,他會收到來自登錄用戶的好友請求的整數用戶ID)

則條目應

id | my_id | friend_id 
1  1  2 
2  2  1 

請不要否決在任何情況下,但我用在我的網站上的這個表的結構,這是joomsocial此使用相同的結構最好是表結構我想,所以我用它請不要使用逗號分隔的值在表ES在加入和在某些情況下,關係

請參見第4號評論在這下面的帖子的鏈接

Separate comma separated values from mysql table

+1

請參閱這篇文章中的4號碼評論 http://stackoverflow.com/questions/9906430/separate-comma-separated-values-from-mysql-table – 2012-10-22 12:49:30

+0

但我將需要打印某人的所有朋友,所以我將需要名稱,並且它不會很快從另一個表中檢索每個人的姓名(如果朋友的數量高於500,並且用戶表中的數字高於100k) –

4

第一個是最好的無疑是導致第二個,他們會讓問題不會尊重first normal form

你必須避免在同一列多個值的原因是會得到真正的痛苦編輯

Here的有關數據庫規範化的鏈接。大多數時候,我們尊重第三種正常形式,因爲它是正常化和性能之間的良好折衷。

另外,就像Randy說的那樣,你必須使用這些ID,然後你可以將它們與一個外鍵鏈接起來。

+0

但我需要打印所有朋友的一些人,所以我會需要名稱,並且它看起來不是很快從另一個表中檢索每個人的名字(如果朋友的數量將超過500,並且用戶表中的條目超過100k) –

+0

那麼,加入不會花費那麼多,並相信我mysql可以處理100k行非常容易,所以對於這種情況下,我不會犧牲性能的規範化。它不會尊重第一範式 – Marc

+0

@MindaugasJakubauskas另外,例如:你需要知道約翰是否是羅伯特的朋友......你會開始解析所有的字符串和分裂?這對性能不是很好,而且很痛苦。相反,在選項1中,你只需進行正常的選擇,如果你將索引設置爲好的方式,它甚至不會花時間。 – Marc