Baumstrukturen in einem RDBMS
Geizhals » Forum » Programmierung » Baumstrukturen in einem RDBMS (8 Beiträge, 135 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
Baumstrukturen in einem RDBMS
21.08.2003, 21:08:38
Hallo,

Altbekanntes Problem: Man moechte eine Baumstruktur (Kategorien und Unterkategorien, ein Diskussionsforum, einen Verzeichnisbaum - was auch immer) moeglichst praktisch in einem RDBMS abbilden. Einiges habe auch schon gegoogled und gelesen, trotzdem noch fragen.

Im grossen und ganzen scheint es zwei Ansaetze zu geben:
  • Speichern mit parentID: D.h. jeder Eintrag hat eine eindeutige ID und weiters ein Attribut parentID, das auf die ID des uebergeordnetes Eintrages verweist. Eine Abfrage, in die richtige Reihenfolge wird das ganze dann mit der verwendeten Programmiersprache gebracht (Alternative dazu waere Rekursion, d.h. fuer jeden Eintrag eine eigene Abfrage => langsam). Beispiel: Threadbasiertes Forum mit PHP und MySQL.
    Vorteile:
    • Einfache, auch fuer Nicht-Informatiker zu ueberblickende DB-Struktur.
    • Einfuegen von neuen Eintraegen schnell und einfach mit einer Anfrage.
    Nachteile:
    • Braucht angeblich (lt. Google) relativ viel Speicher in der Programmiersprache.
    • Einwand von mir: Wieso sollte ich als Programmierer die ganze Sortierarbeit machen, die doch die RDBMS-Entwickler sicher viel besser koenn(t)en?
  • Nested Sets: Dabei wird fuer jeden Eintrag left und right gespeichert. (Informatiker und aehnliche werden diese Baeume wohl gut kennen und verstehen, ich tu's nicht.). Beispiel: Das 'Nested Sets' Modell - Bäume mit SQL.
    Vorteil:
    • Eine einfache Abfrage und das RDBMS liefert einem gleich das, was man haben will.
    Nachteile:
    • Fuer Laien doch schwieriger zu verstehen (d.h. es koennen auch leichter Fehler passieren..)
    • Einfuegen von neuen Eintraegen relativ aufwendig und nicht wirklich performant.


So weit so gut. Jetzt frage ich mich aber, ob man es mit einer ggf. bisschen erweiterten Methode 1 nicht auch schaffen koennte, die Daten mehr oder weniger so vom RDBMS zu bekommen, wie man sie haben will: Zusaetzlich zu ID und parentID wird ein Attribut level eingefuehrt. Da drin steht einfach, "wie tief eingerueckt" der Eintrag ist. (Da sehe ich das erste Problem: Redundanz. Oder war es Nicht-Normalisierung?)
Das zweite Problem: Ich weiss dann schon nicht weiter... - aber ich frage mich halt, ob das nicht irgendwie moeglich waere ?-)

Danke sehr fuer's Lesen...!
Gruss,
Psycho, der dafuer ist, dass der ?-) Smiley (auch) mit :-? funktioniert. Waere doch passender. Wieso denn ein froehlich dreinschauender Mund, wenn man verzweifelt-ratlos ist?
Psycho@Home
--
The only antidote to mental suffering is physical pain.  -- Karl Marx
Antworten PM Übersicht Chronologisch
 
Melden nicht möglich
.
Re: Baumstrukturen in einem RDBMS
23.08.2003, 08:04:12
ein Diskussionsforum, einen Verzeichnisbaum - was auch immer

Ich würde mal behaupten, das genau diese Frage durchaus nicht so nebensächlich ist; ein Verzeichnisbaum ist nur ein Baum, ein Forum eher ein ganzer Wald.  ;-)


Die Nested-Set Methode schaut wirklich hochinteressant aus, muß ich sagen. Vollkommen verstanden hab ichs zwar beim ersten überfliegen auch noch nicht, aber Beispielquerys sind für alle wesentlichen Operationen vorhanden und schauen alle recht einfach aus.


Zusaetzlich zu ID und parentID wird ein Attribut level eingefuehrt.

Könnten es nicht auch 2 zusätzliche Attribute sein; eins nennen wir left und das andere right?  ;-)


Da sehe ich das erste Problem: Redundanz.

Darum wird bei den nested-sets die 'parentID' auch weggelassen, denn die alleine würde ja die Baumstruktur festlegen; aber eine gewisse Art Redundanz bleibt trotzdem noch, schließlich wird die Baumstruktur nun durch 2 Werte pro Knoten definiert, obwohl einer (parentID) ja reichen würde.  ;-)
Aber diese Redundanz ist in dem Fall eben eher Nebensache, zumindest wenn man von z.B. 90% Lesezugriffe ausgeht; das ist der Preis dafür, daß wir den ganzen Baum fix-fertig sortiert und mit 'level' Angabe mit einer einzigen Query ermitteln können. Außerdem müssen sowieso besondere Vorkehrungen getroffen werden, um die Konsistenz der DB sicherzustellen.

Insoferne könnte man in einer Test&Experimentierphase ja auch die parentID zusätzlich im Datensatz lassen; dann wären die nested-sets eigentlich eine mögliche Umsetzung Deines Ansatzes, nämlich zusätzliche Attribute einführen, um den ganzen Baum in einem Rutsch abfragen zu können!  ;-)  :-)


Einfuegen von neuen Eintraegen relativ aufwendig und nicht wirklich performant.

Das wird sicher nur dann zum Problem, wenn wenige Lesezugriffe auf eine Einfügeoperation kommen, denk ich.  ;-)

Wenn das Einfügen von Einträgen zum Performance-Problem wird, ließe sich dem vermutlich durch eine Art 'Einfügen auf Vorrat' kompensieren; der Aufwand mehrere Knoten einzufügen sollte nicht wesentlich höher sein als der für einen Knoten.

Außerdem könnte man die Strukturdaten (rootID, nodeID, left, right) von den eigentlichen Nutzdaten (nodeID, payload) trennen und die ersteren in einer Tabelle ablegen, die im RAM gehalten wird, womit auch der Update-Aufwand gewaltig reduziert wird. Speichert man zusätzlich mit den Nutzdaten auch noch die parentID ab, dann kann diese Strukturdaten-Tabelle bei jedem Neustart frisch erzeugt werden. So hat man dann das Beste aus beiden Welten!  ;-)

lg
mIstA
Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung