Ankündigung

Einklappen
Keine Ankündigung bisher.

Datenbank Normalisierung in die dritte NF, nach der 1NF stecken geblieben...

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datenbank Normalisierung in die dritte NF, nach der 1NF stecken geblieben...

    Guten Tag an die deutsche PHP-Community!

    ich habe ein Problem bei der Normalisierung meiner relationelen Segelschiffstypen - Datenbank. Ich habe die Datenbank meiner Meinung nach in die erste NF gebracht, aber weiter komme ich kaum.. Habe schon etliche Videos und Erklärungen zu diesem Thema bei Youtube angeschaut, aber leider lassen sich die Beispiele schlecht auf meine Datenbank anwenden.

    Ich habe eine Tabelle mit folgenden Punkten erstellt: Segelschiffstyp, Länge, Mastanzahl, Segelart, Einsatzart, Zeitperiode, Herkunft. Dann habe ich die Tabelle in die erste NF gebracht ( siehe eingefügtes Bild ) , also Attribute sind atomar, keine Wiederholungsgruppen vorhanden, Primärschlüssel ist in meinem Fall "Segelschiffstyp". Jetzt muss ich die Tabelle ja in die 2NF bringen, also Tabelle splitten. Dann wäre die Tabelle1 " Segelschiffstyp ", bestehend aus: Segelschiffstyp, Länge, Mastanzahl, Segelart, Zeitperiode, Herkunft ( Primärschlüssel Segelschiffstyp ). Tabelle2 ist dann "Einsatz", bestehend aus: Schiffstyp, Einsatz-ID, Einsatzart ( zusammengesetzter Primärschlüssel aus Schiffstyp und Einsatz-ID ).

    Das wäre jetzt meine Idee mit der 2NF, aber ich bin gar nicht sicher, ob ich korrekt liege.. ( und wenn das was ich gedacht habe, stimmt, dann erfülle ich schon die 3NF. oder? ) Ich wäre echt sehr dankbar, wenn mir jemand helfen würde..

    Mit freundlichen Grüßen

    HammerBurger

  • #2
    Bitte keine Screenshots, sondern einfachen Text hier tippen.

    Mastenanzahl würde ich nicht normalisieren, alles andere schon. Dh viele Tabellen anlegen mit den Typen und dann in der Haupttabelle jeweils die ID angeben.

    Kleines Beispiel
    Code:
    ship_type
    id | name
    1  | Catboot
    2  | Slup
    ...
    15 | Gaffelschoner
    
    
    ship_length
    id | name
    1  | 5 - 8 m
    2  | 8 - 15 m
    ...
    
     ... Das für alle deine Attribute fortsetzen ...
    
    Dann - die Schiffe selbst:
    
    ship
    id | name       | ship_lenght_id | ship_type_id | ...
    1  | Mayflowser | 2              | 15           | ...
    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      Normalisierung ist abhängig vom Kontext und den Daten. In einer Bootsdatenbank würde ich das aber nicht als 1NF durchgehen lassen.

      Schiffslänge "5-8m" -> 2 Werte -> schifflänge_min, schiffslänge_max
      Segelart "Schrat- und Rahsegel" -> n Werte -> n:m Beziehung

      Natürlich kannst du sagen, das du diese Werte nie nutzen wirst, außer um diese als Text darzustellen. Dann wäre die ursprüngliche Form auch OK. Es wird aber zum Verstoß wenn du z.B. Abfragen machen willst in Form von "alle Schiffe die länger als 10 Meter sind", "alle Schiffe vor 1900 mit Schratsägeln", "alle Schriffe sortiert nach Länge".

      2NF/3NF
      Einsatzart ist eine n:m Beziehung
      Land ist eine 1:n Beziehung

      Schiffslänge würde ich nicht als eigene Tabelle abbilden (siehe hausl), entweder würde ich das als Text beibehalten oder Min/Max.

      Kommentar


      • #4
        Vielen Dank an hausl und erc für eure Antworten.

        Ja, mir ist klar, dass die Attribute Schiffslänge und Segelart streng gesagt nicht ganz der 1 NF entsprechen.

        Schiffslänge runde ich auf, die Daten, die ich aufgeschrieben habe, sind eh geschätzt, genau lässt sich die Länge nicht herausfinden.

        Segelart lasse ich so wie es ist, ich definiere von vornerein, dass "Schrat- und Rahsegel" ein einzelner Textwert und keine Kombination von Werten ist, denn an sich ist die Datenbank nur
        dazu da, um die Daten in einer einfachen HTML-Seite darzustellen.

        Ich weiss aber nicht genau, wie ich jetzt Einsatzart in die passende Form abändere, wegen der M:N - Beziehung..... An sich müsste ich ja eindeutigen Primärschlüssel für Einsatzart definieren, das wäre zusammengesetzter Primärschlüssel aus der schiffstyp_id und einsatzart_id meine ich, oder? Also siehe Tabelle Einsatzart unten.

        Wenn ich den Vorschlag von hausl anwende, hätte ich im Endeffekt 6 einzelne Tabellen: Schiffslänge, Segelart, Einsatzart, Zeitperiode, Herkunft und Schiffstyp ( Haupttabelle )

        Schiffslänge
        id_länge ( PK ) | länge

        Segelart
        id_segelart ( PK ) | segelart

        Einsatzart
        id_schiffstyp ( teil des PK ) | id_einsatzart ( auch teil des PK ) | einsatzart

        Zeitperiode
        id_zeitperiode ( PK ) | zeit

        Herkunft
        id_herkunft ( PK ) | herkunft

        Schiffstyp ( Haupttabelle )
        id_schiffstyp ( PK ) | schiffstyp | id_länge ( FK ) | mastanzahl | id_segelart ( FK ) | id_einsatzart ( FK ) | id_zeitperiode ( FK ) | id_herkunft ( FK )

        PK = Primärschlüssel, FK = Fremdschlüssel

        Sind die erstellte Tabellen korrekt, bzw. mein Gedankengang richtig?

        Kommentar


        • #5
          Ich sah die Schiffslänge ehrlich gesagt auch nicht ganz sauber - eher so wie bei Socken 40 - 42, 43 - 45, also eher als eine Art Kategorie, als eine echte Länge wegen der zusammengesetzten Werten. Wenn du es als Werte brauchts, dann bitte jedenfalls die Hinweise oben von erc beachten.

          Code:
          Einsatzart
          id_schiffstyp ( teil des PK ) | id_einsatzart ( auch teil des PK ) | einsatzart
          Das versteh ich noch nicht, warum nicht wie bei allen anderen einfach? Du hast ein Schiff und das hat eine Einsatzart.


          Und, Amerkung: Nenn die PK immer "id" und die FK "id_irgendwas". So geht das beim Lesen schon klar hervor und das ist die übliche Variante.
          Also
          Code:
          Schiffslänge
          id ( PK ) | länge
          
          Segelart
          id ( PK ) | segelart
          
          etc...
          The string "()()" is not palindrom but the String "())(" is.

          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
          PHP.de Wissenssammlung | Kein Support per PN

          Kommentar


          • #6
            Zitat von HammerBurger Beitrag anzeigen
            Ich weiss aber nicht genau, wie ich jetzt Einsatzart in die passende Form abändere, wegen der M:N - Beziehung..... An sich müsste ich ja eindeutigen Primärschlüssel für Einsatzart definieren, das wäre zusammengesetzter Primärschlüssel aus der schiffstyp_id und einsatzart_id meine ich, oder? Also siehe Tabelle Einsatzart unten.
            n:m Beziehungen werden über eine Hilfstabelle abgebildet.

            schiffstyp (schiffstyp_id, ...)
            einsatzart (einsatzart_id, beschreibung)
            Hilfstabelle: schiffstyp_einsatzart (schiffstyp_id, einsatzart_id)

            Kommentar


            • #7
              Zitat von hausl Beitrag anzeigen
              Und, Amerkung: Nenn die PK immer "id" und die FK "id_irgendwas". So geht das beim Lesen schon klar hervor und das ist die übliche Variante.
              Das ist deine Präferenz. Gegen das Namensschema was der HammerBurger hier verwendet spricht nix. Im Endeffekt ist es sogar die sauberer Variante, weil es von vornherein Inkonsistenz in der Bennenung vermeidet.
              Bei der Variante mit id verstreut sich über den Code schnell späße wie id, id_schiff, schiff_id, schiffs_id, schiffsid, sid, sfid. Wenn das Ding gleich ein möglichst eindeutigen Namen hat wie id_schiff, dann muss auch keiner Aliase verwenden.

              Kommentar


              • #8
                Ja stimm schon, man sieht es halt anders häufiger, ist mein Eindruck. Anders hat man halt jeden anderen Feldnamen doppelt.
                Code:
                Herkunft
                id_herkunft ( PK ) | herkunft
                
                Segelart
                id_segelart ( PK ) | segelart
                
                Zeitperiode
                id_zeitperiode ( PK ) | zeit
                
                Schiffstyp ( Haupttabelle )
                id_schiffstyp ( PK ) | schiffstyp | id_länge ( FK ) | mastanzahl | id_segelart ( FK ) | id_einsatzart ( FK ) | id_zeitperiode ( FK ) | id_herkunft ( FK )
                herkunft.id bzw. h.id ist für mich auch praktischer als h.id_herkunft oder gar herkunft.id_herkunft. Ein id ist für mich ein PK, ein anything_id ein FK und den Tabellennamen im Spalten/Feldnamen zu wiederholen unnützig. Aber egal.. wie du sagst, mein persönlicher Eindruck.
                The string "()()" is not palindrom but the String "())(" is.

                Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                PHP.de Wissenssammlung | Kein Support per PN

                Kommentar


                • #9
                  hausl erc Jungs, vielen Dank nochmal für eure Hilfe, habe mein Datenbanken - Fach erfolgreich mit einer sehr guten Note bestanden.

                  Kommentar


                  • #10
                    Cool!
                    The string "()()" is not palindrom but the String "())(" is.

                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar

                    Lädt...
                    X