phpbar.de logo

Mailinglisten-Archive

Re: Normalformen
Archiv Mailingliste mysql-de

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Normalformen



Mathias schrieb am Sonntag, den  5. September 1999:
> Eine Frage: Kann mir jemand vielleicht die "Normalformen" in einem
> "verständlichen" deutsch erläutern?
> Habe Probleme diese aus der Literatur zu verstehen!

Ich probier's mal ... :-)

1. Normalform (1NF)
-------------------
 Wenn jedes Feld einer Tabelle nur genau einen Wert enthält, also
 atomar und nicht mengenwertig ist, ist das die 1. Normalform.

 Nicht in 1NF ist zum Beispiel eine MySQL-Tabelle, die Felder mit dem
 Typ SET enthält.  Oder wenn man Textfelder dazu verwendet, Listen von
 Werten zu speichern.
 Es zählt also nicht der rein technische Feldtyp, sondern wie man die
 Felder vom Datenbankdesign her verwendet!

2. Normalform (2NF)
-------------------
 Schlüsselkandidat, Schlüssel:
 
 Datensätze in relationalen Datenbanken haben innerhalb der Tabelle
 keine feste Nummer oder Reihenfolge, sondern sind nur durch den
 Inhalt der Felder festgelegt.  In diesem strengen Sinn kann es also
 keine zwei Datensätze mit gleichem Inhalt geben. (Ich geh später noch 
 darauf ein, warum das bei MySQL doch vorkommen kann ...)

 Statt immer vom gesamten Datensatz zu reden, überlegt man sich
 natürlich, ob nicht evtl. der Inhalt nur eines Teils der Felder oder
 sogar nur eines Feldes genügt, um den ganzen Datensatz festzulegen.
 
 Als Beispiel eine Tabelle, die Immobilien auflistet:
   Name                | Straße    | PLZ   | Ort    | Makler | Tel
   --------------------+-----------+-------+--------+--------+--------
   Wohnheim St. Helena | Burgweg 1 | 87654 | Hausen |    1   | 089/123
   Domizil Altersruh   | Gasse 5   | 34567 | Wohnar |    2   | 078/345
   Wohnheim St. Helena | Allee 2   | 12345 | Orting |    3   | 023/656
   Schöner Wohnen      | Ring 3    | 34343 | Öden   |    1   | 089/123

 Der Name allein genügt sicher nicht, um einen Datensatz eindeutig zu
 identifizieren, da die Wohnanlagen in verschiedenen Städten durchaus
 mal gleiche Namen haben können (innerhalb der gleichen Stadt
 vermeidet das die Immobilienfirma).  Die Kombination von Name, PLZ
 und Ort - kurz geschrieben: (Name,PLZ,Ort) - dagegen ist geeignet:
 mit z.B.  der Angabe (Wohnheim St. Helena,12345,Orting) ist eindeutig
 der 3. Datendatz oben identifiziert.  Allerdings geht's noch kürzer
 nur mit (Name,PLZ), da sich der Ort ja eindeutig aus der PLZ ergibt.
 Somit ist (Name,PLZ) ein möglicher Schlüssel für diese Tabelle.
 Genauso gut ginge aber auch die Kombination (Straße,PLZ), denn pro
 Adresse kann es ja auch nicht mehr als eine Immobilie geben.

 Sowohl (Name,PLZ) als auch (Straße,PLZ) sind somit Schlüssel-
 kandidaten, denn mit beiden Kombinationen kann man schon den ganzen
 Datensatz identifizieren und mit weniger Feldern geht's nicht.

 In relationalen Datenbanksystemen muß man für jede Tabelle einen
 Schlüssel bestimmen - das ist dann ein beliebiger der möglichen
 Schlüsselkandidaten.

 2NF:
 Die 2. Normalform bedeutet nun, daß nicht nur der Datensatz als
 ganzes vom Schlüssel abhängt, sondern auch zur Bestimmung jedes
 einzelnen Feldes nicht schon ein Teil des Schlüssel genügt.
 ("immer ganzer Schlüssel")

 In anderen Worten: wenn schon ein Teil des Schlüssel genügt, um den
 Inhalt eines anderen Feldes zu bestimmen, dann ist das nicht 2NF.
 (Das heißt auch:  wenn der Schlüssel einer Tabelle nur aus einem
  einzigen Feld besteht, ist die Tabelle automatisch in 2NF!)

 Beispiel: Man braucht nicht die Kombination (Name,PLZ) oder
 (Straße,PLZ), um den Ort zu wissen, es genügt PLZ - denn aus der
 Postleitzahl ergibt sich (normalerweise) eindeutig der Ortsname.

 Um bei einem Beispiel wie dem obigem dann doch 2NF zu erreichen,
 teilt man die Tabelle einfach in mehrere auf, die dann jeweils in 2NF 
 sind.
 Hier wäre das eine gekürzte Tabelle "Immobilien":
   Name                | Straße    | PLZ   | Makler | Tel
   --------------------+-----------+-------+--------+--------
   Wohnheim St. Helena | Burgweg 1 | 87654 |    1   | 089/123
   Domizil Altersruh   | Gasse 5   | 34567 |    2   | 078/345
   Wohnheim St. Helena | Allee 2   | 12345 |    3   | 023/656
   Schöner Wohnen      | Ring 3    | 34343 |    1   | 089/123

  Und eine neue Tabelle "Orte":
   PLZ   | Ort   
   ------+-------
   87654 | Hausen
   34567 | Wohnar
   12345 | Orting
   34343 | Öden  

3. Normalform (3NF) 
-------------------
 Eine Tabelle ist in 3NF, wenn sie bereits in 2NF ist und zusätzlich
 gilt, daß jedes Feld (außer den Schlüsselfeldern selbst) auch direkt
 von den Schlüsselfeldern abhängen muß.
 ("nur direkt vom Schlüssel")
 ("keine Abhängigkeiten zwischen Nichtschlüsselfeldern")

 In anderen Worten: Wenn ein Nicht-Schlüssel-Feld von einem oder
 mehreren Nicht-Schlüssel-Felder abhängt, ist das keine 3NF!

 Beispiel: Die Telefonnummer des Maklers ergibt sich zwar auch
 eindeutig aus (Name,PLZ) oder (Straße,PLZ), da zu jeder Immobilie
 genau ein Makler gehört und dieser genau eine Telefonnummer hat, aber
 eigentlich ergibt sich die Telefonnummer auch schon eindeutig aus der
 Nummer des Maklers.  Somit ist das Nicht-Schlüssel-Feld Tel vom
 Nicht-Schlüssel-Feld Makler abhängig, die 3NF gilt nicht.

 Um in einem solchen Fall die 3NF zu erreichen, teil man die Tabellen
 weiter auf.
 Hier wäre das eine nochmal gekürzte Tabelle "Immobilien":
   Name                | Straße    | PLZ   | Makler | Tel
   --------------------+-----------+-------+--------+--------
   Wohnheim St. Helena | Burgweg 1 | 87654 |    1   | 089/123
   Domizil Altersruh   | Gasse 5   | 34567 |    2   | 078/345
   Wohnheim St. Helena | Allee 2   | 12345 |    3   | 023/656
   Schöner Wohnen      | Ring 3    | 34343 |    1   | 089/123

 Und eine neue Tabelle "Makler":
   MaklerID | Tel    
   ---------+--------
      1     | 089/123
      2     | 078/345
      3     | 023/656
      1     | 089/123


Ist die Erklärung verständlich?

Streng genommen sollte man eigentlich nicht von Tabellen und Feldern
sprechen, sondern von Relationen und Attributen, weil die Normalformen
Teil des mathematischen Relationenmodells bei Datenbanken sind.  Reine
Tabellen sind laxer als Relationen und können z.B. auch mehrere
identische Zeilen beinhalten, wenn eine solche Tabelle keinen
Primärschlüssel besitzt.  Relationen dagenen haben immer einen
Schlüssel.


Einen recht verständlichen Text von Gerhard Knorz zu den Normalformen
findest Du übrigens im WWW unter
<URL: http://www.k-n-o-r-z.de/publ/skript/db96/rdbenfl5.htm >.


Ciao,
  Martin
-- 
Martin Ramsch <m.ramsch_(at)_computer.org> <URL: http://home.pages.de/~ramsch/ >
PGP KeyID=0xE8EF4F75 FiPr=52 44 5E F3 B0 B1 38 26  E4 EC 80 58 7B 31 3A D7

---
*** Abmelden von dieser Mailingliste funktioniert per E-Mail
*** an mysql-de-request_(at)_lists.4t2.com mit Betreff/Subject: unsubscribe


Home | Main Index | Thread Index

php::bar PHP Wiki   -   Listenarchive