Datenbankdesign: Normalisierung 1NF, 2NF, 3NF & BCNF
Dieser Beitrag ist eine Begriffserklärung zur Normalisierung in Datenbanken – inklusive praktischer Beispiele und Prüfungsfragen.
In a Nutshell
Normalisierung ist der Prozess der Strukturierung relationaler Datenbanken, um Redundanz zu eliminieren und Datenanomalien zu vermeiden. Ziel ist die Gewährleistung der Datenintegrität und -konsistenz.
Kompakte Fachbeschreibung
Normalisierung ist ein formaler Ansatz zur Eliminierung von Redundanz und Vermeidung von Anomalien in relationalen Datenbanken. Durch schrittweise Anwendung von Normalformen wird die Datenstruktur verbessert.
Anomalien ohne Normalisierung:
- Insert-Anomalien: Daten können nicht eingefügt werden ohne andere Informationen
- Update-Anomalien: Änderungen erfordern Updates an mehreren Stellen
- Delete-Anomalien: Löschen von Daten entfernt unbeabsichtigt andere Informationen
Normalformen:
- 1NF: Atomare Werte, keine Wiederholungsgruppen
- 2NF: 1NF + keine partiellen Abhängigkeiten
- 3NF: 2NF + keine transitiven Abhängigkeiten
- BCNF: Stärkere Form der 3NF mit strengeren Regeln
Funktionale Abhängigkeiten bilden die mathematische Grundlage: X → Y bedeutet, dass der Wert von X den Wert von Y eindeutig bestimmt.
Prüfungsrelevante Stichpunkte
- 1NF: Atomare Werte, keine Wiederholungsgruppen, eindeutige Primärschlüssel
- 2NF: 1NF erfüllt, keine partiellen Abhängigkeiten, vollständige Abhängigkeit vom Primärschlüssel
- 3NF: 2NF erfüllt, keine transitiven Abhängigkeiten, Nicht-Schlüssel hängen nur vom Primärschlüssel ab
- BCNF: Jede Determinante ist ein Kandidatenschlüssel
- Funktionale Abhängigkeiten: Mathematische Grundlage der Normalisierung
- Anomalien: Insert, Update, Delete Probleme bei denormalisierten Daten
- IHK-relevant: Wichtig für Datenmodellierung und Datenbankdesign
- Praxis: Trade-off zwischen Normalisierung und Performance
Kernkomponenten
- Funktionale Abhängigkeit: X → Y (X bestimmt Y eindeutig)
- Primärschlüssel: Eindeutige Identifikation von Datensätzen
- Kandidatenschlüssel: Mögliche Primärschlüssel
- Partielle Abhängigkeit: Abhängigkeit von einem Teil des zusammengesetzten Schlüssels
- Transitive Abhängigkeit: Indirekte Abhängigkeit über Nicht-Schlüssel-Attribute
- Determinante: Attribut, das andere Attribute bestimmt
- Normalisierungsprozess: Schrittweise Anwendung der Normalformen
- Denormalisierung: Gezielte Redundanz für Performance-Optimierung
Praxisbeispiele
Unnormalisierte Tabelle (0NF)
-- Problematische Struktur mit Redundanz und Anomalien
CREATE TABLE Bestellungen (
bestell_nr INT,
bestellDatum DATE,
kundenName VARCHAR(100),
kundenAdresse VARCHAR(200),
artikel_nr INT,
artikelName VARCHAR(100),
preis DECIMAL(10,2),
menge INT,
gesamtpreis DECIMAL(10,2)
);
-- Daten mit Problemen
INSERT INTO Bestellungen VALUES
(1, '2024-01-15', 'Meier', 'Hauptstraße 1', 101, 'Laptop', 999.99, 2, 1999.98),
(1, '2024-01-15', 'Meier', 'Hauptstraße 1', 102, 'Maus', 29.99, 1, 29.99),
(2, '2024-01-16', 'Schmidt', 'Nebenstraße 2', 101, 'Laptop', 999.99, 1, 999.99);
1. Normalform (1NF)
-- Atomare Werte, keine Wiederholungsgruppen
CREATE TABLE Bestellungen_1NF (
bestell_nr INT,
bestellDatum DATE,
kundenName VARCHAR(100),
kundenAdresse VARCHAR(200),
artikel_nr INT,
artikelName VARCHAR(100),
preis DECIMAL(10,2),
menge INT,
gesamtpreis DECIMAL(10,2),
PRIMARY KEY (bestell_nr, artikel_nr)
);
-- Funktionale Abhängigkeiten:
-- bestell_nr, artikel_nr → menge, gesamtpreis
-- bestell_nr → bestellDatum, kundenName, kundenAdresse
-- artikel_nr → artikelName, preis
2. Normalform (2NF)
-- Eliminierung partieller Abhängigkeiten
CREATE TABLE Bestellungen_2NF (
bestell_nr INT PRIMARY KEY,
bestellDatum DATE,
kundenName VARCHAR(100),
kundenAdresse VARCHAR(200)
);
CREATE TABLE Bestellpositionen (
bestell_nr INT,
artikel_nr INT,
menge INT,
gesamtpreis DECIMAL(10,2),
PRIMARY KEY (bestell_nr, artikel_nr),
FOREIGN KEY (bestell_nr) REFERENCES Bestellungen_2NF(bestell_nr)
);
CREATE TABLE Artikel (
artikel_nr INT PRIMARY KEY,
artikelName VARCHAR(100),
preis DECIMAL(10,2)
);
3. Normalform (3NF)
-- Eliminierung transitiver Abhängigkeiten
CREATE TABLE Bestellungen_3NF (
bestell_nr INT PRIMARY KEY,
bestellDatum DATE,
kunden_id INT,
FOREIGN KEY (kunden_id) REFERENCES Kunden(kunden_id)
);
CREATE TABLE Kunden (
kunden_id INT PRIMARY KEY,
kundenName VARCHAR(100),
kundenAdresse VARCHAR(200)
);
CREATE TABLE Bestellpositionen (
bestell_nr INT,
artikel_nr INT,
menge INT,
PRIMARY KEY (bestell_nr, artikel_nr),
FOREIGN KEY (bestell_nr) REFERENCES Bestellungen_3NF(bestell_nr),
FOREIGN KEY (artikel_nr) REFERENCES Artikel(artikel_nr)
);
CREATE TABLE Artikel (
artikel_nr INT PRIMARY KEY,
artikelName VARCHAR(100),
preis DECIMAL(10,2)
);
Anomalien und ihre Lösungen
Insert-Anomalie (ohne Normalisierung)
-- Problem: Kunde kann ohne Bestellung nicht angelegt werden
-- Lösung: Separate Kundentabelle
INSERT INTO Kunden (kunden_id, kundenName, kundenAdresse)
VALUES (3, 'Mueller', 'Dritter Weg 3');
Update-Anomalie (ohne Normalisierung)
-- Problem: Kundenadresse muss an mehreren Stellen geändert werden
-- Lösung: Zentrale Kundentabelle
UPDATE Kunden
SET kundenAdresse = 'Hauptstraße 1a'
WHERE kunden_id = 1;
Delete-Anomalie (ohne Normalisierung)
-- Problem: Löschen der letzten Bestellung entfernt Kundendaten
-- Lösung: Separate Tabellen vermeiden unbeabsichtigtes Löschen
DELETE FROM Bestellpositionen WHERE bestell_nr = 1;
-- Kundendaten bleiben in Kundentabelle erhalten
BCNF (Boyce-Codd Normalform)
BCNF-Regel
Jede Determinante muss ein Kandidatenschlüssel sein.
-- Beispiel das 3NF aber nicht BCNF erfüllt
CREATE TABLE Projektmitarbeiter (
projekt_id INT,
mitarbeiter_id INT,
rolle VARCHAR(50),
PRIMARY KEY (projekt_id, mitarbeiter_id)
);
-- Funktionale Abhängigkeiten:
-- projekt_id, mitarbeiter_id → rolle
-- projekt_id, rolle → mitarbeiter_id (Determinante ist kein Kandidatenschlüssel!)
-- BCNF-Lösung: Aufteilung
CREATE TABLE Projektrollen (
projekt_id INT,
rolle VARCHAR(50),
mitarbeiter_id INT,
PRIMARY KEY (projekt_id, rolle)
);
CREATE TABLE Mitarbeiterprojekte (
projekt_id INT,
mitarbeiter_id INT,
PRIMARY KEY (projekt_id, mitarbeiter_id)
);
Vorteile und Nachteile
Vorteile der Normalisierung
- Datenintegrität: Vermeidung von Redundanz und Inkonsistenzen
- Wartbarkeit: Änderungen nur an einer Stelle erforderlich
- Speichereffizienz: Reduzierung von Redundanz
- Konsistenz: Einheitliche Datenrepräsentation
Nachteile
- Performance: Mehr Joins erforderlich
- Komplexität: Komplexere Datenstruktur
- Schreibperformance: Verteilte Updates auf mehrere Tabellen
- Lernkurve: Erfordert Verständnis funktionaler Abhängigkeiten
Häufige Prüfungsfragen
-
Was ist der Unterschied zwischen 2NF und 3NF? 2NF eliminiert partielle Abhängigkeiten, 3NF eliminiert transitive Abhängigkeiten.
-
Wann ist eine Tabelle in BCNF? Wenn jede Determinante ein Kandidatenschlüssel ist (strenger als 3NF).
-
Erklären Sie funktionale Abhängigkeiten! X → Y bedeutet, dass der Wert von X den Wert von Y eindeutig bestimmt.
-
Was sind Anomalien und wie werden sie vermieden? Insert, Update, Delete Anomalien werden durch Normalisierung vermieden.
Wichtigste Quellen
- https://de.wikipedia.org/wiki/Normalisierung_(Datenbank)
- https://www.gatech.edu/coe/cse/normalization
- https://www.sql-tutorial.ru/sql-normalization.html