Du solltest die Verknüpfung ID - ParentID (häufig gehört auch noch eine Position für die Reihenfolge dazu) auf jeden Fall in einer separaten
DB-Tabelle speichern.
Sonst sperrt eine Verschiebung des Elements im Baum auch alle von der ID direkt oder indirekt abhängigen Datensätze.
Das führt neben dem Geschwindigkeitsproblem auch schnell zum Lockkonflikt.
Tabelle
ID Daten
TabelleBaum
ID ParentID
Für die Ausgabe bietet sich eine rekursive
DB-Prozedure an.
Code:
procedure GetTabelleBaum(
AParentID integer,
ALevel integer)
returning_values(
ID integer,
Level integer)
as
begin
level = alevel;
id = aparentid;
suspend;
level = level + 1;
for select id
from TabelleBaum
where parentid = :aparentid
order by parentid, id
into :id
do begin
for select id, level
from GetTabelleBaum(:id, :level)
into :id, :level
do begin
suspend;
end
end
end
Code:
select a.level, b.*
from GetTabelleBaum(:ARootID, 0) a
left join Tabelle b on b.id = a.id
Ein Index über "parentid, id" wäre hier sinnvoll.
Mit Hilfe des Level könnte man ein Treeview füllen oder die Daten einfach nur entsprechend viele Leerzeichen einrücken.