我对递归关系的链接表有多种需求,其中一条记录不是另一条记录的明确“父”记录。这是一个例子,我希望将我的问题视为内心,因为我可以展示或解释它:
(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
有更好的模式吗?
提前谢谢!
答案 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)
一旦建立了一个新的关系组,就很容易在不影响其他成员的情况下向关系中添加新成员,并且您不会像堂兄弟那样拥有无限制关系中的笛卡尔积。无论该关系的成员数量如何,每个人对于他们参与的每个关系都会有一行。
你可能还想考虑有效的&处理出生/死亡和婚姻/离婚的到期日。