Benutzer-Werkzeuge

Webseiten-Werkzeuge


computer:tutorials:sql:normalisierung

Dies ist eine alte Version des Dokuments!


Normalisierung beschreibt den Vorgang, Tabellen einer Datenbank dahingehend zu strukturieren, sodass sie keine vermeidbaren Redundanzen enthalten. Normalisierte Tabellen sorgen für eine konsistente und fehlerunanfällige Datenhaltung.

Beispiel

Ein Entwickler hat die Aufgabe bekommen, die Datenbank für das Wirtschaftssystem der Firma Failution zu implementieren. Die Firma möchte folgenden Informationen seiner Kunden speichern:

  • Kunden
    • Name
    • Firma
    • Adresse
    • Notiz (Hinweis auf offene Rechnung)
  • Bestellung
    • Datum
    • Bezahlung schon abgeschlossen - ja/nein?
  • Artikel
    • Bezeichnung
    • Details
    • Einzelpreis
    • Auslaufartikel - ja/nein?

Der Entwurf des Entwicklers sieht wie folgt aus:

KND_NameKND_FirmaKND_AdresseKND_NotizKND_Notiz2BST_DatumBST_BezahltART_1ART_2
Max MustermannMustermann ConsultingMusterstrasse 1, 12345 Musterstadt 10.10.2010110x Thin-Client BAER (1.6 Ghz,Sound,VGA,USB) 199.9915x Thin-Client NP (1.0 Ghz,Sound,VGA+DVI,USB) 179.99 Auslauf
Theodor TesterTest-Solutions AGTestweg 16, 55353 TestortOffene Rechnung 15.02.2011 1x Thin-Client BAER (1.6 Ghz,Sound,VGA,USB) 199.99
Theodor TesterTest-Solutions AGTestweg 16, 55353 TestortOffene Rechnung 15.02.2011 1x Thin-Client BAER (1.6 Ghz,Sound,VGA,USB) 199.99

1.Normalform

Die erste Normalform liegt vor, wenn eine Tabelle die folgenden Bedingungen erfüllt:

  • Es dürfen keine Spalten mit gleichen Inhalten vorliegen
  • Die Werte dürfen nicht weiter teilbar sein (man sagt auch, sie müssen atomar sein)
  • Es dürfen keine doppelten Einträge/Zeilen enthalten sein

Der oben angezeigt Entwurf erfüllt keine der drei Bedingungen - die Gründe sind:

  • Es sind Spalten mit gleichen Inhalten vorhanden - es gibt zwei Spalten für Kundennotizen und bestellte Artikel: KND_Notiz und KND_Notiz2.
  • Es gibt Werte, die sich weiter teilen ließen. Das Feld KND_Name lässt sich in zwei seperate Felder für den Vor- und Nachnamen des Kunden aufteilen, ferner vereint das Feld KND_Adresse neben der Adresse auch die Hausnummer, die PLZ und den Ortnamen. Die Spalte Artikel enthält neben der Artikelbezeichnung auch die Artikeldetails und Anzahl der erworbenen Artikel. Alle Bestellungspositionen werden mittels Komma getrennt aufgelistet - die Einzelpreise werden auf ähnliche Art und Weise mittels Komma getrennt und aufgelistet.
  • Es gibt doppelte Einträge - die letzten beiden Datensätze sind identisch - hier hat sich der Entwickler wohl vertippt und somit eine unnötige Redundanz erschaffen. Solche Mehrfach-Einträge lassen sich mit dem Verwenden eines Primärschlüssels vermeiden.

Beherzigt man die oben genannten drei Regeln lässt sich das Konzept wie folgt überarbeiten:

IDKND_VornameKND_NachnameKND_FirmaKND_StrasseKND_HausNrKND_PLZKND_OrtKND_NotizBST_DatumBST_BezahltART_AnzahlART_BezART_DetailsART_AuslaufART_Preis
1MaxMustermannMustermann ConsultingMusterstrasse112345Musterstadt 10.10.2010ja10Thin-Client BAER1.6 Ghz,Sound,VGA,USBnein199.99
2MaxMustermannMustermann ConsultingMusterstrasse112345Musterstadt 10.10.2010ja15Thin-Client NP1.0 Ghz,Sound,VGA+DVI,USBja179.99
3TheodorTesterTest-Solutions AGTestweg1655353TestortOffene Rechnung15.02.2011nein1Thin-Client BAER1.6 Ghz,Sound,VGA,USBnein199.99

Was wurde geändert?

  • Es wurde ein Primärschlüssel ID eingefügt, somit gibt es einzigartige Einträge (kein Eintrag gleicht dem anderen, da er eine andere ID hat)
  • Die Felder für den Kundennamen, die Kundenadresse, Kundennotizen und das Feld mit Informationen über die bestellten Artikel wurden in atomare Felder aufgeteilt
  • Die Felder KND_Notiz und KND_Notiz2 sowie ART1 und ART2 waren „doppelt“, es waren zwei Felder mit dem selben informationstechnischen Nutzen - sie sollten Informationen über bestellte Artikel beinhalten. Sie wurden aufgeteilt, für alle Artikelinformationen (Bezeichnung, Details, Auslaufartikel, Preis) gibt es nun dedizierte Felder.
computer/tutorials/sql/normalisierung.1299162647.txt.gz · Zuletzt geändert: 2011/03/03 15:30 von christian