Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Mehrere Ebenen -> Normalisierung

Dieses Thema im Forum "Datenmodellierung, Datenbank-Design" wurde erstellt von peng21, 13 Februar 2014.

  1. peng21

    peng21 Neuer Benutzer

    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.
     
  2. Hony%

    Hony% Datenbank-Guru


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

    peng21 Neuer Benutzer

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

    akretschmer Datenbank-Guru

    Ich belasse es mal dabei.

    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.
     
  5. Hony%

    Hony% Datenbank-Guru

    Das ist natürlich relativ komplex. Die Information lässt sich einfach ausgedrückt aber durch "nachzählen" wieder herstellen.

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

    peng21 Neuer Benutzer

    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 :(

    Das bezog sich auf das Beispiel mit den CTE oder? :)
     
  7. Hony%

    Hony% Datenbank-Guru

    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.

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

    akretschmer Datenbank-Guru

    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.
     
    Hony% gefällt das.
  9. ukulele

    ukulele Datenbank-Guru

    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
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden