Abfrage Beziehungen innerhalb der gleichen Tabelle

Ich habe eine Tabelle von entities , die viele-zu-viele Beziehungen zueinander haben können, mit einer zweiten junction . Auf den ersten Blick mag das Design errorshaft erscheinen und schlägt für jede Art von Entität eine separate Tabelle vor. Die Sache ist, dass die Entitäten generisch und vollständig benutzerdefiniert sind. Sie können auch vollständig ad-hoc verbunden sein und jede Entität kann eine unbegrenzte Anzahl von Verbindungen haben. Hier ist ein vereinfachtes Beispiel für meine Tische:

 Entities ------------ Entity | Id | Type ------------------- Event | 1 | Request Stroll | 2 | Activity Dinner | 3 | Activity Angela | 4 | Person Anders | 5 | Person Michael | 6 | Person Junctions ---------------- Left | Right ---------------- 1 | 2 // Connect Request -> Stroll 2 | 4 // Connect Stroll -> Angela 1 | 3 // Connect Request -> Dinner 3 | 5 // Connect Dinner -> Anders 3 | 6 // Connect Dinner -> Michael 

Nun zu meiner Frage:

Ich möchte perfom Abfragen aus der Sicht der verschiedenen Entitäten. Lets sagen, ich möchte auf Anfragen schauen und sehen, welche Aktivitäten sie haben, und alle Personen, die an jeder Aktivität teilnehmen. Ich möchte so ein Ergebnis erzielen:

 Request | Activity | Person ----------------------------- Event | Stroll | Angela | Dinner | Anders | Michael 

Ich würde auch gerne in der Lage sein, die Münze umzudrehen und auf Personen zu schauen und zu sehen, welche Anfragen sie besuchen, wie folgt:

 Person | Request ----------------- Angela | Event Anders | Event Michael | Event 

Wie kann ich Abfragen schreiben, um solche Ergebnisse zu erzielen, und ist es sogar möglich mit der aktuellen Struktur? Ich habe viel time auf das Gehen und die Versuche ohne Glück verbracht, und ich bin sehr dankbar für jede Hilfe.

Hier ist ein SQLFiddle

So macht man das

 SELECT e1.Entity Request, e2.Entity Activity, e3.Entity Person FROM Junctions j1 JOIN Junctions j2 ON j1.`Right` = j2.`Left` JOIN Entities e1 ON j1.`Left` = e1.Id JOIN Entities e2 ON j1.`Right` = e2.Id JOIN Entities e3 ON j2.`Right` = e3.Id; 

SQLFiddle

Um Ihnen zu helfen, zu verstehen – zuerst schloss ich sich an Junctions auf sich selbst so:

 SELECT j1.`Left` Request, j1.`Right` Activity, j2.`Right` Person FROM Junctions j1 JOIN Junctions j2 ON j1.`Right` = j2.`Left`; 

Und dann verbunden mit der Entity , wie Sie sehen können, um die Id zu replace. Einmal für jeden type .

Aber trotzdem denke ich immer noch, dass diese Architektur schrecklich ist und sie neu gestaltet werden muss.