Peter Thomassen: Baumstruktur in einem Statement abgrasen

Beitrag lesen

Hallo Ilja,

danke für deine Antwort!

probleme der direkten rekursion sind zum beispiel, wenn otto der chef von karl ist und karl der chef von otto. dann habe ich damit probleme der gegenseitigen abhängigkeit, man könnte weder karl noch otto löschen, die sich sicherlich mit wiederum extra regeln beheben lassen. aber ich muss bei solch einem daten-design immer wieder aufpassen.

Stimmt, Rekursionen können zyklische Graphen abbilden, Nested Sets nur Bäume ...

ein anderes beispiel für indirekte rekursion wären fußballspieler. dabei gibt es eine tabelle spieler und eine tabelle manschaften. jeder spieler muss einer manschaft zugeordnet sein und jede manschaft hat einen kapitän. bei dieser gegensaeitigen abhängkeit der zwei tabelle habe ich nun das ei und henne problem, ich kann keinen spieler eingeben, weil es noch keine manschaft gibt. und ich kann keine manschaft eingeben, weil es noch keinen spieler gibt, der kapitän sein kann.

Nun ja, du musst ja Foreign Keys nicht derart exzessiv nutzen bzw. kannst das Anlegen von Mannschaft samt Kapitän in eine Transaktion packen, die eine Ausnahme für Foreign Keys erlaubt.

Bei mir könnte es ein ähnliches Problem geben, da es sich um Kunden und Verträge handelt. Nach deiner Argumentation könnte ich keinen Kunden anlegen, weil es noch keine Vertrag für ihn gibt, und umgekehrt. Die Lösung war in diesem Falle die Abstraktion von "Kunde" zu "Person", die auch unabhängig von Verträgen existieren und deshalb zuerst angelegt werden können. Personen, denen langfristig kein Vertrag zugeordnet sind, können ja potentielle Geschäftspartner o.ä. sein.

Ich habe mir mal die Sache mit den Nested Sets durchgelesen und für gut befunden. Auf Grund der Tatsache, dass es sich in meinem Falle aber nicht um tiefe, sondern bloß um viele Bäume handelt (von denen in der Regel nur einer verarbeitet werden soll), werde ich bei meinem PHP-Workaround bleiben und mit Erscheinen von MySQL 5 auf eine Stored Function ausweichen, die mit Hilfe einer Schleife dasselbe realisiert -- bloß bequem in Form von SELECT *, getMain(id) AS main FROM contract. :-)

Bye,
Peter