2017-09-07 104 views
1

我有一個遞歸關係的鏈接表的多個需求,其中一個記錄不是另一個清楚的「父」記錄。下面是我希望的例子使我的問題,因爲內臟,因爲我可以顯示或解釋:沒有主實體的多對多遞歸關係

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

如果蘇是鮑勃的媽媽這將是合理使用關係表作爲這樣的:

 
(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或UNION。

下顯得乾淨,但很冗長,但也許沒有什麼更好的:

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

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

有沒有更好的模式?

預先感謝您!

回答

2

也許這應該是一個評論,但我認爲在第一種情況下,你應該有兩行:

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

然後它更有意義有:

PersonId1 PersonId2 Relationship 
--------------------------------------- 
1   2   Cousin 
2   1   Cousin 
+0

戈登在第一次看到你的評論時,我以爲是啊,好吧,那是我的問題的醜陋。但是,即使它感覺像冗餘部門,並將在每個大學考試中錯誤的答案.....我認爲這可能是正確的K.I.S.S.即使它打破了大量的規範化規則也是如此。謝謝我很驚訝/震驚我正在考慮這個! – jbruce

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) 

一旦有新的關係組成立,它是簡單的添加新成員的關係,而不會影響其他成員,你不必像表兄弟無限關係笛卡爾乘積。無論該關係的成員數量多少,每個人對於他們參與的每個關係都會有一行。

你可能還想考慮有效的&到期日期來處理出生/死亡和婚姻/離婚。

+0

謝謝Wes花了這麼多時間清楚地重述我的第二個思路想象的例子。我仍然希望有人可能會有一個更簡單的鏈接模式,但它可能不會(甚至可能不)存在。 – jbruce

+0

(Person) - >(RelationshipPersonLink) - >(Relationship) - >(RelationshipPersonLink) - >(Person)就是這麼多「啤酒花」,以查看所有連接。我當然意識到我可以把它放到一個視圖中,並且指出它的完美索引。 – jbruce

+0

在這個想象中的「家庭」示例中,它看起來並不是什麼大不了的事情,但如果我鑽了一個多達十幾個關係層在一次調用中使用四跳多對多鏈接遞歸來查看所有連接的組件,並在其他用途​​中應用此模式時,它會感覺......沉重......呃.. 。低效?進進出出....複雜。我知道,這些是非常不科學的解釋。 – jbruce