Tree günstig mit Datenbank verwenden

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Tree günstig mit Datenbank verwenden

Beitrag von Michl »

Hallo allerseits,

ich habe wieder mal eine Designfrage. Es geht mir dabei nicht um die Umsetzung in Code.

Bei der Umstellung eines bestehenden Projekts möchte ich gern meine starre Struktur dynamisch anpassbar machen. Im kongreten Fall möchte ich ein Leistungsverzeichnis aus bestehenden Einzelpositionen zusammenklicken können. Bisher habe ich eine starre Stuktur in der Datenbank: Gewerk -> Teilgewerk -> Position. Neu möchte ich, dass folgende Konstellationen möglich sind:

Code: Alles auswählen

- Position a                                            -> Pos 1 im LV
- Position b                                            -> Pos 2 im LV
- Gewerk a - Position a                                 -> Pos 3 im LV
- Gewerk b - TeilGewerk a - Position a                  -> Pos 4 im LV
                  └-------- Position c                  -> Pos 5 im LV
- Gewerk e - TeilGewerk a - TeilGewerk d - Position x   -> Pos 6 im LV
                                 └-------- Position y   -> Pos 7 im LV
                                 └-------- Position z   -> Pos 8 im LV

Man soll also jeder Node sagen können, ob sie eine Position oder eine Kategorie (die ihrerseits Kategorien und/oder Positionen enthalten kann) darstellt.

Unklar ist mir nun, wie ich diese Struktur am besten in der Datenbank speichere. Bis jetzt kam mir nur in den Sinn, immer den Parent einer Node mit zu speichern und alle Nodes in eine Tabelle zu werfen. Das hat aber den Nachteil, dass ich zur Laufzeit die Tabelle einmal komplett laden muss und daraus die Baumstruktur generieren muss. Bei einem ersten Test mit PostgreSQL, Zeos und VirtualStringTree hat das auch funktioniert, allerdings habe ich das Gefühl, dass man das auch eleganter lösen könnte.

Wie könnte man eine derartige Struktur in einer Datenbank speichern, ohne beim Start den kompletten Datensatz laden und bei Veränderung den kompletten Datensatz speichern zu müssen.

Vielen Dank für hilfreiche Denkanstöße

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten