Let the music play: Normalisieren oder einfach die Tabelle aufräumen

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:

  1. 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.
  2. 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.
  3. 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 IDAlbum nameArtistPublication YearYear of birth of lead artistTrackTrack name
8978Hurts 2B HumanP!nk201919791Hustle
8978Hurts 2B HumanP!nk201919792(Hey Why) Miss You Sometime
8978Hurts 2B HumanP!nk201919793Walk me home
8978Hurts 2B HumanP!nk201919794My Attic
8979Witness (Deluxe)Katy Perry 201719841Witness
8979Witness (Deluxe)Katy Perry 201719842Hey Hey Hey
8980Future NostalgiaDua Lipa202019951Future Nostalgia
8980Future NostalgiaDua Lipa202019952Don’t Start Now
8980Future NostalgiaDua Lipa202019953Physical
8981Heaven & HellAva Max202019941H.E.A.V.E.N
8981Heaven & HellAva Max202019942Kings & Queens
8982Future Nostalgia (DJ Mix)Dua Lipa202019951Future Nostalgia (Joe Goddard Remix / Mixed)
8982Future Nostalgia (DJ Mix)Dua Lipa202019952Physical (Mark Ronson Remix)
Die Tabelle – in der ersten Normalform

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:

  1. Aufteilen der Tabelle in zwei Tabellen: Albums und Tracks
  2. In Albums kommen die Daten zu jedem Album mit der Album ID als Primärschlüssel
  3. 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 IDAlbum nameArtistPublication YearYear of birth of lead artist
8978Hurts 2B HumanP!nk20191979
8979Witness (Deluxe)Katy Perry 20171984
8980Future NostalgiaDua Lipa20201995
8981Heaven & HellAva Max20201994
8982Future Nostalgia (DJ Mix)Dua Lipa20201995
Tabelle Albums in der 2. Normalform (2NF)
Album IDTrackTrack name
89781Hustle
89782(Hey Why) Miss You Sometime
89783Walk me home
89784My Attic
89791Witness
89792Hey Hey Hey
89801Future Nostalgia
89802Don’t Start Now
89803Physical
89811H.E.A.V.E.N
89812Kings & Queens
89821Future Nostalgia (Joe Goddard Remix / Mixed)
89822Physical (Mark Ronson Remix)
Tabelle Tracks in 2. Normalform (2NF)

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:

  1. Von der Tabelle Albums die Tabelle Artist abgetrennt wird
  2. In Artist bekommt jede Zeile dann eine eindeutige Artist ID (sehr zu empfehlen, damit namensgleiche Musikschaffende unterschieden werden können)
  3. In der Tabelle Albums wird der jeweilige Artist dann über die Artist ID (als Fremdschlüssel) referenziert

Damit ergeben sich jetzt drei Tabellen:

Artist IDArtistYear of birth of lead artist
1P!nk1979
2Katy Perry 1984
3Dua Lipa1995
4Ava Max1994
Tabelle Artist in der 3. Normalform (3NF)
Album IDAlbum nameArtist IDPublication Year
8978Hurts 2B Human12019
8979Witness (Deluxe)22017
8980Future Nostalgia32020
8981Heaven & Hell42020
8982Future Nostalgia (DJ Mix)32020
Tabelle Album in der 3. Normalform (3NF)
Album IDTrackTrack name
89781Hustle
89782(Hey Why) Miss You Sometime
89783Walk me home
89784My Attic
89791Witness
89792Hey Hey Hey
89801Future Nostalgia
89802Don’t Start Now
89803Physical
89811H.E.A.V.E.N
89812Kings & Queens
89821Future Nostalgia (Joe Goddard Remix / Mixed)
89822Physical (Mark Ronson Remix)
Tabelle Tracks in 3. Normalform (3NF)

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“.