SQL-Problem 2. Normalform



  • tenim schrieb:

    darauf habe ich geantwortet und adresszusätze eingeführt die anhand von "case when" dynamisch rekombiniert werden können so das alle möglichkeiten abdeckbar sind. ob das jetzt in ALLEN szenarien sinnvoll ist sei dahingestellt. es ist aber möglich und auch oft sinnvoll.

    Es kann sinnvoll sein. Hängt u.A. davon ab wie viel Aufwand man pro Land in die Software stecken will, und wie wichtig es ist die Adressen im "bestmöglichen" Format für die jeweiligen Länder vorliegen zu haben.
    Für Shops wie Amazon z.B. kann sowas Sinn machen.

    Für kleinere Projekte macht es i.A. aber nicht Sinn. Weil der Nutzen meist nicht im Verhältnis zum Aufwand steht. Und weil man sich viel zu schnell mit irgendwelchen Annahmen vertut, die dann in Wirklichkeit nicht zutreffen. Der dadurch entstehende Schaden ist dann schnell grösser als der Nutzen.

    Und was die vermeidbare Redundanz angeht: Es geht hier um Normalisierung, und was die Normalisierung angeht gibt es hier keine Redundanz. Ein atomarer Wert ist ein atomarer Wert, ob das jetzt ein 100 Zeichen langer String ist oder ein 4 Byte Integer macht dabei keinen Unterschied.
    Und generell halte ich den Rat/Vorschlag Strings die mehrfach vorkommen in Lookup-Tables zu verlagern für problematisch. Ja, es gibt Fälle wo das Sinn machen kann, aber der Standardfall ist eher dass man sich viel Mühe für nichts macht. Und die Nachteile sind ja wohl alles andere als vernachlässigbar...
    * Man sieht nur mehr Bahnhof wenn man die Tabelle direkt in einem Management Tool anguckt
    * Es ist viel aufwendiger Werte per Hand zu ändern
    * Man braucht ne Garbage-Collection wenn man nicht auf ewige Zeiten Müll in der DB rumschleppen will
    * Man verbrät ordentlich Rechenzeit für unnötige Joins
    usw.



  • hustbaer schrieb:

    ...Und die Nachteile sind ja wohl alles andere als vernachlässigbar...
    * Man sieht nur mehr Bahnhof wenn man die Tabelle direkt in einem Management Tool anguckt
    * Es ist viel aufwendiger Werte per Hand zu ändern
    * Man braucht ne Garbage-Collection wenn man nicht auf ewige Zeiten Müll in der DB rumschleppen will
    * Man verbrät ordentlich Rechenzeit für unnötige Joins
    usw.

    ja, kann ich unterschreiben. und wie gesagt, es trifft ja auch für die mehrzahl aller fälle so zu. aber da der op danach fragte (reduktion von gleichen strings), hab ich ihm einen weg aufgezeigt. villeicht ist es bei ihm ja gerade sinnvoll. das können wir erst wissen, wenn wir sein komplettes datenmodell und die zu erwarteten datenmengen kennen.

    übrigens verwende ich diese lookup-tabellen sehr erfolgreich in einer medizinischen datenbank. dort handelt es sich um das feld "klinik" und es existierten bis vor kurzem für jeden 5.? datensatz ca. 5 verschiedene schreibweisen für die betreffende klinik. jetzt gibt es eine lookup-tabelle, aus der sie sich die betreffende klinik auswählen können. und erst wenn sie die dort nicht finden, können sie einen eintrag manuell erstellen. die fehlerrate durch mehrfacheingaben ging daduch ca. 99% nach unten. das per programmcode zu überprüfen ginge gar nicht.

    in dem sinne:

    keine regel ohne ausnahme.



  • LOL

    ich sehe gerade, was bei wikipedia zu 1.nf steht:

    Jedes Attribut der Relation muss einen atomaren Wertebereich haben, und die Relation muss frei von Wiederholungsgruppen sein. (Anm.: statt „atomar“ wird auch die Bezeichnung „atomisch“ verwendet.)

    Das heißt, zusammengesetzte, mengenwertige oder geschachtelte Wertebereiche (relationenwertige Attributwertebereiche) sind nicht erlaubt. Damit sind auch Wiederholungsgruppen nicht zugelassen. Kurz: Kein Attributwertebereich einer Relation in 1NF kann in weitere (sinnvolle) Teilbereiche aufgespaltet werden (Beispiel: Die Adresse darf nicht als Attribut verwendet werden, sondern muss – sofern es der zugrunde liegende Prozess erfordert – in PLZ, Ort, Straße und Hausnummer aufgeteilt werden).

    Dass die Relation frei von Wiederholungsgruppen sein muss, bedeutet, dass Attribute, die gleiche oder gleichartige Information enthalten, in eine andere Relation ausgelagert werden müssen.

    und genau unser adressbeispiel erfüllt damit nicht mal die erste normalform da die adresse eine zusammengesetzte entität ist und nicht mehr atomar.



  • tenim schrieb:

    LOL

    ich sehe gerade, was bei wikipedia zu 1.nf steht:

    Jedes Attribut der Relation muss einen atomaren Wertebereich haben, und die Relation muss frei von Wiederholungsgruppen sein. (Anm.: statt „atomar“ wird auch die Bezeichnung „atomisch“ verwendet.)

    Das heißt, zusammengesetzte, mengenwertige oder geschachtelte Wertebereiche (relationenwertige Attributwertebereiche) sind nicht erlaubt. Damit sind auch Wiederholungsgruppen nicht zugelassen. Kurz: Kein Attributwertebereich einer Relation in 1NF kann in weitere (sinnvolle) Teilbereiche aufgespaltet werden (Beispiel: Die Adresse darf nicht als Attribut verwendet werden, sondern muss – sofern es der zugrunde liegende Prozess erfordert – in PLZ, Ort, Straße und Hausnummer aufgeteilt werden).

    Dass die Relation frei von Wiederholungsgruppen sein muss, bedeutet, dass Attribute, die gleiche oder gleichartige Information enthalten, in eine andere Relation ausgelagert werden müssen.

    und genau unser adressbeispiel erfüllt damit nicht mal die erste normalform da die adresse eine zusammengesetzte entität ist und nicht mehr atomar.

    Äh? Das sagt das in deine Stammdaten eines Kundes die Adresse nicht in einem Feld gespeichert werden darf, weil in dem Feld dann struktierte Daten enthält.

    Negative Beispiel

    Kunde.Adresse = { "MeineStraße 12", "123456 Ort" }
    

    Positive Beispiel

    Kunde.Adresse01.Straße = "MeineStraße"
    Kunde.Adresse01.Hausnummer = "12"
    Kunde.Adresse01.PLZ = "123456"
    Kunde.Adresse01.Ortt = "Ort"
    

    Und beim Positive Beispiel liegt die Adresse auch als Enität vor. Im Anderen Fall muss man sich sonst 'Adresse01' wegdenken.



  • Ich habe es jetzt so gelöst:

    Alle Straßen stehen redundanzfrei in einer Tabelle:

    Str_ID
    Strassenname

    Alle Orte stehen redundanzfrei in einer Tabelle:

    Ort_ID
    Ortname

    Die Tabelle Adresse sieht so aus:

    Adr_ID
    PLZ
    Ort_ID
    Str_ID

    Die Adressen-Tabelle:

    ID
    Anrede_ID // Herr, Frau
    Titel_ID // Dr., Prof. ...
    Zusatz_ID // Ing., Dipl.
    Vorname
    NamZusatzID // van, von, an der ...
    Name
    Adr_ID
    ...

    Die Daten für die Tabelle Adresse wurden mit Osmosis aus OSM generiert.



  • find ich gut, deine struktur. sicher, es ist auf eine art mehr arbeit, aber dafür insgesamt sauberer.

    p.s. wenn du ein wirklich gutes modellierungstool für erm diagramme suchst, das datenbanken auch reverse-engineeren kann (diagramme aus bestehenden db´s generieren) dann nimm das:

    http://www.datanamic.com/dezign/

    ist imho mit abstand das beste tool auf dem markt, beherrscht den krähenfuss syntax und kann zig datenbanken ansprechen (alle wichtigen). leider kann erst die professional-version das reverse engineering.

    nachteil: das tool benutzt drm, du musst es glaub ich erst aktivieren (falls dich das stört).



  • Martin22 schrieb:

    Ich habe es jetzt so gelöst:

    Na, hoffentlich musst du nie internationale Adressen speichern.

    Hast du auch eine Straße namens Postfach?



  • Und die Hausnummer kommt dann zu den Personendaten (Anrede, Name, Vorname usw.)?
    In einem Hochhaus ist da aber eine Menge doppelt...



  • Ob es die 1NF verletzt kommt drauf an wie man die Sache betrachtet.
    Denn was man als atomar betrachtet ist letzten endes Definitionssache.



  • Das Modellierungstool sieht vielverspechend aus. Schau ich mir gern mal näher an. Danke für den Tipp.

    tenim schrieb:

    find ich gut, deine struktur. sicher, es ist auf eine art mehr arbeit, aber dafür insgesamt sauberer.

    p.s. wenn du ein wirklich gutes modellierungstool für erm diagramme suchst, das datenbanken auch reverse-engineeren kann (diagramme aus bestehenden db´s generieren) dann nimm das:

    http://www.datanamic.com/dezign/

    ist imho mit abstand das beste tool auf dem markt, beherrscht den krähenfuss syntax und kann zig datenbanken ansprechen (alle wichtigen). leider kann erst die professional-version das reverse engineering.

    nachteil: das tool benutzt drm, du musst es glaub ich erst aktivieren (falls dich das stört).



  • hustbaer schrieb:

    Ob es die 1NF verletzt kommt drauf an wie man die Sache betrachtet.
    Denn was man als atomar betrachtet ist letzten endes Definitionssache.

    Und nebenbei ist das auch ganz egal.
    Das Problem ist hier wieder (wie so oft), dass jemand auf Teufel komm raus eine Regel befolgen will.
    Es wird gar nicht mehr diskutiert, ob das sinnvoll ist oder nicht, sondern ob es gegen 'die Regel' verstösst.


Anmelden zum Antworten