http://dirtsimple.org/2010/11/simplest-way-to-do-tree-based-queries.html bietet einen Algorithmus zum Einfügen und Löschen aus einer Closure Table.
Ich möchte eine ähnliche Datenstruktur modellieren, außer dass Knoten mehrere Eltern haben können.
Gegeben:
Wenn wir entfernen, [B, C]
erwarte ich am Ende:
und wenn wir den Knoten entfernen, B
erwarte ich am Ende Folgendes:
Wenn Sie jedoch den Algorithmus des Autors zum Entfernen von Links oder Knoten verwenden, werden Sie feststellen, dass er [D, C, 1]
zum Löschen markiert wird, was unerwünscht ist.
Was ich bisher versucht habe
Ich habe versucht, die ursprüngliche Datenstruktur anzupassen, indem ich eine references
Spalte hinzugefügt habe , die angibt, wie viele Möglichkeiten es gibt, zwischen zwei Knoten zu reisen. In dem obigen Beispiel können Sie von Reisen A
nach C
entweder durch B
oder durch D
. Die Idee wäre gewesen, dass beim B
Entfernen der Pfad von A
zu C
beibehalten wird und die Referenzanzahl von 2 auf 1 abnimmt. Theoretisch war das nett, aber ich konnte nicht herausfinden, wie die Implementierung funktioniert, und jetzt frage ich mich, ob Es ist überhaupt möglich (die Datenstruktur enthält möglicherweise nicht genügend Informationen, um herauszufinden, welche Zeilen entfernt werden sollen).
Was ich frage
Wie würden Sie Closure Tables anpassen, um mehrere Eltern zu unterstützen? Welche alternativen Datenstrukturen würden Sie empfehlen? https://stackoverflow.com/q/4048151/14731 enthält eine exaustive Liste solcher Datenstrukturen, aber es ist nicht klar, welche mehrere Eltern unterstützen (oder für welche am besten geeignet sind).
references
Spalte?Antworten:
Erstellen Sie normalerweise eine Knotentabelle und eine Beziehungstabelle. Gerichtete Diagramme sind nicht wirklich hierarchisch und können Schleifen aufweisen, was das Abfragen erschwert. Wenn Sie sich eine DAG jedoch als einen verallgemeinerten Baum vorstellen (dh einen Baum, der mehrere Eltern zulässt, aber dennoch streng hierarchisch ist) und einen gerichteten Graphen als eine verallgemeinerte DAG (dh wie eine DAG, aber nicht streng hierarchisch), wird es einfacher.
Für eine sehr einfache PostgreSQL-Lösung könnten wir also Folgendes tun:
Dann können Sie so etwas abfragen:
quelle