AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi DB-Verknüpfungen untergeordneter Tree-Nodes anzeigen
Thema durchsuchen
Ansicht
Themen-Optionen

DB-Verknüpfungen untergeordneter Tree-Nodes anzeigen

Ein Thema von Pfoto · begonnen am 8. Okt 2005 · letzter Beitrag vom 11. Okt 2005
Antwort Antwort
Pfoto

Registriert seit: 26. Aug 2005
Ort: Daun
541 Beiträge
 
Turbo Delphi für Win32
 
#1

DB-Verknüpfungen untergeordneter Tree-Nodes anzeigen

  Alt 8. Okt 2005, 09:19
Datenbank: Absolute Database • Version: 7.1 • Zugriff über: Local ADS
Hallo!

Gibt es eine bewährte Lösung für folgendes Problem?

Ein Treeview soll in meinem Fall eine Art Kategorienliste darstellen.
Einen Datenbankeintrag kann man von einer Liste per Drag & Drop auf einen Node ziehen.
Intern wird dann in einer n:n-Tabelle die ID des Nodes und die ID des DB-Eintrags aufgenommen. Das funktioniert auch.
Was ist jedoch, wenn ich auf den Root des Nodes klicke und alle untergeordeten Einträge anzeigen lassen will?
Alle rekursiv durchlaufen und in ein SELECT-Statement einbauen würde dieses sehr aufblähen und langsam machen.
Ist in diesem Fall meine Überlegung richtig, bei der Verknüpfung mit einem Node auch automatisch Verknüpfungen mit den übergeordneten Nodes anzulegen.

Beispiel:
http://home.arcor.de/sinnspruch/NodeDemo.jpg
Ich verknüpfe meinen Eintrag mit Node 1.2.1
Intern legt das Programm auch Verknüpfungen mit Node 1.2 und Node 1 an.

Der Nachteil ist: Sobald ich einen Eintrag aus Node 1.2.1 lösche, muss ich auch dafür sorgen, dass aus allen übergeordneten Nodes der Eintrag verschwindet. Das macht die Sache bestimmt fehleranfälliger, oder?

Ich hatte auch schon die Version im Kopf, dass statt einer klassischen ID-Nummer die ganze Kombination, also im Beispiel "#1.2.1" gespeichert wird.
Bei einem Klick auf das Eltern-Node, würde dann nach "#1" gesucht werden, was ja auch automatisch "#1.2.2" finden würde. Ein nachträgliches Verschieben eines Nodes wäre aber so ziemlich unmöglich, da sich ja auch die ID ändern müsste (die möglicherweise ja schon verknüpft ist...)
Also irgendwie komme ich da auf keinen grünen Zweig.

Gibt es da überhaupt ein Patentrezept, das sich in der Praxis bereits bewährt ist?

Würde mich über eure Meinungen freuen


Gruß
Pfoto
Jürgen Höfs
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: DB-Verknüpfungen untergeordneter Tree-Nodes anzeigen

  Alt 11. Okt 2005, 10:03
Hallo Pfoto,

Zitat von pfoto:
Intern wird dann in einer n:n-Tabelle die ID des Nodes und die ID des DB-Eintrags aufgenommen.
Nur zur Begriffsbestimmung - durch die von dir erwähnte m:n Beziehung stellen die Knoten der Baumansicht ein Klassifikationsschema dar. Bei einer 1:n Beziehung zwischen den Knoten und deinen Datensätzen würden wir von einer Gliederung sprechen. Der Unterschied im physischen Datenmodell liegt in der Einführung eines Beziehungsdatentyps. Beschränken wir die Betrachtung vorerst auf Gliederungen.

Gliederungsbäume sind essentiell hierarchische Strukturen und können in relationalen Datenbanken nur als selbstrekursive Tabelle umgesetzt werden. Für die weitere Diskussion führe ich die Tabelle OUTLINE (ID, POSITION, TITLE, OUTLINE_ID, ROOT_ID) zur Aufnahme von Gliederungsbäumen ein. Bei Speicherung nur eines einzigen Baumes würde das Attribut ROOT_ID nicht benötigt. ID ist Primärschlüssel, OUTLINE_ID und ROOT_ID sind "Fremdschlüssel" und referenzieren die eigene Tabelle, TITLE ist der Text für den Gliederungseintrag und POSITION die ab 0 gezählte Ordnungsnummer des Eintrages.

Schon beim Füllen des Baumes musst du dich entscheiden - alles auf einmal rein schaffen oder nur was nötig ist? Ich halte in der Regel eine vollständige Gliederung in einer Query offen:

SELECT * FROM OUTLINE WHERE ROOT_ID = :root ORDER BY OUTLINE_ID, POSITION In seltenen Fällen (stark variierender Grad des Baumes) optimiere ich das Laufzeitverhalten, indem ich nur die Knoten eines Parent vorhalte oder den TITLE ausklammere und den Zugriff darauf über einen Zwischenspeicher unterstütze.

Wenn ich für einen Knoten eine vollständige Expansion brauche, dann geht das mit der oben angegebenen Query recht zügig. Es gibt da keinen Grund Hilfsattribute einzuführen, wie z.B. Zeiger auf andere Ebenen. Die Nachteile hast du ja schon selbst erkannt.

Und solltest du jemals Hilfsattribute zur Beschleunigung von Zugriffen brauchen, dann gehören diese Attribute nicht in die OUTLINE Tabelle. Sie werden entweder nur im Hauptspeicher aufgebaut und vorgehalten oder verschwinden in einer zusätzlichen Tabelle, die später über einen Join in eine View eingebracht werden kann. So bleibt dein fachliches Datenmodell unbelastet.

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: DB-Verknüpfungen untergeordneter Tree-Nodes anzeigen

  Alt 11. Okt 2005, 13:07
Hallo Pfoto,

ich verlinke hier mal auf diesen thread - vielleicht betrifft ja der fehlende Powerset Operator auch dich?

marabu
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz