SQL表逻辑,哪种方式是正确的

时间:2015-12-16 14:15:27

标签: mysql database database-design

我正在与自己争论最好的方法。

以下是该方案。

我有一个包含用户列表的表。

为简单起见,我们说它看起来像这样:

Mike | male
Amy  | female
Andy | male 

等等。

然后我有一个颜色列表,让我们说4种颜色:

red
blue
green
yellow

任何用户都可以分配一种或多种颜色。

我是否向名为assignedColours的用户表添加新列,创建一个名为colours的新表,如下所示:

id   |   colour
1    |   red
2    |   blue
3    |   green
4    |   yellow

然后分配然后在用户assignedColours coloumn中存储一个数组,如

Mike   | Male   | 2,3
Amy    | Female | 1,3,4

我是否使用颜色列创建颜色表,并将用户分配到该列,如:

Red     |   Blue    |   Green    |   Yellow
        |   Mike    |   Mike     |   
Amy     |           |   Amy      |   Amy

还是有更好的方式一起完成这项工作吗?

我正在寻找一个答案,哪一个是首选方式和原因。

4 个答案:

答案 0 :(得分:4)

如果您需要按颜色搜索,您的第一个解决方案会给您带来问题。

当你添加更多颜色时,你的第二个会给你额外的工作。

另一张加入人与人的表格。颜色将是一个很好的方式去。查看有关多对多关系的信息:http://www.singingeels.com/Articles/Understanding_SQL_Many_to_Many_Relationships.aspx

答案 1 :(得分:4)

你会想要一个UserColours表...以及用户&颜色。

2个列,UserId,ColourId

UserId上的主键,ColourId,因此它们没有重复项。

答案 2 :(得分:3)

好吧,像MySQL这样的RDS(关系数据存储)这个想法就是拥有data normalized,因此很容易搜索。

因此,你最好的选择是保存一张颜色表,一个用户表和一个多对多表,保存用户颜色,他们的定义就是这一行

用户表

id | int
name | varchar
gender | varchar

颜色表

id | int
name | varchar

users_colors表

id | int
user_id | int
color_id | int
通过这种方式,您可以轻松找到具有特定颜色的所有用户,而使用非规范化方案,您会遇到问题,如何查询具有特定颜色的用户而不是其他用户?

答案 3 :(得分:3)

为什么不创建邻接表?它将允许更容易的连接和设置外键。

示例:

<强> 用户

id| name | gender
-----------------
1 | Mike | male
2 | Amy  | female
3 | Andy | male 

<强> 颜色

id | name
1  | red
2  | blue
3  | green
4  | yellow

<强> UserColors

user_id | color_id
1       | 3
1       | 2
2       | 1
4       | 2

UserColors表允许您将UsersColors相关联。 该概念称为adjacency tablejoin table,用于映射one2manymany2many关系。

您可以在此处找到更为开发的示例:http://www.joinfu.com/2005/12/managing-many-to-many-relationships-in-mysql-part-1/