gpt4 book ai didi

sql - 具有(可避免的)多个 n-m 关系的数据库?

转载 作者:搜寻专家 更新时间:2023-10-30 22:23:36 26 4
gpt4 key购买 nike

我想创建一个关系数据库来存储用户、组和团队。一个组由多个用户组成,用户可以有多个组。您可以将该组想象成聊天组。此外,每个组可以有多个团队,但一个团队专门分配给一个特定的组。然后用户可以加入每个组中的一个团队。不过,他并不是被强制加入一个团队,也可以不加入团队就成为一个团体的成员。为了简单起见,假设我有下表:

+--------------+
| User |
+--------------+
| id int |
| name varchar |
+--------------+

+--------------+
| Team |
+--------------+
| id int |
| name varchar |
+--------------+

+--------------+
| Group |
+--------------+
| id int |
| name varchar |
+--------------+

我不太确定设计数据库的最佳方式是什么。很明显,用户和组之间应该存在 n:m 关系,因为每个用户可以有多个组,反之亦然。

问题是我不太确定如何连接团队表。我可以在用户和团队之间创建一个 n:m 关系,但这里的问题是用户可以加入任何存在的团队,即使他没有在团队分配到的组中注册。我还可以在组和团队之间创建 1:n 关系,但这似乎很复杂,而且最终会在我的数据库中出现循环。

有什么好的方法或通用的做法来处理这种特殊情况吗?

最佳答案

注意事项

[p x]   = predicate  x
(c x.y) = constraint x.y

PK = Primary Key
AK = Alternate Key (Unique)
SK = Proper Superkey (Unique)
FK = Foreign Key

All attributes (columns) NOT NULL

谓词、约束和关系

[p 1] 用户 USER_ID 存在。

(c 1.1) 用户由 USER_ID 标识。

user (USER_ID)  -- p 1
PK (USER_ID) -- c 1.1

[p 2]GROUP_ID 存在。

(c 2.1) 组由 GROUP_ID 标识。

group (GROUP_ID)  -- p 2
PK (GROUP_ID) -- c 2.1

[p 3]GROUP_ID 包含团队 GROUP_TEAM_NO,名为 TEAM_NAME

(c 3.1) 对于每个组,该组可能包含多个团队;对于每个团队,该团队恰好属于一个组。小组团队由 GROUP_ID, GROUP_TEAM_NO 标识。

(c 3.2) 对于每个团队名称,该团队名称恰好属于一个团队。

(c 3.3) 如果一个组包含一个团队,则该组必须存在。

group_team (GROUP_ID, GROUP_TEAM_NO, TEAM_NAME)   -- p 3
PK (GROUP_ID, GROUP_TEAM_NO) -- c 3.1
AK (TEAM_NAME) -- c 3.2
FK1 (GROUP_ID) REFERENCES group (GROUP_ID) -- c 3.3

[p 4] 用户 USER_ID 是组 GROUP_ID 的成员。

(c 4.1) 每个用户可以是多个组的成员;对于每个组,该组可能有多个成员。

(c 4.2) 如果用户是组的成员,则该组必须存在。

(c 4.3) 如果用户是组的成员,则该用户必须存在。

user_group (USER_ID, GROUP_ID)                    -- p 4
PK (USER_ID, GROUP_ID) -- c 4.1
FK1 (GROUP_ID) REFERENCES group (GROUP_ID) -- c 4.2
FK2 (USER_ID) REFERENCES user (USER_ID) -- c 4.3

[p 5] 来自 GROUP_ID 组的用户 USER_ID 加入了团队 GROUP_ID, GROUP_TEAM_NO

(c 5.1) 来自一个组的每个用户都可以加入该组中的一个团队。

(c 5.2) 如果用户从某个组加入团队,则该用户必须是该组的成员。

(c 5.3) 如果用户从一个组加入一个团队,则该组必须包含该团队。

user_team (USER_ID, GROUP_ID, GROUP_TEAM_NO)      -- p 5
PK (USER_ID, GROUP_ID) -- c 5.1

FK1 (USER_ID, GROUP_ID) REFERENCES
user_group (USER_ID, GROUP_ID) -- c 5.2

FK2 (GROUP_ID, GROUP_TEAM_NO) REFERENCES
group_team (GROUP_ID, GROUP_TEAM_NO) -- c 5.3

关于sql - 具有(可避免的)多个 n-m 关系的数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57657194/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com