相互引用的表

时间:2015-02-19 18:27:27

标签: database-design foreign-key-relationship circular-dependency

我有两个循环依赖的表; 每个小组都有一名领导成员

+---------+-------+----------+
| GroupId | Group | MemberId |
+---------+-------+----------+
|       1 | g1    |        1 |
+---------+-------+----------+

并且每个成员都属于一个组:

+----------+--------+---------+
| MemberId | Member | GroupId |
+----------+--------+---------+
|        1 | m1     |       1 |
+----------+--------+---------+

一种可能的解决方案是:

+----------+--------+---------+---------+
| MemberId | Member | GroupId | Leading |
+----------+--------+---------+---------+
|        1 | m1     |       1 |       1 |
+----------+--------+---------+---------+

但由于成员与领导者之比很高,导致非规范化。

设计这个的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

这两个表格设计正确。 您拥有所有信息:

1. groupID,GroupName,LeaderMemberID; 
2. MemberID,MemberName,MemberGroupID;

如果您对同一个组有多个领导者,和/或每个成员可能属于多个组,则可能会出现此问题。

但您可以轻松地将设计更改为以下常用方法:

1. groupID,GroupName; 
2. MemberID,MemberName;
3. MemberID,GroupID,isLeader;

我希望它有所帮助。

答案 1 :(得分:0)

假设每个小组只能有一个领导者,我说你的第一个例子没问题。虽然我会称之为领导者领域" LeadMemberId"或者其他一些而不仅仅是" MemberId",因为看着桌子的其他人可能会对在组记录中拥有单个成员ID意味着什么感到严重困惑。

如果一个群体可以拥有多个领导者,那么我可以添加一个" IsLeader"标记到成员记录。大多数记录都有假或0的事实是无关紧要的。但是,如果只有一个,我会避免这样做,因为数据结构暗示可能有多个,并且有人可能会犯错并在多个记录中将标志设置为true,这可能会让您感到悲伤