Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Tree in Datenbank abbilden
AlfameisterT
myCSharp.de - Member



Dabei seit:
Beiträge: 154

Themenstarter:

Tree in Datenbank abbilden

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo AlfameisterT,

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

herbivore
private Nachricht | Beiträge des Benutzers
AlfameisterT
myCSharp.de - Member



Dabei seit:
Beiträge: 154

Themenstarter:

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
AlfameisterT
myCSharp.de - Member



Dabei seit:
Beiträge: 154

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Timur Zanagar
myCSharp.de - Member

Avatar #avatar-3412.jpg


Dabei seit:
Beiträge: 1.457

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Noodles
myCSharp.de - Experte



Dabei seit:
Beiträge: 4.644
Herkunft: Leipzig

beantworten | zitieren | melden

Für die Visualisierung erstellst Du eine rekursive Funktion. Wie man es auch bei anderen Trees macht.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
AlfameisterT
myCSharp.de - Member



Dabei seit:
Beiträge: 154

Themenstarter:

beantworten | zitieren | melden

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

.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Zitat
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.
private Nachricht | Beiträge des Benutzers
AlfameisterT
myCSharp.de - Member



Dabei seit:
Beiträge: 154

Themenstarter:

beantworten | zitieren | melden

ich habe hierzu einen Interessanten Artikel gefunden

http://www.intelligententerprise.com/001020/celko1_1.jhtml
private Nachricht | Beiträge des Benutzers
Arthuro
myCSharp.de - Member



Dabei seit:
Beiträge: 147

beantworten | zitieren | melden

In was für eine Tabelle kann ich die Werte speichern ?
ID ElementName SubElementID ?
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Arthuro
myCSharp.de - Member



Dabei seit:
Beiträge: 147

beantworten | zitieren | melden

Womit mach ich diese Tabellen am besten ? Darauf war meine frage eigentlich drauf bezogen.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers