Angenommen, Sie haben eine flache Tabelle, in der eine geordnete Baumhierarchie gespeichert ist:
Id Name ParentId Order
1 'Node 1' 0 10
2 'Node 1.1' 1 10
3 'Node 2' 0 20
4 'Node 1.1.1' 2 10
5 'Node 2.1' 3 10
6 'Node 1.2' 1 20
Hier ist ein Diagramm, wo wir haben [id] Name. Wurzelknoten 0 ist fiktiv.
[0] Wurzel
/ \.
[1] Knoten 1 [3] Knoten 2
/ \ \
[2] Knoten 1.1 [6] Knoten 1.2 [5] Knoten 2.1
/.
[4] Knoten 1.1.1
Welchen minimalistischen Ansatz würden Sie verwenden, um dies als korrekt geordneten, korrekt eingerückten Baum in HTML (oder Text) auszugeben?
Angenommen, Sie haben nur grundlegende Datenstrukturen (Arrays und Hashmaps), keine ausgefallenen Objekte mit übergeordneten / untergeordneten Referenzen, kein ORM, kein Framework, nur Ihre beiden Hände. Die Tabelle wird als Ergebnismenge dargestellt, auf die zufällig zugegriffen werden kann.
Pseudocode oder einfaches Englisch ist in Ordnung, dies ist eine rein konzeptionelle Frage.
Bonusfrage: Gibt es eine grundlegend bessere Möglichkeit, eine solche Baumstruktur in einem RDBMS zu speichern?
BEARBEITUNGEN UND ERGÄNZUNGEN
So beantworten Sie die Frage eines Kommentators ( Mark Bessey ): Ein Stammknoten ist nicht erforderlich, da er ohnehin nie angezeigt wird. ParentId = 0 ist die Konvention, um "diese sind die oberste Ebene" auszudrücken. In der Spalte Reihenfolge wird definiert, wie Knoten mit demselben übergeordneten Element sortiert werden.
Die "Ergebnismenge", von der ich gesprochen habe, kann als eine Reihe von Hashmaps dargestellt werden (um in dieser Terminologie zu bleiben). Denn mein Beispiel sollte schon da sein. Einige Antworten gehen die Extrameile und konstruieren es zuerst, aber das ist okay.
Der Baum kann beliebig tief sein. Jeder Knoten kann N untergeordnete Knoten haben. Ich hatte jedoch nicht genau einen Baum mit "Millionen von Einträgen" im Sinn.
Verwechseln Sie meine Wahl der Knotenbezeichnung ('Node 1.1.1') nicht mit etwas, auf das Sie sich verlassen können. Die Knoten könnten ebenso gut als "Frank" oder "Bob" bezeichnet werden, es ist keine Namensstruktur impliziert, dies diente lediglich dazu, sie lesbar zu machen.
Ich habe meine eigene Lösung veröffentlicht, damit ihr sie in Stücke reißen könnt.