Laden...

Tree in Datenbank abbilden

Erstellt von AlfameisterT vor 18 Jahren Letzter Beitrag vor 16 Jahren 8.329 Views
A
AlfameisterT Themenstarter:in
154 Beiträge seit 2005
vor 18 Jahren
Tree in Datenbank abbilden

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

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo AlfameisterT,

ein Baum ist ja eine rekursive Struktur. Deshalb reicht eine Tabelle mit Id, ElementName, SubElementId.

herbivore

A
AlfameisterT Themenstarter:in
154 Beiträge seit 2005
vor 18 Jahren

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...

49.485 Beiträge seit 2005
vor 18 Jahren

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

A
AlfameisterT Themenstarter:in
154 Beiträge seit 2005
vor 18 Jahren

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?

1.457 Beiträge seit 2004
vor 18 Jahren

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.

N
4.644 Beiträge seit 2004
vor 18 Jahren

Für die Visualisierung erstellst Du eine rekursive Funktion. Wie man es auch bei anderen Trees macht.

49.485 Beiträge seit 2005
vor 18 Jahren

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

A
AlfameisterT Themenstarter:in
154 Beiträge seit 2005
vor 18 Jahren

Und was wäre eine Alternative?
Mit XML Files arbeiten, und nur die letztendlichen Daten in einer DB ablegen?

.

49.485 Beiträge seit 2005
vor 18 Jahren

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

S
8.746 Beiträge seit 2005
vor 18 Jahren

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.

A
AlfameisterT Themenstarter:in
154 Beiträge seit 2005
vor 18 Jahren

ich habe hierzu einen Interessanten Artikel gefunden

http://www.intelligententerprise.com/001020/celko1_1.jhtml

A
147 Beiträge seit 2007
vor 16 Jahren

In was für eine Tabelle kann ich die Werte speichern ?
ID ElementName SubElementID ?

49.485 Beiträge seit 2005
vor 16 Jahren

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

A
147 Beiträge seit 2007
vor 16 Jahren

Womit mach ich diese Tabellen am besten ? Darauf war meine frage eigentlich drauf bezogen.

49.485 Beiträge seit 2005
vor 16 Jahren

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