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
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
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
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
Stammdaten-Tabellen für Regisseure, Darsteller und Genres mit eigenen IDs.
Beziehungstabellen (Film_Darsteller, Film_Genres) zur Abbildung der n:m-Beziehungen.
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
Filme Film_ID : Integer «PK» Titel : String Jahr : Integer Regisseur_ID : Integer «FK» Regisseure Regisseur_ID : Integer «PK» Name : String Telefon : String Darsteller Darsteller_ID : Integer «PK» Name : String Film_Darsteller Film_ID : Integer «FK» Darsteller_ID : Integer «FK» Genres Genre_ID : Integer «PK» Bezeichnung : String Film_Genres Film_ID : Integer «FK» Genre_ID : Integer «FK» gedreht von besetzt wirkt mit gehört zu klassifiziert Filme Film_ID : Integer «PK» Titel : String Jahr : Integer Regisseur_ID : Integer «FK» Regisseure Regisseur_ID : Integer «PK» Name : String Telefon : String Darsteller Darsteller_ID : Integer «PK» Name : String Film_Darsteller Film_ID : Integer «FK» Darsteller_ID : Integer «FK» Genres Genre_ID : Integer «PK» Bezeichnung : String Film_Genres Film_ID : Integer «FK» Genre_ID : Integer «FK» gedreht von besetzt wirkt mit gehört zu klassifiziert
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
}