Zum Inhalt

Normalisierung der Filmdatenbank

Ausgangspunkt: Unnormalisierte Tabelle

Die unnormalisierte Tabelle enthält mehrere Probleme:

  • Mehrere Werte in einer Zelle: Hauptdarsteller und Genre enthalten mehrere Einträge pro Film.
  • Doppelte Daten: Regisseur-Telefonnummern werden mehrfach wiederholt.

Unnormalisierte Tabelle

Film_ID Titel Jahr Regisseur Regisseur_Telefon Hauptdarsteller Genre
1 Der Pate 1972 Francis Ford Coppola 0123-456789 Marlon Brando, Al Pacino Drama, Krimi
2 Inception 2010 Christopher Nolan 0987-654321 Leonardo DiCaprio Sci-Fi, Thriller
3 Pulp Fiction 1994 Quentin Tarantino 0456-789012 John Travolta, Uma Thurman Drama, Krimi
4 Titanic 1997 James Cameron 0123-456789 Leonardo DiCaprio, Kate Winslet Drama, Romantik
5 The Dark Knight 2008 Christopher Nolan 0987-654321 Christian Bale, Heath Ledger Action, Drama

Erste Normalform (1NF)

Anforderungen der 1NF

  • Atomare Werte: Keine Mehrfachwerte in einem Feld.
  • Eindeutige Zeilen: Jede Zeile repräsentiert eine einzelne Informationseinheit.

Lösung: Aufteilen der Mehrfachwerte in separate Zeilen

Film_ID Titel Jahr Regisseur Regisseur_Telefon Hauptdarsteller Genre
1 Der Pate 1972 Francis Ford Coppola 0123-456789 Marlon Brando Drama
1 Der Pate 1972 Francis Ford Coppola 0123-456789 Al Pacino Krimi
2 Inception 2010 Christopher Nolan 0987-654321 Leonardo DiCaprio Sci-Fi
2 Inception 2010 Christopher Nolan 0987-654321 Leonardo DiCaprio Thriller
3 Pulp Fiction 1994 Quentin Tarantino 0456-789012 John Travolta Drama
3 Pulp Fiction 1994 Quentin Tarantino 0456-789012 Uma Thurman Krimi
4 Titanic 1997 James Cameron 0123-456789 Leonardo DiCaprio Drama
4 Titanic 1997 James Cameron 0123-456789 Kate Winslet Romantik
5 The Dark Knight 2008 Christopher Nolan 0987-654321 Christian Bale Action
5 The Dark Knight 2008 Christopher Nolan 0987-654321 Heath Ledger Drama

Zweite Normalform (2NF)

Anforderungen der 2NF

  • Tabelle muss in 1NF sein.
  • Funktionale Abhängigkeiten: Alle Nicht-Schlüsselattribute müssen vollständig vom Primärschlüssel abhängen.

Probleme in 1NF

  • „Regisseur“ und „Regisseur_Telefon“ hängen nicht direkt von „Film_ID“ ab, sondern nur vom Regisseur.

Lösung: Aufteilung der Tabelle in separate Entitäten

Filme

Film_ID Titel Jahr Regisseur_ID
1 Der Pate 1972 1
2 Inception 2010 2
3 Pulp Fiction 1994 3
4 Titanic 1997 4
5 The Dark Knight 2008 2

Regisseure

Regisseur_ID Regisseur Regisseur_Telefon
1 Francis Ford Coppola 0123-456789
2 Christopher Nolan 0987-654321
3 Quentin Tarantino 0456-789012
4 James Cameron 0123-456789

Hauptdarsteller

Film_ID Hauptdarsteller
1 Marlon Brando
1 Al Pacino
2 Leonardo DiCaprio
3 John Travolta
3 Uma Thurman
4 Kate Winslet
5 Christian Bale
5 Heath Ledger

Genres

Film_ID Genre
1 Drama
1 Krimi
2 Sci-Fi
2 Thriller
3 Drama
3 Krimi
4 Drama
4 Romantik
5 Action
5 Drama

Dritte Normalform (3NF)

Anforderungen der 3NF

  • Tabelle muss in 2NF sein.
  • Keine transitiven Abhängigkeiten: Attribute hängen ausschließlich vom Primärschlüssel ab.

Analyse

  • In den 2NF-Tabellen „Hauptdarsteller“ und „Genres“ existieren keine Primärschlüssel.
  • Darsteller- und Genre-Namen würden bei mehreren Filmen mehrfach vorkommen ⇒ transitive Abhängigkeiten.

Lösung für 3NF

  1. Stammdaten-Tabellen für Regisseure, Darsteller und Genres mit eigenen IDs.
  2. Beziehungstabellen (Film_Darsteller, Film_Genres) zur Abbildung der n:m-Beziehungen.
  3. Nur die IDs werden zwischen Tabellen verknüpft, alle Beschreibungen liegen genau einmal vor.

Ergebnis-Tabellen in 3NF

Filme

Film_ID Titel Jahr Regisseur_ID
1 Der Pate 1972 1
2 Inception 2010 2
3 Pulp Fiction 1994 3
4 Titanic 1997 4
5 The Dark Knight 2008 2

Regisseure

Regisseur_ID Name Telefon
1 Francis Ford Coppola 0123-456789
2 Christopher Nolan 0987-654321
3 Quentin Tarantino 0456-789012
4 James Cameron 0123-456789

Darsteller

Darsteller_ID Name
1 Marlon Brando
2 Al Pacino
3 Leonardo DiCaprio
4 John Travolta
5 Uma Thurman
6 Kate Winslet
7 Christian Bale
8 Heath Ledger

Film_Darsteller

Film_ID Darsteller_ID
1 1
1 2
2 3
3 4
3 5
4 3
4 6
5 7
5 8

Genres

Genre_ID Bezeichnung
1 Drama
2 Krimi
3 Sci-Fi
4 Thriller
5 Romantik
6 Action

Film_Genres

Film_ID Genre_ID
1 1
1 2
2 3
2 4
3 1
3 2
4 1
4 5
5 6
5 1

PUML-Modell

FilmeFilm_ID : Integer «PK»Titel : StringJahr : IntegerRegisseur_ID : Integer «FK»RegisseureRegisseur_ID : Integer «PK»Name : StringTelefon : StringDarstellerDarsteller_ID : Integer «PK»Name : StringFilm_DarstellerFilm_ID : Integer «FK»Darsteller_ID : Integer «FK»GenresGenre_ID : Integer «PK»Bezeichnung : StringFilm_GenresFilm_ID : Integer «FK»Genre_ID : Integer «FK»gedreht vonbesetztwirkt mitgehört zuklassifiziert
FilmeFilm_ID : Integer «PK»Titel : StringJahr : IntegerRegisseur_ID : Integer «FK»RegisseureRegisseur_ID : Integer «PK»Name : StringTelefon : StringDarstellerDarsteller_ID : Integer «PK»Name : StringFilm_DarstellerFilm_ID : Integer «FK»Darsteller_ID : Integer «FK»GenresGenre_ID : Integer «PK»Bezeichnung : StringFilm_GenresFilm_ID : Integer «FK»Genre_ID : Integer «FK»gedreht vonbesetztwirkt mitgehört zuklassifiziert

Mermaid-Modell (UML-Notation)

erDiagram
  Filme }o--|| Regisseure : "gedreht von"
  Filme ||--o{ Film_Darsteller : "besetzt"
  Darsteller ||--o{ Film_Darsteller : "wirkt mit"
  Filme ||--o{ Film_Genres : "gehört zu"
  Genres ||--o{ Film_Genres : "klassifiziert"

  Filme {
    int Film_ID PK
    string Titel
    int Jahr
    int Regisseur_ID FK
  }

  Regisseure {
    int Regisseur_ID PK
    string Name
    string Telefon
  }

  Darsteller {
    int Darsteller_ID PK
    string Name
  }

  Film_Darsteller {
    int Film_ID FK
    int Darsteller_ID FK
  }

  Genres {
    int Genre_ID PK
    string Bezeichnung
  }

  Film_Genres {
    int Film_ID FK
    int Genre_ID FK
  }