![]() |
Datenbank: MSSQL • Version: 2000 • Zugriff über: Delphi ADO Komponenten
[Tabellendesign] Mehrstufige Unterkategorien
Hallo
Ich hätte eine Datenbank-technische Frage und zwar: Ich muss ein Programm schreiben, in welchem Fragen/Probleme und Antworten/Dokumente etc. dazu gespeichert werden können. Es soll vor allem in unserer IT-Abteilung benutzt werden, da wir nur 4 Leute sind und so meist alle an etwas anderem arbeiten und viele Probleme öfters auftauchen und dann nur einer bescheid weiss. Es sollen Kategorien und mehrere Stufen an Unterkategorien angelegt werden können, doch genau da häng ich fest. Angenommen es soll so aussehen: IT --Programmierung ----Delphi ----PHP ----C# --Hardware --Software ----Windows Xp --Sonstiges Dann mach ich ja ne Tabelle namens Kategorien, nur da weiss ich nicht wie ich es anstellen soll, dass ich einer Kategorie eine Unterkategorie angeben kann und dann in Delphi herausfinden kann, auf welchem Level sich die Kategorie befindet. Ich hoffe ihr versteht die Frage. Wäre um einen Denkanstoss sehr dankbar. |
Re: [Tabellendesign] Mehrstufige Unterkategorien
Ich glaube, was Du suchst, sind
![]() |
Re: [Tabellendesign] Mehrstufige Unterkategorien
Einfach Tabelle eine Feld erweitern, das die ID des Vorgängers enthält. man könnte auch den Level mit ablegen, wäre aber gefährlich, wenn die Kategorie verschoben oder das Schema weiter aufgedrösselt wird.
|
Re: [Tabellendesign] Mehrstufige Unterkategorien
Hallo,
oder um es kurz zu machen. Deine Kategorie-Tabelle enthält Id Integer PreId Integer Name Char PreId ist entweder 0, für Hauptkategorie oder >0, dann ist es eine Subkategorie und PreId zeigt auf die eltern-Kategorie. Ich würde noch eine Dummy-Kategorie Id=0, PreId=0 anlegen und dann auf PreId einen ForeignKey auf Id setzen. Heiko |
Re: [Tabellendesign] Mehrstufige Unterkategorien
Ich habe da in meinem alten Projekt ein ähnliches Problem gehabt und es auf andere Art gelöst (entspricht aber definitiv nicht einer Normalform ;-) ): Das Feld Kategorie enthielt einen beliebigen Pfad. Unterordner wurden durch \ getrennt. Mit einer kleinen Funktion konnte ich mir alle Datensätze in einem Treeview als Baum darstellen lassen. Den "Pfad" konnte man schön zerlegen und so auch ohne weiteres die Tiefe bestimmen. Die Funktion ist allgemein geschrieben, ich habe sie nicht zu Hand, wenn aber Interesse besteht, suche ich sie morgen mal raus.
|
Re: [Tabellendesign] Mehrstufige Unterkategorien
Aber warum sollte man Funktionalitäten des DBMS verschmähen und alles selber umständlich lösen? :gruebel:
|
Re: [Tabellendesign] Mehrstufige Unterkategorien
Naja, ich brauchte so nur 2 Funktionen. Eine baut mir den Baum auf, die andere liefert mir alle Kategorien unter einer Oberkategorie zurück. War mir deutlich(!) weniger Aufwand als mit SQLs und Nested Sets zu arbeiten, und daher gar nicht umständlich. Kommt aber natürlich auf das Projekt an und was man damit machen will
|
Re: [Tabellendesign] Mehrstufige Unterkategorien
Und was macht man, wenn nun eine Kategorie geändert, verschoben wird oder das Schema feiner strukturiert wird?
Außerdem finde ich diese Vorgehensweise nicht wirklich einfacher. |
Re: [Tabellendesign] Mehrstufige Unterkategorien
Zitat:
![]() ![]() Mit dem ersteren organisiere ich alle meine Codeschnippsel, Tipps&Tricks und Sonstiges zu meinen Projekten - feine Sache |
Re: [Tabellendesign] Mehrstufige Unterkategorien
Hab momentan ähnliche Überlegungen. 4 Möglichkeiten hab ich dabei in Erwägung gezogen:
- nested sets ==> is wegen höherer Komplexität beim Ändern der Baumstruktur rausgefallen - den Pfad als string(bzw. varchar) speichern ==> Ändern der Baumstruktur is da noch ekliger - Parent speichern ==> da isses relativ schwer die Baumstruktur zu kriegen, weil man ja bei den Blättern anfangen müsste - die IDs der Children als varchar hinterlegen Für letzteres hab ich mich entschieden(außer ich find doch noch was besseres ;-)). Das ist relativ einfach, man kriegt die Baumstruktur leicht, das Verändern des Baums macht auch keine Probleme. Nur beim Entfernen von Knoten is der Aufwand relativ groß, weil alle Einträge durchgegangen werden müssen um eventuelle inkonsistenzen zu vermeiden. mfg Christian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz