Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 没有主实体的多对多递归关系_Sql Server_Database Design - Fatal编程技术网

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

Sql server 没有主实体的多对多递归关系,sql-server,database-design,Sql Server,Database Design,我曾多次需要一个链接表来处理递归关系,其中一条记录与另一条记录相比不是明确的“父”记录。下面是一个例子,我希望它能让我的问题尽可能地发自内心地展示或解释: (Person) Id Person ------------- 1 Bob 2 Sue (人) 身份证持有人 ------------- 1鲍勃 2.起诉 如果Sue是Bob的母亲,那么使用关系表是合理的: (Relationship) PersonId1 PersonId2 Relationship -----

我曾多次需要一个链接表来处理递归关系,其中一条记录与另一条记录相比不是明确的“父”记录。下面是一个例子,我希望它能让我的问题尽可能地发自内心地展示或解释:

(Person) Id Person ------------- 1 Bob 2 Sue (人) 身份证持有人 ------------- 1鲍勃 2.起诉 如果Sue是Bob的母亲,那么使用关系表是合理的:

(Relationship) PersonId1 PersonId2 Relationship ---------------------------------------- 2 1 Mother/Son (关系) 人格化关系 ---------------------------------------- 2.1母亲/儿子 但如果他们是表亲,可能是:

(Relationship) PersonId1 PersonId2 Relationship ----------------------------------------- 2 1 Cousin/Cousin (关系) 人格化关系 ----------------------------------------- 表亲/表亲 或

(关系) 人格化关系 --------------------------------------- 1 2表亲/表亲 这是…丑陋的…并且需要在连接和where子句中使用常量or或UNION

以下内容看起来很清晰,但非常冗长,但也许没有比这更好的了:

(Relationship) Id Type ---------------------- 1 Cousin/Cousin (Relationship_Person) RelationshipId PersonId --------------------------- 1 1 1 2 (关系) Id类型 ---------------------- 1表亲/表亲 (关系人) 关系型人格 --------------------------- 1 1 1 2 有更好的模式吗


提前谢谢你

也许这应该是一个注释,但我认为在第一种情况下,您应该有两行:

PersonId1    PersonId2    Relationship
---------------------------------------
1            2            Son
2            1            Mother
那么,更合理的做法是:

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

您需要三个键值,一个用于Person(PID),一个用于Relationship Type(RTID),一个用于将关系分组在一起(RID)

一旦建立了一个新的关系组,就可以简单地向关系中添加新成员,而不会影响其他成员,而且在无界关系(如表兄妹关系)中没有笛卡尔积。每个人参与的每个关系都有一行,而不管该关系的成员数量如何


你也可以考虑处理出生和死亡以及婚姻/离婚的有效和有效期限。

谢谢韦斯花了这么多时间来更清晰地重申我的第二个思路。我仍然希望有人可能有一个更简单的链接模式,但它可能不存在(甚至可能不存在)。(Person)->(RelationshipPersonLink)->(RelationshipPersonLink)->(RelationshipPersonLink)->(Person)就是这么多“跳跃”来查看所有连接。我当然意识到我可以把它放到一个视图中,并为它确定一个完美的索引……在这个想象中的“家庭”示例中,它似乎不是什么大不了的事,但是,如果我深入到十几个关系层,查看所有连接的组件,在一个调用中使用四跳多对多链接递归,将此模式应用于其他用途,会感觉。。。。。沉重?…呃…低效?…嗯…复杂。我知道,这些都是非常不科学的解释。戈登起初当我看到你的评论时,我想是的,嗯,这就是我的问题的丑陋之处。但是,尽管这感觉像是裁员部门,而且在每次大学考试中都是错误的答案……我认为这可能是正确的K.I.S.S.答案,即使它违反了许多标准化规则。谢谢你我很惊讶/震惊我在考虑这个!
PersonId1    PersonId2    Relationship
---------------------------------------
1            2            Cousin
2            1            Cousin
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)