没有主要实体的多对多递归关系

时间:2017-09-07 00:14:37

标签: sql-server database-design

我对递归关系的链接表有多种需求,其中一条记录不是另一条记录的明确“父”记录。这是一个例子,我希望将我的问题视为内心,因为我可以展示或解释它:

(Person)
Id   Person
-------------
1    Bob
2    Sue

如果Sue是Bob的母亲,那么使用Relationship表是合理的:

(Relationship)
PersonId1    PersonId2    Relationship
----------------------------------------
2            1            Mother/Son

但如果他们是堂兄弟,那可能是:

(Relationship)
PersonId1    PersonId2    Relationship
-----------------------------------------
2            1            Cousin/Cousin

OR

(Relationship)
PersonId1    PersonId2    Relationship
---------------------------------------
1            2            Cousin/Cousin

这是......丑陋....并且在连接和where子句中需要不断的OR或UNIONS。

以下看似干净但非常冗长,但也许没有更好的事情:

(Relationship)
Id    Type
----------------------
1     Cousin/Cousin

(Relationship_Person)
RelationshipId    PersonId
---------------------------
1                 1
1                 2

有更好的模式吗?

提前谢谢!

2 个答案:

答案 0 :(得分:2)

也许这应该是一个评论,但我认为在第一种情况下你应该有两行:

PersonId1    PersonId2    Relationship
---------------------------------------
1            2            Son
2            1            Mother

然后更有意义:

PersonId1    PersonId2    Relationship
---------------------------------------
1            2            Cousin
2            1            Cousin

答案 1 :(得分:0)

您需要三个键值,一个用于Person(PID),一个用于关系类型(RTID),另一个用于将关系组合在一起(RID)。

RID     RTID              PID
1       1 (Mother)        1 (Mary)
1       2 (Son)           2 (Joe)
2       3 (Cousin)        2 (Joe)
2       3                 3 (Sue)
2       3                 4 (Carl)
1       2 (Son)           5 (Chris)
1       4 (Daughter)      6 (Kathy)
2       3 (Cousin)        5 (Chris)
2       3                 6 (Kathy)
1       5 (Father)        7 (Rick)

一旦建立了一个新的关系组,就很容易在不影响其他成员的情况下向关系中添加新成员,并且您不会像堂兄弟那样拥有无限制关系中的笛卡尔积。无论该关系的成员数量如何,每个人对于他们参与的每个关系都会有一行。

你可能还想考虑有效的&处理出生/死亡和婚姻/离婚的到期日。