2012-05-05 39 views
0

我正在設計一個新網站的數據庫,用戶可以選擇他們喜歡的音樂流派。每個流派都有一個id與之相關聯,所以如果John喜歡流行,搖滾和R & B他喜歡1,2和3.我應該如何在MySQL表中存儲這些多個值?

將這些存儲在users表中的最佳方式是什麼?

現在我有他們這樣的:

genre_id | user_id 
------------------ 
1,2,3 | 1 

,並在php我爆炸的逗號分隔符這些值,抓住個別ID的方式。但是,這顯然不是正確的方式。

我知道我可以有一個名爲「genre_to_user」一個單獨的表,併爲每個流派約翰喜歡我可以輸入一個進入該表所示:

genre_id | user_id 
------------------ 
1  | 1 
2  | 1 
3  | 1 

而且把所有的那些約翰喜歡我可以做一個SELECT * FROM 'genre_to_user where user_id = 1

但我不認爲這將是非常有效的,從長遠來看,當該表充滿了大量的記錄。因爲我將爲每個用戶在同一頁面上有多達30個用戶的列表頁面上進行一次計算。這些網頁遍佈整個網站。

那麼什麼是正確的(和高效)的方式去呢?

此外,是否有在MySQL中的任何數據類型,用於存儲逗號分隔值,而不是隻是將它們粘在varchar字段?

+3

「巨​​大的記錄數量」 - 有多少對你來說是巨大的?因爲我懷疑你有700萬個不同的流派供用戶選擇。讓索引做他們應該做的事(甚至700萬對數據庫來說也不是很大)。 – Blake

+3

其實,我相信你提到的第二個解決方案可能是解決這個問題的最好方法。通常,你會在user_id列上有一個索引,所以檢索速度會非常快。 –

回答

4

您應該使用交叉引用表,如您所描述的genre_to_user。這將使您的數據庫更快地搜索記錄。

不要太擔心「的記錄的數量巨大」,這就是數據庫是:-)

0

創建像你描述的genre_to_user交叉引用表具有允許搜索的好處被顛倒。換句話說,你可以找出哪些用戶或有多少用戶的genre_id是1.

+0

這似乎更適合評論,因爲它不能被視爲問題的完整答案。 – dkar

相關問題