Der Entwurf eines Datenmodells und der darin enthaltenen Tabellen und Beziehungen erfordert vor allem eines: Das Berücksichtigen der Normalformen. Dies sind Regeln, mit denen Sie die benötigten Felder auf verschiedene Tabellen aufteilen. Dabei ist das Ziel, redundante Daten auszuschließen und Inkonsistenzen zu verhindern. Diese Artikelreihe beschreibt die wichtigsten Normalformen und wie Sie diese in der Praxis anwenden.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 2006_Normalisierung.accdb.
Ausgangssituation
Im ersten Teil der Artikelreihe haben wir die erste Normalform betrachtet, die besagt, dass jedes Feld atomare Informationen enthalten soll. Dabei haben wir Daten zweier Felder, die Straße und Hausnummer sowie PLZ und Ort enthielten, auf jeweils zwei neue Felder aufgeteilt.
Die neue Tabelle enthält Projekt- und Kundendaten und sieht wie in Bild 1 aus. An dieser Stelle setzen wir die Normalisierung fort und schauen uns die zweite Normalform an.
Bild 1: Zu normalisierende Daten
Die zweite Normalform
Die Definition auf Wikipedia für die zweite Normalform lautet:
“Eine Relation ist genau dann in der zweiten Normalform, wenn die erste Normalform vorliegt und kein Nichtprimärattribut (Attribut, das nicht Teil eines Schlüsselkandidaten ist) funktional von einer echten Teilmenge eines Schlüsselkandidaten abhängt.”
Bezogen auf die Tabelle tblProjekteKunden bedeutet dies Folgendes: Die Tabelle besitzt prinzipiell einen aus den beiden Feldern Projektnummer und Kundennummer zusammengesetzten Primärschlüssel. Eine Teilmenge wäre also eines der beiden Felder Projektnummer und Kundennummer. Und es gibt Felder, die von Projektnummer abhängig sind (Projektbezeichnung, Projektstart) und Felder, die von Kundennummer abhängig sind (die übrigen Felder).
Unsere Tabelle ist also nicht in der zweiten Normalform. Das wäre nur der Fall, wenn alle Nicht-Primärschlüsselfelder von den zum Primärschlüssel zusammengesetzten Feldern abhängig wären. Das ist etwa in einer Bestellpositionen-Tabelle der Fall, die einen aus den beiden Feldern BestellungID und ArtikelID zusammengesetzten Primärschlüssel enthält – dort sind alle weiteren Felder von diesem Primärschlüssel abhängig.
Praktische Aspekte der zweiten Normalform
Schauen wir uns die Tabelle tblProjekteUndKunden nochmal genauer an. Der erste, vierte und siebte Datensatz enthalten Projekte mit dem gleichen Kunden. Legen Sie hier nun für ein neues Projekt mit diesem Kunden die Firma Test-Firma statt Testfirma an, finden Sie bei einer Suche nach Testfirma nicht mehr alle Projekte zu diesem Kunden.
Die redundanten Daten führen leicht zu Inkonsistenzen, und das wollen wir vermeiden.
Diese wollen wir nun so aufteilen, dass die Projekte und die Kunden in je einer eigenen Tabelle namens tblProjekte und tblKunden landen. Beide Tabellen benötigen ein eigenes Primärschlüsselfeld. Die Daten dafür liegen uns bereits vor: Die Tabelle tblProjekte verwendet das Feld Projektnummer als Primärschlüsselfeld, die Tabelle tblKunden das Feld Kundennummer.
Danach müssen wir allerdings noch die Zuordnung zwischen den Kunden und Projekten sicherstellen. Weisen wir ein Projekt einem Kunden zu oder einen Kunden einem Projekt Letzteres ist der Fall, und damit wissen wir, dass wir der Tabelle tblProjekte ein Fremdschlüsselfeld hinzufügen müssen, mit dem wir den Eintrag der Tabelle tblKunden festlegen, für den das Projekt durchgeführt werden soll.
Aufteilung der Tabelle tblProjekteUndKunden
Die Tabelle tblProjekteUndKunden wollen wir nun wie in Bild 2 auf die beiden Tabellen tblProjekte und tblKunden aufteilen. Dazu erstellen wir die beiden Zieltabellen, wobei wir die Felder Projektnummer und Kundennummer gleich durch die in diesem Magazin üblichen Bezeichnungen ProjektID und KundeID ändern. Die beiden Primärschlüsselfelder müssen Sie direkt als Autowert festlegen, da sich dies nicht mehr einstellen lässt, wenn Sie einmal Daten in die Tabelle geschrieben haben.
Bild 2: Aufteilung der Tabelle tblProjekteUndKunden
Der Tabelle tblProjekte fügen wir außerdem gleich das Fremdschlüsselfeld KundeID mit dem Datentyp Zahl hinzu.
Nun benötigen wir noch halbwegs automatische Möglichkeiten, um die Daten der Tabellen aufzuteilen. Dies erledigen wir in zwei Schritten:
- Hinzufügen der Kundendaten zur Tabelle tblKunden
- Hinzufügen der Projektdaten zur Tabelle tblProjekte
Kundentabelle füllen
Den ersten Schritt erledigen wir mit einer Anfügeabfrage. Dazu erstellen Sie eine neue Abfrage und ändern den Abfragetyp über den Ribbon-Eintrag Entwurf|Abfragetyp|Anfügen. Nun erscheint der Dialog Anfügen, mit dem Sie die Zieltabelle auswählen, hier tblKunden (siehe Bild 3).
Bild 3: Auswählen der Zieltabelle für die Anfügeabfrage
Danach bearbeiten Sie den Entwurf der neuen Anfügeabfrage. Fügen Sie die Tabelle tblProjekteUndKunden zum Entwurf hinzu und ziehen Sie die Felder für die Kunden in das Entwurfsraster. Access ordnet Felder gleichen Namens automatisch zu, sodass wir nur noch das Feld KundeID als Ziel für das Feld Kundennummer auswählen müssen (siehe Bild 4).
Bild 4: Anfügeabfrage zum Füllen der Tabelle tblKunden
Danach betätigen Sie den Ribbon-Eintrag Ent-wurf|Er-geb-nis-se|Aus-füh-ren, um die Anfügeabfrage zu starten. Die nun erscheinende Meldung besagt, dass nicht alle Einträge zur Zieltabelle hinzugefügt werden konnten. Das ist logisch, denn die Tabelle tblProjekteUndKunden enthält den Datensatz mit der Kundennummer 123 mehrfach.
In diesem Fall ist es also in Ordnung, dass nicht alle Einträge kopiert werden. Das Ergebnis sehen Sie in Bild 5.
Bild 5: Die gefüllte neue Tabelle tblKunden
Projekttabelle füllen
Zum Übertragen der Projektdaten aus der Tabelle tblProjekteUndKunden in die Tabelle tblProjekte legen wir wiederum eine Anfügeabfrage an. Diesmal verwenden wir die Tabelle tblProjekte als Zieltabelle.
Danach fügen wir die Tabelle tblProjekteUndKunden zum Entwurf hinzu und ziehen diesmal die Felder Projektnummer, Projektbezeichnung, Projektstart und Kundennummer in das Entwurfsraster. Auch hier erkennt Access wieder zwei Zuordnungen, aber für Projektnummer und Kundennummer müssen wir selbst Hand anlegen. Das Feld Projektnummer soll auf dem Primärschlüsselfeld ProjektID der Zieltabelle abgebildet werden. Und mit Kundennummer erhalten wir praktischerweise bereits die Werte für das Fremdschlüsselfeld KundeID (siehe Bild 6).
Bild 6: Anfügeabfrage zum Füllen der Tabelle tblProjekte
Da es für die Projekte nur eindeutige Daten gibt, sollte das Anfügen diesmal ohne Probleme erfolgen. Wir führen die Anfügeabfrage aus und erhalten das Ergebnis aus Bild 7.
Bild 7: Die gefüllte Tabelle tblProjekte
Nun fehlt nur noch eine Beziehung zwischen den beiden Tabellen tblProjekte und tblKunden. Diese fügen wir über das Beziehungen-Fenster hinzu, das wir mit dem Ribbon-Eintrag Datenbanktools|Beziehungen öffnen.
Fügen Sie die beiden Tabellen tblProjekte und tblKunden zum Beziehungen-Fenster hinzu und ziehen Sie dann das Fremdschlüsselfeld KundeID der Tabelle tblProjekte auf das Primärschlüsselfeld KundeID der Tabelle tblKunden.
Klicken Sie doppelt auf den Beziehungspfeil und markieren Sie im nun erscheinenden Dialog Beziehungen bearbeiten die Option Mit referentieller Integrität (siehe Bild 8). Die Löschweitergabe aktivieren wir für diese Beziehung nicht, weil Kunden, denen bereits ein Projekt zugewiesen wurde, nicht mehr gelöscht werden sollen.
Bild 8: Herstellen einer Beziehung zwischen den Tabellen tblProjekte und tblKunden
Normalisierung für Lookupdaten
Die Tabelle tblProjekteUndKunden beherbergt noch ein nicht normalisiertes Feld, das wir in die Tabelle tblKunden übertragen haben. Es enthält die Anrede des Kunden. In diesem Feld landen Daten wie Herr, Frau oder Firma. Wenn nur diese drei Einträge vorgesehen sind, befinden sich eine Menge redundanter Daten in diesem Feld. Das ist wieder kein Problem, wenn niemand auf die Idee kommt, statt Herr einmal Herrn in das Feld einzutragen. Suchen Sie dann über die Anrede nach männlichen oder weiblichen Kunden oder nach Firmenkunden und geben beispielsweise den Suchbegriff Herr ein, finden Sie wieder nicht alle gewünschten Datensätze.
Wir verwenden für diesen Schritt eine Kopie der Tabelle tblKunden mit dem Namen tblKundenMitAnredeID.
Auch hier bietet sich eine Normalisierung an, indem wir für die Anrede eine neue Tabelle erstellen. Diese soll nur drei Datensätze mit den Werten Herr, Frau und Firma aufnehmen. Außerdem erhält diese Tabelle ein Primärschlüsselfeld namens AnredeID und wird unter dem Namen tblAnreden gespeichert (siehe Bild 9).
Bild 9: Tabelle mit Anreden
Aus der Tabelle tblKundenMitAnredeID entfernen wir das Feld Anrede und fügen ein neues Fremdschlüsselfeld namens AnredeID hinzu.
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: