Suchen in Graphen und Bäumen mit SQL
Kann man Graphen und Bäume mit SQL durchsuchen? Ja, man kann. Wenn auch mit einigen Einschränkungen, insbesondere muss die Suchtiefe bereits von Beginn weg festgelegt werden.
Aber erst einmal von vorne. Ein Baum (oder Graph) wird in einer Datenbank meist in einer Tabelle abgelegt die über (mindestens) zwei Felder verfügt. Zum einen währen dies ein Feld für die ID des Elternknotens und ein Feld für die ID des Kindknotens. Jeder Knoten kann nun beliebig viele Einträge in dieser Tabelle haben.
Der erste Schritt ist nun noch sehr einfach. Um alle Knoten auf Level 1 zu durchsuchen brauchen wir nicht mehr als eine einfach SQL-Abfrage.
SELECT t.parent AS "Level 0",Wenn wir nun bis Level 2 Durchsuchen wollen müssen wir die Tabelle mit sich selbst verknüpfen.
t.child AS "Level 1"
FROM tree AS t
WHERE t.parent = 1
AND t.child = 10;
SELECT t1.parent AS "Level 0",
t2.parent AS "Level 1",
t2.child AS "Level 2"
FROM tree AS t1
RIGHT OUTER JOIN tree t2
ON t1.child = t2.parent
WHERE t1.parent = 1
AND (t1.child = 10
t2.child = 10);
Das ganze kann man dann selbstverständlich nach belieben auf die Spitze treiben. Unten mit einer Suche bis zu Level 4.
SELECT t1.parent AS "Level 0",
t2.parent AS "Level 1",
t3.parent AS "Level 2",
t4.parent AS "Level 3",
t4.child AS "Level 4"
FROM tree AS t1
RIGHT OUTER JOIN tree t2
RIGHT OUTER JOIN tree t3
RIGHT OUTER JOIN tree t4
ON t3.child = t4.parent
ON t2.child = t3.parent
ON t1.child = t2.parent
WHERE t1.parent = 1
AND (t1.child = 10
OR t2.child = 10
OR i3.child = 10
OR i4.child = 10);
Diese Suche hat natürlich einige Nachteile, so ist es beim Fund eines Knotens nicht möglich die Suche abzubrechen. Alle weiteren Knoten müssen durchsucht werde. Dies kann, wenn man nicht alle Lösungswege braucht, aus Sicht der Performance verheerend sein. Ausserdem muss die Suchtiefe vorbestimmt werden. Allerdings sollte es kein Problem darstellen die Suche dynamisch, zur Laufzweit für die entsprechende Suchtiefe zu generieren, so kann man auch eine nicht erfolgreiche Suche mit einer höheren Tiefe noch einmal laufen lassen.
Der Grosse Vorteil bei der Suche auf der Datenbank ist natürlich das man eine grössere Geschwindigkeit ereichen kann, als wenn jeder Knoten zu einem Clientprogramm transferiert werden muss.





