0

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

用户

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

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

4

4 回答 4

5

不要将多个值放入单个列中,然后将它们拆分。这对于查询来说要慢得多,因为每个值都不能被索引。你最好有一个表,每个表都有单独的记录。您可以索引此表,您的查询将运行得更快。

于 2013-02-14T14:52:43.963 回答
3

您在这里尝试实现的是您的和之间的多对多关系。UsersManufacturers

在大多数 RDBMS(如 MySQL)中,唯一的好方法是通过Junction Table。尽管它不反映模型的特定对象,但它有助于对其他两个对象之间的关系进行建模。

创建第三张表,不要忘记创建外键,这样您可以在更新或插入记录时防止错误,并使用一些有趣的功能,例如级联删除。

于 2013-02-14T15:01:02.723 回答
1

单独的桌子是唯一的方法。

要按降序排列结果,只需添加DESC关键字

SELECT manufacturer FROM user_man WHERE user=1 ORDER BY `order` DESC
于 2013-02-14T14:54:54.773 回答
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

还有一个多对多关系表(如您的示例):

用户人

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
于 2013-02-14T15:08:48.363 回答