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

Database design. One-to-many or Many-to-many?

在我的应用程序中,我需要为我的用户分配多个组。有 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
 .      | .       
 .      | .       
 .      | .       

?

No 2 为标准,您可以随时增加组数,也可以轻松处理简单的 sql 加入查询。

many-to-many无疑是更好的设计。

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

  1. 指定用户是否在指定组中?为此,您必须对每个组使用不同的查询。这是不希望的。此外,如果您对组使用列名,则组列表是数据库模式的一部分,而不是数据的一部分,用户就是数据。
  2. 指定用户属于哪些组?您可以简单地 return 单行,尽管许多应用程序可能更喜欢(并且精通)遍历结果集。遍历列的子集是可行的,但不自然。
  3. 指定组包含哪些用户?现在您回到了每个组的不同查询。 我将把这些东西的演示作为练习留给 reader。 SQL 数据库近似的关系模型旨在处理关系和键(表和 primary/foreign 键)。信息应该作为数据(而非元数据)存在于一个(且仅一个)位置。 multi-column 方法缺乏规范化,将来维护起来会很头疼。

注意:我编辑了此回复以纠正我对原始代码的误读。然而,评论的主旨是相同的。第二个(many-to-many)是要走的路。

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

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.

你的第二个例子是 many-to-many,你的第一个不是 one-to-many。 one-to-many 将是:

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

其中 user_id 必须是唯一的。