最好将多个值存储在表列中,还是创建新表?

时间:2013-02-14 14:47:04

标签: mysql mysqli

我对MySQL数据库很新,所以在这里寻找关于最佳方法的一点建议。

我有一个用户表,用于存储有关用户的数据。假设我需要存储的其中一件事是关于用户使用的所有小部件制造商。我需要获取有关每个制造商(来自制造商表)的数据,以呈现给用户。在用户表中,我应该将用户制造商存储为如下所示的列中的多个值,然后将其拆分以创建我的查询吗?

用户

id  | username  | password | widget_man_id | etc
1   | bob       | ****     | 1,4,3         | some data
2   | don       | *****    | 2,3,1         | 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
.
.

然后为给定用户执行这样的查询...

select manufacturer, order from user_man where user=1

**另外,我如何根据订单字段按降序对结果进行排序?

4 个答案:

答案 0 :(得分:5)

不要将多个值放入单个列中,然后将其拆分。查询速度要慢得多,因为每个值都无法编入索引。你最好有一张桌子,每张桌子都有一张单独的记录。您可以为此表编制索引,您的查询运行速度会更快。

答案 1 :(得分:3)

您要在此处实施的内容是UsersManufacturers之间的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