我对MySQL数据库很新,所以在这里寻找关于最佳方法的一点建议。
我有一个用户表,用于存储有关用户的数据。假设我需要存储的其中一件事是关于用户使用的所有小部件制造商。我需要获取有关每个制造商(来自制造商表)的数据,以呈现给用户。在用户表中,我应该将用户制造商存储为如下所示的列中的多个值,然后将其拆分以创建我的查询吗?
id | username | password | widget_man_id | etc
1 | bob | **** | 1,4,3 | some data
2 | don | ***** | 2,3,1 | some more data
.
.
或者我应该创建一个新表,其中包含所有用户有关他们使用的制造商的信息?像这样......
id | manufacturer | user | order
1 | 1 | 1 | 1
2 | 4 | 1 | 2
3 | 3 | 1 | 3
4 | 2 | 2 | 1
5 | 3 | 2 | 2
6 | 1 | 2 | 3
.
.
然后为给定用户执行这样的查询...
select manufacturer, order from user_man where user=1
**另外,我如何根据订单字段按降序对结果进行排序?
答案 0 :(得分:5)
不要将多个值放入单个列中,然后将其拆分。查询速度要慢得多,因为每个值都无法编入索引。你最好有一张桌子,每张桌子都有一张单独的记录。您可以为此表编制索引,您的查询运行速度会更快。
答案 1 :(得分:3)
您要在此处实施的内容是Users
和Manufacturers
之间的Many-to-Many关系。
在大多数RDBMS(例如MySQL)中执行此操作的唯一好方法是通过Junction Table。虽然它不反映模型的特定对象,但它有助于建模其他两者之间的关系。
创建第三个表,不要忘记创建外键,这样可以在更新或插入记录时防止错误,并使用一些有趣的功能,如级联删除。
答案 2 :(得分:1)
单独的表是唯一的方法。
要按降序排列结果,只需添加DESC
关键字
SELECT manufacturer FROM user_man WHERE user=1 ORDER BY `order` DESC
答案 3 :(得分:1)
常见的方法是拥有一个表用户(就像你的用户一样但没有widget_man_id):
用户强>
id | username | password | etc
1 | bob | **** | some data
2 | don | ***** | some more data
制造商表:
制造商
id | name | etc
1 | man1 | some data
2 | man2 | some more data
和多对多关系表(就像你的例子):
<强> user_man 强>
id | manufacturer | user | order
1 | 1 | 1 | 1
2 | 4 | 1 | 2
3 | 3 | 1 | 3
4 | 2 | 2 | 1
5 | 3 | 2 | 2
6 | 1 | 2 | 3