数据库设计。一对多还是多对多?

时间:2016-01-11 20:43:49

标签: mysql sql database sqlite relational-database

在我的应用程序中,我需要为用户分配多个组。有1000多个用户和10-15个组。

哪种数据库设计更好?

一对多:

USER_ID | GROUP_1 | GROUP_2 | ... | GROUP_15
--------------------------------------------
 1      | true    | false   | ... | true
 2      | false   | true    | ... | true
 3      | true    | true    | ... | true
 .      | .       | .       | ... | . 
 .      | .       | .       | ... | . 
 .      | .       | .       | ... | . 

或多对多:

USER_ID | GROUP_ID 
------------------
 1      | 1
 1      | 15
 2      | 2
 2      | 15
 3      | 1
 3      | 2
 3      | 15
 .      | .       
 .      | .       
 .      | .       

3 个答案:

答案 0 :(得分:2)

毫无疑问,多对多是更好的设计。

第一种设计使编写查询变得困难。请考虑以下例行查询。

  1. 指定用户是否在指定的组中?为此,您必须为每个组使用不同的查询。这是不可取的。此外,如果您使用组的列名,则组列表是数据库模式的一部分,而不是数据的一部分,其中用户是数据。
  2. 指定用户属于哪些群组?您可以简单地返回单行,但许多应用程序可能更喜欢(并且精通)迭代结果集。迭代列的子集是可行但不自然的。
  3. 指定组包含哪些用户?现在您回到每个组的不同查询.. 我将演示这些东西作为练习留给读者。 SQL数据库近似的关系模型旨在处理关系和键(表和主键/外键)。信息应存在于一个(且仅一个)AS AS(不是元数据)的地方。多列方法缺乏规范化,将来会成为维护问题。
  4. 注意:我编辑了此回复以纠正我对原始代码的误读。然而,评论的主旨是相同的。第二个(多对多)是要走的路。

答案 1 :(得分:0)

No 2是标准的,你可以随时增加组的数量,也可以轻松处理简单的sql join查询。

答案 2 :(得分:0)

如果您想遵循实体关系模型的规则:

Many-to-many: users can belong to different groups & groups can have multiple users.

One-to-many: a user belongs to one group & groups can have multiple users.

你的第二个例子是多对多的,你的第一个例子不是一对多的。一对多将是:

USER_ID | GROUP_ID 
------------------
 1      | 1
 2      | 15
 3      | 2
 4      | 15
 5      | 1
 6      | 2
 7      | 15

其中user_id必须是唯一的。