Normalformen: 1NF, 2NF, 3NF, BCNF, 4NF & 5NF komplett
Dieser Beitrag ist eine umfassende Erläuterung aller Normalformen der Datenbanktheorie – von 1NF bis 5NF mit praktischen Beispielen.
In a Nutshell
Normalformen sind formale Regeln zur Strukturierung relationaler Datenbanken, die schrittweise Redundanz eliminieren und Datenintegrität gewährleisten. Jede höhere Normalform baut auf der vorherigen auf.
Kompakte Fachbeschreibung
Normalisierung ist der Prozess der schrittweisen Verbesserung von Datenbankstrukturen durch Anwendung formaler Regeln. Jede Normalform adressiert spezifische Anomalien und Abhängigkeiten.
Übersicht der Normalformen:
- 1NF: Atomare Werte, keine Wiederholungsgruppen
- 2NF: 1NF + keine partiellen Abhängigkeiten
- 3NF: 2NF + keine transitiven Abhängigkeiten
- BCNF: Stärkere 3NF mit strengeren Regeln
- 4NF: 3NF + keine Multi-Valued Dependencies
- 5NF: 4NF + keine Join Dependencies
Mathematische Grundlagen:
- Funktionale Abhängigkeiten: X → Y
- Multi-Valued Dependencies: X →→ Y
- Join Dependencies: (A, B, C)
Praxisrelevanz: Die ersten drei Normalformen (1NF-3NF) sind für die meisten Anwendungen ausreichend. Höhere Normalformen (4NF-5NF) sind für komplexe Datenstrukturen und akademische Kontexte relevant.
Prüfungsrelevante Stichpunkte
- 1NF: Atomare Werte, keine Wiederholungsgruppen, eindeutige Primärschlüssel
- 2NF: Keine partiellen Abhängigkeiten vom zusammengesetzten Primärschlüssel
- 3NF: Keine transitiven Abhängigkeiten über Nicht-Schlüssel-Attribute
- BCNF: Jede Determinante ist ein Kandidatenschlüssel
- 4NF: Keine Multi-Valued Dependencies außer trivialen
- 5NF: Keine Join Dependencies außer durch Kandidatenschlüssel
- Funktionale Abhängigkeiten: Grundlage der Normalisierung
- IHK-relevant: Besonders 1NF-3NF für Datenbankdesign
Kernkomponenten
- Funktionale Abhängigkeit (FD): X → Y (X bestimmt Y eindeutig)
- Multi-Valued Dependency (MVD): X →→ Y (X bestimmt mehrere Y-Werte)
- Join Dependency (JD): (A, B, C) (Tabelle kann aus Joins rekonstruiert werden)
- Determinante: Attribut, das andere Attribute bestimmt
- Kandidatenschlüssel: Minimale eindeutige Identifikatoren
- Primärschlüssel: Ausgewählter Kandidatenschlüssel
- Partielle Abhängigkeit: Abhängigkeit von Teil des zusammengesetzten Schlüssels
- Transitive Abhängigkeit: Indirekte Abhängigkeit über Nicht-Schlüssel
Praxisbeispiele
1. Normalform (1NF)
-- Problem: Nicht-atomare Werte und Wiederholungsgruppen
CREATE TABLE Bestellungen_Schlecht (
bestell_id INT,
kunde VARCHAR(100),
artikel_liste VARCHAR(500), -- Nicht-atomar
telefonnummern VARCHAR(200) -- Wiederholungsgruppe
);
-- 1NF-Lösung: Atomare Werte
CREATE TABLE Bestellungen_1NF (
bestell_id INT PRIMARY KEY,
kunden_id INT,
bestelldatum DATE
);
CREATE TABLE Bestellpositionen (
bestell_id INT,
positionsnummer INT,
artikel_id INT,
menge INT,
PRIMARY KEY (bestell_id, positionsnummer)
);
CREATE TABLE Kunden_Telefone (
kunden_id INT,
telefonnummer VARCHAR(20),
PRIMARY KEY (kunden_id, telefonnummer)
);
2. Normalform (2NF)
-- Problem: Partielle Abhängigkeiten
CREATE TABLE Bestellpositionen_2NF_Problem (
bestell_id INT,
artikel_id INT,
menge INT,
artikel_name VARCHAR(100), -- Hängt nur von artikel_id ab
preis DECIMAL(10,2), -- Hängt nur von artikel_id ab
PRIMARY KEY (bestell_id, artikel_id)
);
-- 2NF-Lösung: Eliminiere partielle Abhängigkeiten
CREATE TABLE Bestellpositionen_2NF (
bestell_id INT,
artikel_id INT,
menge INT,
PRIMARY KEY (bestell_id, artikel_id)
);
CREATE TABLE Artikel (
artikel_id INT PRIMARY KEY,
artikel_name VARCHAR(100),
preis DECIMAL(10,2)
);
3. Normalform (3NF)
-- Problem: Transitive Abhängigkeiten
CREATE TABLE Mitarbeiter_3NF_Problem (
mitarbeiter_id INT PRIMARY KEY,
name VARCHAR(100),
abteilungs_id INT,
abteilungs_name VARCHAR(100), -- Transitiv: abteilungs_id → abteilungs_name
standort VARCHAR(50) -- Transitiv: abteilungs_id → standort
);
-- 3NF-Lösung: Eliminiere transitive Abhängigkeiten
CREATE TABLE Mitarbeiter_3NF (
mitarbeiter_id INT PRIMARY KEY,
name VARCHAR(100),
abteilungs_id INT
);
CREATE TABLE Abteilungen (
abteilungs_id INT PRIMARY KEY,
abteilungs_name VARCHAR(100),
standort VARCHAR(50)
);
Boyce-Codd Normalform (BCNF)
-- Problem: 3NF aber nicht BCNF
CREATE TABLE Projektmitarbeiter_BCNF_Problem (
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 kein Kandidatenschlüssel!)
-- BCNF-Lösung
CREATE TABLE Projektrollen (
projekt_id INT,
rolle VARCHAR(50),
mitarbeiter_id INT,
PRIMARY KEY (projekt_id, rolle)
);
4. Normalform (4NF)
-- Problem: Multi-Valued Dependencies
CREATE TABLE Mitarbeiter_Kenntnisse_4NF_Problem (
mitarbeiter_id INT,
programmiersprache VARCHAR(50),
projekt_id INT,
PRIMARY KEY (mitarbeiter_id, programmiersprache, projekt_id)
);
-- MVDs: mitarbeiter_id →→ programmiersprache, mitarbeiter_id →→ projekt_id
-- 4NF-Lösung: Separation von MVDs
CREATE TABLE Mitarbeiter_Sprachen (
mitarbeiter_id INT,
programmiersprache VARCHAR(50),
PRIMARY KEY (mitarbeiter_id, programmiersprache)
);
CREATE TABLE Mitarbeiter_Projekte (
mitarbeiter_id INT,
projekt_id INT,
PRIMARY KEY (mitarbeiter_id, projekt_id)
);
5. Normalform (5NF)
-- Problem: Join Dependencies
CREATE TABLE Lieferanten_Produkte_Kunden_5NF_Problem (
lieferant_id INT,
produkt_id INT,
kunden_id INT,
PRIMARY KEY (lieferant_id, produkt_id, kunden_id)
);
-- JD: *(Lieferanten_Produkte, Produkte_Kunden, Lieferanten_Kunden)*
-- 5NF-Lösung: Dekomposition in Projectionen
CREATE TABLE Lieferanten_Produkte (
lieferant_id INT,
produkt_id INT,
PRIMARY KEY (lieferant_id, produkt_id)
);
CREATE TABLE Produkte_Kunden (
produkt_id INT,
kunden_id INT,
PRIMARY KEY (produkt_id, kunden_id)
);
CREATE TABLE Lieferanten_Kunden (
lieferant_id INT,
kunden_id INT,
PRIMARY KEY (lieferant_id, kunden_id)
);
Normalisierungsprozess
Schritt 1: Identifikation von Abhängigkeiten
-- Analyse funktionaler Abhängigkeiten
-- Beispiel: Bestellungssystem
-- bestell_id → bestelldatum, kunden_id
-- kunden_id → kundenname, adresse
-- bestell_id, artikel_id → menge, einzelpreis
-- artikel_id → artikelname, lagerbestand
Schritt 2: Anwendung der Normalformen
-- 1NF: Atomare Werte sicherstellen
-- 2NF: Partielle Abhängigkeiten eliminieren
-- 3NF: Transitive Abhängigkeiten eliminieren
-- BCNF: Determinanten als Kandidatenschlüssel
-- 4NF: Multi-Valued Dependencies eliminieren
-- 5NF: Join Dependencies eliminieren
Schritt 3: Überprüfung
-- Test auf Anomalien
INSERT INTO ... -- Insert-Anomalien?
UPDATE ... -- Update-Anomalien?
DELETE ... -- Delete-Anomalien?
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
- Skalierbarkeit: Bessere Performance bei großen Datenmengen
Nachteile
- Performance: Mehr Joins erforderlich
- Komplexität: Komplexere Datenstruktur
- Schreibperformance: Verteilte Updates
- Over-Engineering: Zu hohe Normalisierung kann kontraproduktiv sein
Denormalisierungstrategien
Gezielte Redundanz für Performance
-- Denormalisierte Version für Reporting
CREATE TABLE Bestellungen_Report (
bestell_id INT PRIMARY KEY,
bestelldatum DATE,
kundenname VARCHAR(100), -- Redundant aus Kundentabelle
artikelname VARCHAR(100), -- Redundant aus Artikeltabelle
menge INT,
gesamtpreis DECIMAL(10,2)
);
Häufige Prüfungsfragen
-
Wann ist eine Tabelle in 3NF aber nicht in BCNF? Wenn eine Determinante kein Kandidatenschlüssel ist (Beispiel: Projektmitarbeiter mit Rollen).
-
Was ist der Unterschied zwischen 3NF und BCNF? BCNF ist strenger: jede Determinante muss ein Kandidatenschlüssel sein.
-
Erklären Sie Multi-Valued Dependencies! X →→ Y bedeutet, dass für jeden X-Wert die Menge der Y-Werte unabhängig von anderen Attributen ist.
-
Wann sind höhere Normalformen (4NF, 5NF) praktisch relevant? Bei sehr komplexen Datenstrukturen mit vielen Beziehungen, meist in akademischen oder spezialisierten Systemen.
Wichtigste Quellen
- https://de.wikipedia.org/wiki/Normalisierung_(Datenbank)
- https://www.gatech.edu/coe/cse/database-normalization
- https://www.sql-tutorial.ru/sql-normalization-complete.html