DB Kurs Naechste Lektion

Lektion 03 - Normalisierung

1NF, 2NF und 3NF verstehen und anwenden

Normalisierung bedeutet: Tabellen so aufteilen, dass Daten sauber, eindeutig und wartbar gespeichert werden. Ziel ist weniger Wiederholung, weniger Widerspruch und weniger Fehler beim Einfuegen, Aendern oder Loeschen.

1. Warum normalisieren?

Schlechte Tabellen fuehren zu Anomalien. Eine Anomalie ist ein Problem, das durch schlechte Datenstruktur entsteht.

AnomalieBeispiel
Einfuege-AnomalieEin Kurs kann nicht gespeichert werden, solange kein User eingetragen ist.
Aenderungs-AnomalieEine Kursbezeichnung muss an zehn Stellen geaendert werden.
Loesch-AnomalieWenn der letzte User geloescht wird, verschwindet auch Kurswissen.

2. Schlechte Ausgangstabelle

Diese Tabelle speichert zu viel auf einmal. Sie enthaelt User, Kursdaten und mehrere Lektionen in einer Zeile.

useremailcourselessonsteacher
Minamina@example.comDartVariablen, Klassen, FlutterSam
Alexalex@example.comDartVariablen, Klassen, FlutterSam

Problem: Lektionen stehen als Liste in einem Feld. Kurs und Teacher werden wiederholt. Das ist schwer zu pflegen.

3. Erste Normalform: 1NF

Eine Tabelle ist in der ersten Normalform, wenn jedes Feld nur einen atomaren Wert enthaelt. Atomar bedeutet: nicht weiter sinnvoll teilbar in mehrere Werte.

Nicht 1NF:
  lessons = "Variablen, Klassen, Flutter"

1NF:
  Eine Zeile pro User-Kurs-Lektion-Kombination
usercourselessonteacher
MinaDartVariablenSam
MinaDartKlassenSam
MinaDartFlutterSam

1NF entfernt Listen in Feldern, aber Wiederholungen koennen noch bleiben.

4. Zweite Normalform: 2NF

Die zweite Normalform baut auf 1NF auf. Sie verlangt: Alle Nicht-Schluesselfelder muessen vom ganzen Schluessel abhaengen, nicht nur von einem Teil. Das ist besonders wichtig bei zusammengesetzten Schluesseln.

Problem:
  user_name haengt nur von user_id ab.
  course_title haengt nur von course_id ab.
  Beide stehen aber in einer kombinierten Tabelle.

Loesung:
  Userdaten in users
  Kursdaten in courses
  Teilnahme in enrollments
users(id, name, email)
courses(id, title, teacher)
enrollments(user_id, course_id)

5. Dritte Normalform: 3NF

Die dritte Normalform baut auf 2NF auf. Sie verlangt: Nicht-Schluesselfelder duerfen nicht von anderen Nicht-Schluesselfeldern abhaengen.

Problem:
  courses(id, title, teacher_name, teacher_email)

teacher_email haengt von teacher_name ab,
nicht direkt vom Kurs.

Loesung:
  teachers(id, name, email)
  courses(id, title, teacher_id)

Dadurch wird die Teacher-Mail nur einmal gespeichert. Wenn sie sich aendert, muss sie nur in teachers geaendert werden.

6. Normalisierung Schritt fuer Schritt

  1. Markiere alle Wiederholungen und Listen in Feldern.
  2. Bringe die Tabelle in 1NF: ein Feld, ein Wert.
  3. Suche Daten, die nur von einem Teil eines zusammengesetzten Schluessels abhaengen.
  4. Bringe die Tabelle in 2NF: eigene Tabellen fuer eigene Themen.
  5. Suche Abhaengigkeiten zwischen Nicht-Schluesselfeldern.
  6. Bringe die Tabelle in 3NF: abhaengige Daten auslagern.

7. Normalisierungs-Uebung: Lernsystem

Normalisiere diese Tabelle bis zur dritten Normalform:

learning_data(
  user_name,
  user_email,
  course_title,
  course_topic,
  lesson_titles,
  teacher_name,
  teacher_email,
  completed_at
)
  1. Welche Spalte verletzt die 1NF?
  2. Welche Daten wiederholen sich?
  3. Welche Tabellen brauchst du fuer 2NF?
  4. Welche Teacher-Daten sollten fuer 3NF ausgelagert werden?
  5. Schreibe die finalen Tabellen mit Primaer- und Fremdschluesseln auf.

8. Weitere Uebungen

  1. Normalisiere eine Shop-Tabelle mit Kunde, Produkt, Bestellung und Menge.
  2. Normalisiere eine Blog-Tabelle mit Autor, Beitrag und Kategorie.
  3. Erklaere 1NF, 2NF und 3NF jeweils in einem Satz.
  4. Finde drei Beispiele fuer Aenderungs-Anomalien.
  5. Erstelle ein ER-Modell fuer users, courses, lessons, tasks.
  6. Schreibe fuer dein Modell alle Fremdschluessel auf.
Weiter zum SQL Factsheet