数据库设计。一对多还是多对多?
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无疑是更好的设计。
第一种设计使编写查询变得困难。考虑以下例行查询。
- 指定用户是否在指定组中?为此,您必须对每个组使用不同的查询。这是不希望的。此外,如果您对组使用列名,则组列表是数据库模式的一部分,而不是数据的一部分,用户就是数据。
- 指定用户属于哪些组?您可以简单地 return 单行,尽管许多应用程序可能更喜欢(并且精通)遍历结果集。遍历列的子集是可行的,但不自然。
- 指定组包含哪些用户?现在您回到了每个组的不同查询。
我将把这些东西的演示作为练习留给 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 必须是唯一的。
在我的应用程序中,我需要为我的用户分配多个组。有 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无疑是更好的设计。
第一种设计使编写查询变得困难。考虑以下例行查询。
- 指定用户是否在指定组中?为此,您必须对每个组使用不同的查询。这是不希望的。此外,如果您对组使用列名,则组列表是数据库模式的一部分,而不是数据的一部分,用户就是数据。
- 指定用户属于哪些组?您可以简单地 return 单行,尽管许多应用程序可能更喜欢(并且精通)遍历结果集。遍历列的子集是可行的,但不自然。
- 指定组包含哪些用户?现在您回到了每个组的不同查询。 我将把这些东西的演示作为练习留给 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 必须是唯一的。