Zu disem Thema gibt es im Internet eigetnlich recht gute Ansätze, Erklärungen, Beispiele. Einfach mal nach "tree structure database" googeln.
Bei mir sieht die Struktur meist (vereinfacht) so aus:
Code:
CREATE TABLE TreeStruct (
ID INT IDENTITY,
MasterID INT NULL,
Position INT NOT NULL,
(...daten...)
)
Wobei MasterID immer auf den Parent zeigt. Ist MasterID = NULL, dann ist es die oberste Ebene.
Das Feld Position nutze ich dazu die relative Position zu speichern, damit der Baum wieder genau so geladen werden kann wie er gespeichert wurde (Reihenfolde der child-Knoten). Das könnte dann z.B. so aussehen:
Code:
ID MasterID Position
1 NULL 0
2 1 0
3 2 0
4 2 1
5 2 2
6 2 3
7 2 4
8 7 0
9 7 1
10 2 5
11 2 6
12 2 7
13 12 0
Laden der Struktur ist relativ einfach. Es sollte beim Laden immer nach MasterID, Positition sortiert werden (ORDER BY MasterID, Position), damit beim Erzugen der der Untereinträge der Master existiert und die Untereinträge in der gewünschten Reihenfolge erzeugt werden.
Speichern ist mit etwas Aufand verbunden. Bei kleinen Strukturen kann man die kompletten Daten löschen und einfach neu erzeugen (einfachster Weg). Bei umfangreicheren Strukturen nutze ich spzielle Mechanismen, die intern prüfen ob Datnsätze erzeugt, geändert, verschoben oder gelöscht wurden. Neue Datnsätze werden z.B. über ID = -1 identifiziert. Modifizierte Einträge werden an einem "Modified" flag identifiziert. Für gelöschte Einträge gibt es ein Array, welches die ID der gelöschten Datensätze enthält.
Das ganze ist mit etwas Aufwand verbunden, hat aber den Vorteil, dass man nach belieben ändern kann und alles bei Bedarf in einem Rutsch gespeichert werden kann (Transaction).
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)