Mehrere Ebenen -> Normalisierung

peng21

Neuer Benutzer
Beiträge
3
Guten Tag zusammen,
ich habe begonnen mich in das Thema Datenbanken einzuarbeiten.
Nun ist mir aber eine Konstellation eingefallen die ich partout nicht lösen könnte.

Angenommen wir haben folgenden Fall:
Vater
--> Sohn1
--> Sohn2 --> Sohn21
--> Sohn3 --> Sohn31 --> Sohn311
--> Sohn312​

Weiterhin haben wir Häuser
Jeder der Söhne kann ein oder mehrere Häuser besitzen.

Haus
--> BesitzerId
--> Groesse
--> Land (der eifachheithalber verzichte ich hier im Beispiel auf die Auslagerung in eine neue Tabelle)

Nun würde ich dies gerne in einer Datenbank abbilden.

Meine erste Idee war:
Für jede Ebene der Söhne eine eigene Datenbank.
Bei Sohn21 würde z.B: stehen: Id=1, VaterId=123, Name="Peter"

Mein Problem ist nun:

Wenn ich nun als BesitzerId die "Id" eines Sohnes eintrage, habe ich ein Problem.
Denn: Ein Sohn kann auf unterschiedlicher "Ebene" sein.
Diese Idee würde also nicht klappen.

Eine Notlösung wäre es alles in 1 Datenbank zu packen.
Code:
Ebene1    Ebene2    Ebene3   Haus-m²    Land
Peter        Tomas      NULL      100    Deutschland
Peter        Tomas      NULL      500    Norwegen
Tim           Tom      Willi      200    Scbweiz

- aber das würde ja der Normalisierung wiedersprechen.

Hat jemand einen Ansatz für mich?

Danke.
 
Werbung:
Vater
--> Sohn1
--> Sohn2 --> Sohn21
--> Sohn3 --> Sohn31 --> Sohn311
--> Sohn312​
Vereinfacht ein Schema für deine Generationen. Der name ist der Primärschlüssel und einzigartig. Daher ist die Zuordnung der Häuser problemlos möglich.

Ob das Auslesen des Stammbaums jetzt einfach oder kompliziert wird hängt stark von der verwendeten Datenbank ab. Mit MySQL wird das etwas komplizierter.
Code:
R=(_name_, parent)
Vater, null
Sohn1, Vater
Sohn2, Vater
Sohn3, Vater
Sohn21, Sohn2
Sohn31, Sohn3
Sohn311, Sohn31
Sohn312, Sohn31
 
Hallo Hony%,
danke zunächst für die blitzschnelle Antwort.

Deine Idee hatte ich auch schon, aber wieder verworfen.
Ich konnte mir nämlich nicht die Frage beantworten, wie zum Beispiel folgende Abfrage bewerkstelligt werden könnte:

"Wieviel Wohneigentum hat Generation 2 inklusive aller dazugehörigen Kinder"
Mit Deinem Ansatz würde ich ja die Information verlieren zu welcher Generation ein Kind gehört.

Als Datenbank soll MSSQL zum Einsatz kommen.

Vielen Dank.
 
Guten Tag zusammen,
ich habe begonnen mich in das Thema Datenbanken einzuarbeiten.
Nun ist mir aber eine Konstellation eingefallen die ich partout nicht lösen könnte.

Angenommen wir haben folgenden Fall:
Vater
--> Sohn1
--> Sohn2 --> Sohn21
--> Sohn3 --> Sohn31 --> Sohn311
--> Sohn312​

Ich belasse es mal dabei.

Meine erste Idee war:
Für jede Ebene der Söhne eine eigene Datenbank.

Vollkommen FAIL. Das skaliert nicht.

Du brauchst nur id (als primary key) und parent_id, welche auf id verweist. Da speicherst die ganzen Leute.
Eine andere Tabelle mit den Hütten. Und eine weitere Tabelle, welche Hütte wem gehört.
 
"Wieviel Wohneigentum hat Generation 2 inklusive aller dazugehörigen Kinder"
Mit Deinem Ansatz würde ich ja die Information verlieren zu welcher Generation ein Kind gehört.
Das ist natürlich relativ komplex. Die Information lässt sich einfach ausgedrückt aber durch "nachzählen" wieder herstellen.

Als Datenbank soll MSSQL zum Einsatz kommen.
MS-SQL unterstützt rekursive Common Table Expression. Dadurch ist es egal wie viele Generationen existieren.

Bei Bedarf kann ich dir aber gerne ein Beispiel geben.
 
MS-SQL unterstützt rekursive Common Table Expression. Dadurch ist es egal wie viele Generationen existieren.

Ich verwende aktuell Access. Nun nun habe ich voreifrig MSSQL gesagt :(
Das mag zwar stimmen, aber nur wenn ich als Backend einen "richtigen" MSSQL-Server nutze, was zurzeit nicht der Fall ist.

Nun habe ich versucht herauszufinden ob Access ebenfalls CTE unterstützt. Leider Fehlanzeige :(

Bei Bedarf kann ich dir aber gerne ein Beispiel geben.

Das bezog sich auf das Beispiel mit den CTE oder? :)
 
Ich verwende aktuell Access. Nun nun habe ich voreifrig MSSQL gesagt :(
Das mag zwar stimmen, aber nur wenn ich als Backend einen "richtigen" MSSQL-Server nutze, was zurzeit nicht der Fall ist.
Vielleicht kommt ja MS-SQL Express in Frage?

Oder auch gerne PostgreSQL. Die Lizenz lässt problemlos kommerzielle Anwendungen zu. Alternativ auch SQLite in der aktuellen Version.

Das bezog sich auf das Beispiel mit den CTE oder? :)
Ja. Ohne wären noch temporäre Views mit rekursiven Triggern denkbar. Aber ob das unterstützt wird kann ich nicht sagen.

Wenn nicht bleibt nur noch eine Umsetzung in VBA.

Edit:
Eine weitere Möglichkeit sind mehrere Joins. Allerdings muss dann die maximale Tiefe bekannt sein.
 
Vielleicht kommt ja MS-SQL Express in Frage?

Oder auch gerne PostgreSQL. Die Lizenz lässt problemlos kommerzielle Anwendungen zu.

Absolut, von den Features her wirst Du nix vermissen, was Ora oder M$SQL kann, und das unter einer absolut freien Lizenz.
Die genannten rekursiven Abfragen kann es z.B. auch. Schon seit vielen Versionen.
 
Werbung:
In jedem Fall sollte man bei der Tabellenstruktur den oben genannten Weg gehen und mit parentIDs arbeiten. Alles andere ist ganz großer Käse. Die Abfrage ist sicher schwierig und verschiedene DBs kennen hier verschiedene Hilfsmittel.

Bei MSSQL habe ich mir mal HierachyID angeguckt, da gibt es extra Datentypen für. Habs dann aber mit WITH lösen müssen. http://msdn.microsoft.com/de-de/library/ms175972.aspx
 
Zurück
Oben