Hallo,
ich habe hier eher eine konzeptionelle Frage.
Ich habe eine Struktur die einem Baum ähnelt. Etwa 10 Ebenen tief und hunderten von Einträgen.
Meine Frage, wie speichere ich den Baum in einer DB? DB deshalb weil Elemente auf Daten verweißen welche sich gut in einer DB abbilden lassen. Werden aber auch zig Tabellen.
Ich glaube irgendwie stehe ich jetzt auf der Leitung.
Bilde ich für jede Ebene dann eine Tabelle mit 3 Spalten (Id, ElementName, SubElementId).
Das Problem, ich müßte später Knoten an einer definierten Stelle einfügen können, als DB Anweisung wüßte ich da jetzt garnicht weiter.
Z.B. eine Struktur eines Autos.
Auto -> Antrieb -> Motor -> Getriebe -> Zahnräder ->
Auto -> Antrieb -> Motor -> Zylinder -> Kolben -> Kolbenring -> ...
Auto -> Karosserie -> Tür -> Türgriff
Jedes Element könnte jetzt Eigenschaften wie Spezifikation, Zeichnung, Gutachten, Konformitätserklärung, usw. haben.
Gruß
Alfa
Hallo AlfameisterT,
ein Baum ist ja eine rekursive Struktur. Deshalb reicht eine Tabelle mit Id, ElementName, SubElementId.
herbivore
und für jedes Subelement eine neue Tabelle anlegen? Irgendwie habe ich das Gefühl das ich da mit der Arbeit nicht mehr hinter her komme...
Hallo AlfameisterT,
wie ich schon schrieb: nur eine Tabelle! Für den ganzen Baum nur eine oder sogar für einen ganzen Wald nur eine.
Für jedes (Sub-)Element eine Zeile.
herbivore
Um den Baum dann visuel abzubilden müßte ich dann x-mal die Tabelle durchlaufen und Id's vergleichen ob ein SubElementId nochmal in einer Zeile als Id vorkommt?
Nein, man legt nicht für jedes SubElementID eine neue Tabelle an.
Du hast diese eine Tabelle und da kommen die entsprechenden Datensätze rein.
Das SubElementID sagt nur aus unter welchem anderen Datensatz dies untergeordnet ist.
Beispiel:
ID ElementName SubElementID
1 Auto 0
2 Antrieb 1
3 Motor 2
4 Getriebe 3
5 Zylinder 3
6 Zahnräder 4
Dies wäre ein Teil deiner vorgegebenen Datensätze.
Wenn du das ganze ausliest dann kannst du mit einer Methode GetSub(ID) das entsprechende SubElement(e) auslesen.
Für die Visualisierung erstellst Du eine rekursive Funktion. Wie man es auch bei anderen Trees macht.
Hallo AlfameisterT,
wenn du einen Baum in der Tabelle hast, kannst du auch alle Zeilen auf einmal laden und diese im Speicher zusammensetzen. Aber du hast schon Recht, relationale Datenbanken haben einige Nachteile, wenn man mit Bäumen arbeiten will.
Wenn du mehrer Tabellen hättest, wäre das Zusammensetzen auch nicht leichter.
herbivore
Und was wäre eine Alternative?
Mit XML Files arbeiten, und nur die letztendlichen Daten in einer DB ablegen?
.
Hallo AlfameisterT,
XML-Dateien eignen sich sehr gut, um Bäume zu speichern. Aber du wärst sicher nicht der erste, der Bäume in einer relationalen DB speicherst, ohne unterzugehen.
herbivore
Original von AlfameisterT
Um den Baum dann visuel abzubilden müßte ich dann x-mal die Tabelle durchlaufen und Id's vergleichen ob ein SubElementId nochmal in einer Zeile als Id vorkommt?
Für solche Abfragen gibt es den sogenannten Self-Join, der nimmt dir wenigstens die Arbeit ab mittels SQL den Baum abzulaufen. Performant ist der allerdings auch nicht wirklich. Relationale Systeme haben nunmal Probleme mit solchen Daten.
Ist das Problem dramatisch müßte man auf hierarchische Datenbanken wie IBM/DB2 oder native Objektdatenbanken ausweichen. Die organisieren ihre Daten anders und haben daher solche Probleme nicht.
XML ist natürlich auch ein Weg. Auch hierfür gibt es spezielle Datenbanken - XML-Datenbanken.
ich habe hierzu einen Interessanten Artikel gefunden
In was für eine Tabelle kann ich die Werte speichern ?
ID ElementName SubElementID ?
Hallo Arthuro,
das ist ungünstig, du brauchst den Knoten ja soviele Einträge, wie er Unterknoten hat Dadurch wäre der ElementName redundant. Deshalb solltest du zwei Tabellen machen:
ID ElementName
ID SubElementID
herbivore
Womit mach ich diese Tabellen am besten ? Darauf war meine frage eigentlich drauf bezogen.
Hallo Arthuro,
das kannst du dir aussuchen. Wie es geht, sollte man wissen. Siehe [Hinweis] Wie poste ich richtig? Punkt 1.1.1. Eine Möglichkeit ist natürlich SQL: CREATE TABLE.
herbivore