什么是正确的 ERD 设计方法?
What would be the correct ERD design approach?
- 团队可以有 1 名或更多成员
- 成员可以加入 1 个或多个团队
- 一个成员可以领导 0 个或多个团队。
- 每个团队都有一个成员领导,该团队领导必须是该团队的成员。 (例如,如果一个团队只有 1 名成员,则该成员 必须 是领导者。如果一个团队有多个成员,则该团队的其中一名成员 必须是领导者。你不能让一个成员领导一个他们不属于的团队。)
- 一个团队只能在一个部门。
- 一个部门有1个或多个团队。
我曾尝试设计这个,但我不知道如何实现 dot point 4 (team leaders)。我的 erd 允许任何成员领导任何团队。我该如何修改它?
尝试:http://i.imgur.com/LHwOmL6.png
正如你所看到的,我认为我在 MEMBER 和 TEAM 之间的关系是错误的,因为任何成员都可以领导任何违反我规则的团队。 (忽略类型)
TEAM
-------
team_id
name
department_id
Person
--------
person_id
name
Team Member
---------------
team_id
person_id
is_leader
Department
-----------
Department_id
name
让我们一步步满足您的要求。
A department has 1 or more teams.
那么,让我们创建一个部门 table。
Department
----------
Department ID
Department Name
...
A team can only be in a single department.
现在,我们创建一个团队 table。
Team
----
Team ID
Department ID
Team Name
...
部门 ID 是返回部门的外键 table。 (Department ID, Team ID) 有一个唯一索引,因此您可以看到一个部门中的团队。
Members can join 1 or more teams
Teams can have 1 or more members
首先,我们需要一个会员table。
Member
------
Member ID
Member Name
...
接下来,团队和成员 table 具有多对多关系。我们用 TeamMember 联结 table.
表示这种关系
TeamMember
----------
Team ID
Member ID
Join Time Stamp
...
主键是(Team ID, Member ID)。您还将拥有一个关于(成员 ID、团队 ID)的唯一索引。您从主键中获取团队成员。您从唯一索引中获取该成员所属的团队。
A member can lead 0 or more teams.
Each team has a single member leader...
如您所见,这些是棘手的要求。这是对这些关系建模的一种方法。
Leader
------
Team ID
Member ID
Promotion Time Stamp
...
这个Leadertable有主键(Team ID)和唯一索引(Member ID,Team ID)。主键只是团队 ID,以强制执行每个团队一名领导者的要求。
必须先检查 TeamMember table 上是否存在(团队 ID,成员 ID),然后才能将行写入 Leader table。这强制执行了领导者必须是团队成员的要求。
否则,您可以将这些列放在 TeamMember table 中,对于非领导者,这些列的值为空。
- 团队可以有 1 名或更多成员
- 成员可以加入 1 个或多个团队
- 一个成员可以领导 0 个或多个团队。
- 每个团队都有一个成员领导,该团队领导必须是该团队的成员。 (例如,如果一个团队只有 1 名成员,则该成员 必须 是领导者。如果一个团队有多个成员,则该团队的其中一名成员 必须是领导者。你不能让一个成员领导一个他们不属于的团队。)
- 一个团队只能在一个部门。
- 一个部门有1个或多个团队。
我曾尝试设计这个,但我不知道如何实现 dot point 4 (team leaders)。我的 erd 允许任何成员领导任何团队。我该如何修改它?
尝试:http://i.imgur.com/LHwOmL6.png
正如你所看到的,我认为我在 MEMBER 和 TEAM 之间的关系是错误的,因为任何成员都可以领导任何违反我规则的团队。 (忽略类型)
TEAM
-------
team_id
name
department_id
Person
--------
person_id
name
Team Member
---------------
team_id
person_id
is_leader
Department
-----------
Department_id
name
让我们一步步满足您的要求。
A department has 1 or more teams.
那么,让我们创建一个部门 table。
Department
----------
Department ID
Department Name
...
A team can only be in a single department.
现在,我们创建一个团队 table。
Team
----
Team ID
Department ID
Team Name
...
部门 ID 是返回部门的外键 table。 (Department ID, Team ID) 有一个唯一索引,因此您可以看到一个部门中的团队。
Members can join 1 or more teams
Teams can have 1 or more members
首先,我们需要一个会员table。
Member
------
Member ID
Member Name
...
接下来,团队和成员 table 具有多对多关系。我们用 TeamMember 联结 table.
表示这种关系TeamMember
----------
Team ID
Member ID
Join Time Stamp
...
主键是(Team ID, Member ID)。您还将拥有一个关于(成员 ID、团队 ID)的唯一索引。您从主键中获取团队成员。您从唯一索引中获取该成员所属的团队。
A member can lead 0 or more teams.
Each team has a single member leader...
如您所见,这些是棘手的要求。这是对这些关系建模的一种方法。
Leader
------
Team ID
Member ID
Promotion Time Stamp
...
这个Leadertable有主键(Team ID)和唯一索引(Member ID,Team ID)。主键只是团队 ID,以强制执行每个团队一名领导者的要求。
必须先检查 TeamMember table 上是否存在(团队 ID,成员 ID),然后才能将行写入 Leader table。这强制执行了领导者必须是团队成员的要求。
否则,您可以将这些列放在 TeamMember table 中,对于非领导者,这些列的值为空。