2017-09-07 7 views
1

Ich hatte mehrere Anforderungen für eine Verknüpfungstabelle für rekursive Beziehungen, wo ein Datensatz kein klarer "übergeordneter" Datensatz gegenüber dem anderen ist. Hier ist ein Beispiel, dass ich hoffe, dass mein Problem als viszerales macht, wie ich es zeigen oder erklären kann:Viele-zu-viele rekursive Beziehungen ohne eine primäre Entität

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

Wenn Sue Bob Mutter ist es wäre sinnvoll, die Beziehungstabelle als solche zu verwenden:

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

Aber wenn sie Cousins ​​sind könnte es sein, entweder:

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

ODER

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

Dies ist .... hässlich .... und würde konstante ORs oder UNIONS in Joins und Where-Klauseln erfordern.

Die folgende scheint sauber, aber sehr ausführlich, aber vielleicht gibt es nichts Besseres:

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

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

Gibt es ein besseres Muster?

Vielen Dank im Voraus!

Antwort

2

Vielleicht sollte dies ein Kommentar sein, aber ich denke, im ersten Fall, dass Sie zwei Reihen haben sollte:

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

Dann macht es mehr Sinn zu haben:

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

Gordon am Anfang, als ich Ihren Kommentar sah Ich dachte ja gut duh das ist die Hässlichkeit meines Problems. ABER obwohl es sich anfühlt wie die Abteilung für Redundanz-Abteilung und wäre die falsche Antwort auf jeden College-Test ..... Ich denke, es könnte die richtige K.I.S.S sein antworte selbst dann, wenn es zahlreiche Normalisierungsregeln verletzt. Danke, ich bin überrascht/schockiert. Ich denke darüber nach! – jbruce

0

Sie benötigen drei Schlüssel Werte, eine für die Person (PID), eine für den Beziehungstyp (RTID) und eine für die Gruppierung der Beziehungen (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) 

Sobald eine neue Beziehung Gruppe aufgebaut ist, ist es einfach, neue Mitglieder in die Beziehung hinzuzufügen, ohne die anderen Mitglieder zu beeinflussen und Sie nicht das cartesianischen Produkt in unbegrenzten Beziehungen wie Vettern haben. Jede Person hat eine Zeile für jede Beziehung, an der sie teilnehmen, unabhängig von der Anzahl der Mitglieder dieser Beziehung.

Sie können auch prüfen, wirksame & Ablaufdaten für den Umgang mit Geburt/Tod und Ehe/Scheidung.

+0

Vielen Dank, Wes, dass Sie sich so viel Zeit genommen haben, um mein zweites gedankliches Beispiel noch deutlicher zu formulieren. Ich hoffe immer noch, dass jemand ein einfacheres Verknüpfungsmuster hat, aber vielleicht nicht (oder auch nicht). – jbruce

+0

(Person) -> (RelationshipPersonLink) -> (Beziehung) -> (RelationshipPersonLink) -> (Person) ist nur so viele "Hops", um alle zu sehen, die verbunden sind. Ich bin mir sicher, dass ich dies in eine Ansicht bringen und die perfekte Indexierung dafür bestimmen kann. – jbruce

+0

In diesem imaginären "Familien" -Beispiel scheint es keine große Sache zu sein, aber wenn ich einen Drilldown mache bis zu etwa einem Dutzend Beziehungsebenen, um alle verbundenen Komponenten zu sehen, die eine Vier-Sprung-Viele-zu-Viele-Verbindungsrekursion in einem einzigen Aufruf verwenden und dieses Muster in anderen Anwendungen verwenden, fühlt es sich ..... schwer ... an .. .ineffizient? ... ähm .... kompliziert. Ich weiß, das sind schrecklich unwissenschaftliche Erklärungen. – jbruce

Verwandte Themen