我正在为一个新网站设计数据库,用户可以在其中选择一些他们最喜欢的音乐流派。每个流派都有一个与之关联的ID,所以如果John喜欢流行,摇滚和R&B,他喜欢1,2和3。
将这些存储在用户表中的最佳方法是什么?
现在我有这样的它们:
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 字段中?
您应该使用与您描述的genre_to_user
类似的交叉引用表。这将使您的数据库更快地搜索记录。
不要太担心"大量的记录",这就是数据库的用途:-(
创建与您描述的genre_to_user类似的交叉引用表具有允许反转搜索的额外好处。换句话说,您可以找出哪些用户或有多少用户的genre_id为 1。