我应该如何在MySQL表中存储这些多个值?

时间:2012-05-05 06:58:01

标签: php mysql database-design

我正在为一个新网站设计数据库,用户可以在这里选择一些他们喜欢的音乐类型。每个类型都有一个与之相关的id,所以如果John喜欢Pop,Rock和R& B他喜欢1,2和3。

在users表中存储这些内容的最佳方法是什么?

现在我有这样的话:

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

并在php中我在逗号分隔符上爆炸这些值并以这种方式获取单个ID。但这显然不是解决问题的正确方法。

我知道我可以有一个名为“genre_to_user”的单独表格,对于John喜欢的每种类型,我可以像这样输入该表格中的条目:

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

为了得到约翰喜欢的所有人,我可以做SELECT * FROM 'genre_to_user where user_id = 1

但是从长远来看,我不认为这会非常有效,因为那张桌子充满了大量的记录。因为我将在列表页面上为每个用户执行一次此计算,其中在同一页面上最多有30个用户。这些页面遍布整个网站。

那么正确(以及高效)的方式是什么呢?

此外,mysql中是否存在用于存储逗号分隔值的数据类型,而不仅仅是将它们粘贴在varchar字段中?

2 个答案:

答案 0 :(得分:4)

您应该使用您描述的genre_to_user之类的交叉引用表。这将使您的数据库更快地搜索记录。

不要过于担心“数量庞大的记录”,这就是数据库的用途: - )

答案 1 :(得分:0)

创建交叉引用表(如您描述的genre_to_user)具有允许反转搜索的额外好处。换句话说,您可以找出哪些用户或有多少用户的genre_id为1.