PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Klonen hierarchischer Daten

Das rekursive Einlesen dieses Ergebnisses ist schwierig (obwohl möglich). Allerdings ist es normalerweise nicht sehr effizient und es gibt viel besserer Weg, um dieses Problem zu lösen.

Grundsätzlich erweitern Sie die Tabelle um eine zusätzliche Spalte, die den Baum nach oben verfolgt - ich nenne es die "Upchain". Es ist nur eine lange Zeichenfolge, die etwa so aussieht:

name | id | parent_id | upchain
root1 | 1 | NULL | 1:
root2 | 2 | NULL | 2:
root1sub1 | 3 | 1 | 1:3:
root1sub2 | 4 | 1 | 1:4:
root2sub1 | 5 | 2 | 2:5:
root2sub2 | 6 | 2 | 2:6:
root1sub1sub1 | 7 | 3 | 1:3:7:

Es ist sehr einfach, dieses Feld auf dem neuesten Stand zu halten, indem Sie einen Trigger für die Tabelle verwenden. (Entschuldigung für die Terminologie, aber ich habe das immer mit SQL Server gemacht). Jedes Mal, wenn Sie einen Datensatz hinzufügen oder löschen oder das Feld parent_id aktualisieren, müssen Sie nur das Upchain-Feld in diesem Teil des Baums aktualisieren. Das ist eine triviale Aufgabe, da Sie einfach die Upchain des übergeordneten Datensatzes nehmen und die ID des aktuellen Datensatzes anhängen. Alle untergeordneten Datensätze lassen sich leicht mit LIKE identifizieren, um nach Datensätzen mit der Startzeichenfolge in ihrer Upchain zu suchen.

Was Sie effektiv tun, ist, ein bisschen zusätzliche Schreibaktivität für ein großes einzutauschen speichern, wenn Sie kommen, um die Daten zu lesen.

Wenn Sie einen vollständigen Zweig im Baum auswählen möchten, ist dies trivial. Angenommen, Sie möchten die Verzweigung unter Knoten 1. Knoten 1 hat eine Aufwärtskette „1:“, sodass Sie wissen, dass jeder Knoten in der Verzweigung des Baums unter diesem Knoten eine Aufwärtskette haben muss, die mit „1:...“ beginnt. Sie tun also einfach Folgendes:

SELECT *
FROM table
WHERE upchain LIKE '1:%'

Das ist extrem schnell (indizieren Sie natürlich das Upchain-Feld). Als Bonus macht es auch viele Aktivitäten extrem einfach, wie z. B. das Finden von Teilbäumen, Ebenen innerhalb des Baums usw.

Ich habe dies in Anwendungen verwendet, die große Mitarbeiterberichtshierarchien verfolgen, aber Sie können es für so ziemlich jede Baumstruktur (Aufschlüsselung von Teilen usw.) verwenden.

Anmerkungen (für alle Interessierten):

  • Ich habe den SQL-Code nicht Schritt für Schritt erklärt, aber sobald Sie das Prinzip verstanden haben, ist es ziemlich einfach zu implementieren. Ich bin kein großer Programmierer, also spreche ich aus Erfahrung.
  • Wenn Sie bereits Daten in der Tabelle haben, müssen Sie eine einmalige Aktualisierung durchführen, um die Upchains anfänglich zu synchronisieren. Auch dies ist nicht schwierig, da der Code dem UPDATE-Code in den Triggern sehr ähnlich ist.
  • Diese Technik ist auch eine gute Methode, um Zirkelverweise zu identifizieren, die sonst schwer zu erkennen sind.