Dieser Beitrag ist Teil der Fallstudie „Let the music play“.
normalisieren = Tabellenstruktur (logisch) aufräumen
Von Kuddelmuddel zur ersten Ordnung: die 1. Normalform (1NF)
So wie die Tabelle mit Alben, Artists und Tracks wild vermischt am Anfang ist (siehe hier), ist es Mist für jede gezielte und saubere Auswertung. Weil Daten sind vermischt in einer Spalte (Album mit Artist und echtem Albumname vermischt) oder irgendwie chaotisch, unterschiedlich wie bei den Tracks.
Das räumen wir auf:
- Jeder Wert(e)bereich (auch Domäne genannt) bekommt eine eigene Spalte: Aus Album werden Album name und Artist. Und schon können wir hier sauber filtern.
- Auch trennen wir die Zeilen auf, damit wir pro Zeile einen Track haben (auch ein einheitlich definierter Wertebereich dann und nicht so ein Chaos mit unterschiedlichsten Schreibweisen wie am Anfang): Also trennen wir die Zeilen auf.
- Damit wir jede Zeile eindeutig identifizieren können, muss immer die Kombination aus Album ID und Track (number) eindeutig sein. Gibt halt bei jedem Album nur einen Track 1. 😉
Das Ganze sieht dann als Ergebnis so aus (in Violett immer die Primärschlüssel = darüber wird jede Zeile eindeutig identifiziert):
Album ID | Album name | Artist | Publication Year | Year of birth of lead artist | Track | Track name |
---|---|---|---|---|---|---|
8978 | Hurts 2B Human | P!nk | 2019 | 1979 | 1 | Hustle |
8978 | Hurts 2B Human | P!nk | 2019 | 1979 | 2 | (Hey Why) Miss You Sometime |
8978 | Hurts 2B Human | P!nk | 2019 | 1979 | 3 | Walk me home |
8978 | Hurts 2B Human | P!nk | 2019 | 1979 | 4 | My Attic |
8979 | Witness (Deluxe) | Katy Perry | 2017 | 1984 | 1 | Witness |
8979 | Witness (Deluxe) | Katy Perry | 2017 | 1984 | 2 | Hey Hey Hey |
8980 | Future Nostalgia | Dua Lipa | 2020 | 1995 | 1 | Future Nostalgia |
8980 | Future Nostalgia | Dua Lipa | 2020 | 1995 | 2 | Don’t Start Now |
8980 | Future Nostalgia | Dua Lipa | 2020 | 1995 | 3 | Physical |
8981 | Heaven & Hell | Ava Max | 2020 | 1994 | 1 | H.E.A.V.E.N |
8981 | Heaven & Hell | Ava Max | 2020 | 1994 | 2 | Kings & Queens |
8982 | Future Nostalgia (DJ Mix) | Dua Lipa | 2020 | 1995 | 1 | Future Nostalgia (Joe Goddard Remix / Mixed) |
8982 | Future Nostalgia (DJ Mix) | Dua Lipa | 2020 | 1995 | 2 | Physical (Mark Ronson Remix) |
Damit haben wir die erste Normalform erreicht: Alle Spalten haben einen eindeutigen Wertebereich und wir finden jede Zeile über einen eindeutigen (Primär-)Schlüssel (in diesem Fall die Kombination aus Album ID und Track) wieder.
Weiter aufräumen: die zweite Normalform (2NF)
Was jetzt auffällt: Einzelne Teile der Tabelle sind gar nicht vom ganzen Primärschlüssel aus Album ID und Track abhängig. Sondern nur von der Album ID. Ist auch logisch, da ein Album als Ganzes einen Namen, Artist, Veröffentlichungsjahr und Geburtsjahr für den Lead Artist hat. Und da wiederholen sich Daten dann auch nur – nicht gerade effizient wenn z.B. eine Änderung zig Mal kopiert werden müsste. Das geht besser:
- Aufteilen der Tabelle in zwei Tabellen: Albums und Tracks
- In Albums kommen die Daten zu jedem Album mit der Album ID als Primärschlüssel
- In Tracks werden die einzelnen Tracks aufgenommen – jeweils identifiziert durch Album ID und Track als zusammengesetztem/kombiniertem Primärschlüssel
Damit ergeben sich diese zwei Tabellen:
Album ID | Album name | Artist | Publication Year | Year of birth of lead artist |
8978 | Hurts 2B Human | P!nk | 2019 | 1979 |
8979 | Witness (Deluxe) | Katy Perry | 2017 | 1984 |
8980 | Future Nostalgia | Dua Lipa | 2020 | 1995 |
8981 | Heaven & Hell | Ava Max | 2020 | 1994 |
8982 | Future Nostalgia (DJ Mix) | Dua Lipa | 2020 | 1995 |
Album ID | Track | Track name |
8978 | 1 | Hustle |
8978 | 2 | (Hey Why) Miss You Sometime |
8978 | 3 | Walk me home |
8978 | 4 | My Attic |
8979 | 1 | Witness |
8979 | 2 | Hey Hey Hey |
8980 | 1 | Future Nostalgia |
8980 | 2 | Don’t Start Now |
8980 | 3 | Physical |
8981 | 1 | H.E.A.V.E.N |
8981 | 2 | Kings & Queens |
8982 | 1 | Future Nostalgia (Joe Goddard Remix / Mixed) |
8982 | 2 | Physical (Mark Ronson Remix) |
Damit haben wir jetzt die zweite Normalform erreicht, denn es gilt: Jedes andere Attribut hängt immer vom vollständigen Primärschlüssel ab.
Dritte Normalform oder genau richtig für die Praxis
Jetzt hat unsere Tabelle Albums noch den Nachteil, dass die Spalte bzw. der Inhalt in Year of birth of lead artist eigentlich von Artist abhängt und nicht direkt vom Primärschlüssel. Das nennt sich transitive Abhängigkeit und hat wieder den Nachteil, dass Änderungen mehrfach gemacht werden müssten oder auch Paradoxien auftreten können.
Paradoxien? Beispielsweise könnte in der Tabelle in der zweiten Normalform kein Artist (oder Künstlerin oder Künstler oder Band oder Musikschaffendenkollektiv 😉 ) ohne ein Album angelegt werden. Nicht unbedingt optimal. Und dann stehen auch wieder Dinge doppelt drin.
Und das räumen wir jetzt auf indem:
- Von der Tabelle Albums die Tabelle Artist abgetrennt wird
- In Artist bekommt jede Zeile dann eine eindeutige Artist ID (sehr zu empfehlen, damit namensgleiche Musikschaffende unterschieden werden können)
- In der Tabelle Albums wird der jeweilige Artist dann über die Artist ID (als Fremdschlüssel) referenziert
Damit ergeben sich jetzt drei Tabellen:
Artist ID | Artist | Year of birth of lead artist |
1 | P!nk | 1979 |
2 | Katy Perry | 1984 |
3 | Dua Lipa | 1995 |
4 | Ava Max | 1994 |
Album ID | Album name | Artist ID | Publication Year |
8978 | Hurts 2B Human | 1 | 2019 |
8979 | Witness (Deluxe) | 2 | 2017 |
8980 | Future Nostalgia | 3 | 2020 |
8981 | Heaven & Hell | 4 | 2020 |
8982 | Future Nostalgia (DJ Mix) | 3 | 2020 |
Album ID | Track | Track name |
8978 | 1 | Hustle |
8978 | 2 | (Hey Why) Miss You Sometime |
8978 | 3 | Walk me home |
8978 | 4 | My Attic |
8979 | 1 | Witness |
8979 | 2 | Hey Hey Hey |
8980 | 1 | Future Nostalgia |
8980 | 2 | Don’t Start Now |
8980 | 3 | Physical |
8981 | 1 | H.E.A.V.E.N |
8981 | 2 | Kings & Queens |
8982 | 1 | Future Nostalgia (Joe Goddard Remix / Mixed) |
8982 | 2 | Physical (Mark Ronson Remix) |
Was auffällt: Tracks ist unverändert zur 2. Normalform. Da ist die 2. und 3. Normalform gleich. Einfache Erklärung: Alle Spalten sind voll abhängig vom Primärschlüssel. Das ist immer gegeben, wenn es nur noch eine (oder keine) Nicht-Primärschlüssel-Spalte gibt.
Was haben wir erreicht: Keine transitiven Abhängigkeiten mehr. Alle Attribute bzw. Spalten hängen jeweils voll vom Primärschlüssel ab.
Fazit
Mit der dritten Normalform ist eine gut umsetzbare und nutzbare Form aus der ursprünglichen Tabelle entstanden. Über passende SQL-Befehle kann die sauber angelegt, gefüllt und genutzt werden. Auch kann die erreichte Form gut in einem Entity-Relationship-Model dargestellt werden (und umgekehrt aus diesem abgeleitet werden).
In der wissenschaftlichen Literatur gibt es noch weitere, definierte Normalformen, welche in der Praxis jedoch keine Rolle spielen. Mit der dritten Normalform ist bereits ein sehr sauberer Stand für die Datenablage und Nutzung erreicht. Praktisch wird in bestimmten Situationen sogar de-normalisiert, d.h. für die Beschleunigung oder Vorberechnung von Anfragen werden Daten bewusst wieder in die 2. oder 1. Normalform zurückgespielt. Typisches Anwendungsfall dafür sind große „Datenlager“, wie ein Data Warehouse (DWH) oder auch ein Data Lake, im Kontext von Business Intelligence (BI) oder weiteren Datenanalysen.
Dieser Beitrag ist Teil der Serie zur Fallstudie „Let the music play“.
2 Gedanken zu „Let the music play: Normalisieren oder einfach die Tabelle aufräumen“
Kommentare sind geschlossen.