什么是正确的ERD设计方法?

时间:2015-05-23 11:55:33

标签: sql database-design erd

  • 团队可以有1个或更多成员
  • 会员可以加入一个或多个团队
  • 会员可以领导0个或更多团队。
  • 每个团队都有一名成员领导者,该团队负责人必须是该团队的成员。 (例如,如果一个团队只有一个成员,那个单一成员必须成为领导者。如果一个团队有多个成员,那个团队成员中的一个必须成为领导者。你不能让一个成员领导他们不属于的团队。)
  • 团队只能在一个部门。
  • 一个部门有一个或多个团队。

我试图设计这个,但我无法弄清楚如何实施点4(团队领导者)。我的错误允许任何成员领导任何团队。我该如何修改它?

尝试:http://i.imgur.com/LHwOmL6.png

正如你所看到的,我认为我在MEMBER和TEAM之间的关系是错误的,因为任何成员都可以领导任何违反我规则的团队。 (无视类型)

2 个答案:

答案 0 :(得分:1)

让我们一步一个步骤。

  

一个部门有一个或多个团队。

所以,让我们创建一个部门表。

Department
----------
Department ID
Department Name
...
  

团队只能在一个部门。

现在,我们创建一个Team表。

Team
----
Team ID
Department ID
Team Name
...

部门ID是返回Department表的外键。 (部门ID,团队ID)上有一个唯一索引,因此您可以看到部门中的团队。

  

会员可以加入一个或多个团队

     

团队可以有1个或更多成员

首先,我们需要一个会员表。

Member
------
Member ID
Member Name
...

接下来,Team和Member表有很多关系。我们用TeamMember联结表表示这种关系。

TeamMember
----------
Team ID
Member ID
Join Time Stamp
...

主键是(团队ID,会员ID)。您还将拥有一个唯一索引(会员ID,团队ID)。您可以从主键获得团队成员。您可以从唯一索引中获取该成员所属的团队。

  

会员可以领导0个或更多团队。

     

每个团队都有一位成员领导......

正如您所见,这些是棘手的要求。这是模拟这些关系的一种方式。

Leader
------
Team ID
Member ID
Promotion Time Stamp
...

此Leader表具有主键(Team ID)和唯一索引(Member ID,Team ID)。主键只是团队ID,以强制每个团队一个领导者的要求。

必须检查TeamMember表上是否存在(团队ID,成员ID),然后才能在Leader表上写入行。这强制要求领导者必须是团队的成员。

否则,您可以将这些列放在TeamMember表中,非领导者的列值为null。

答案 1 :(得分:0)

TEAM
-------
team_id
name
department_id

Person
--------
person_id
name

Team Member
---------------
team_id
person_id
is_leader

Department
-----------
Department_id
name