Relationales Datenbanksystem

Eines der weite verbreiteten Datenbanksysteme ist das sogenannte relationale Datenbanksystem. Es basiert auf dem mathematischen Begriff der Relation, erarbeitet zwischen 1960 und 1970 vom britischen Mathematiker Edgar F. Codd.

https://commons.wikimedia.org/wiki/File:Begriffe_relationaler_Datenbanken.svg

Die Relation beschreibt durch Attribute und Tupel eine Tabelle mit Spaltennamen und zeilenweisen Einträgen.

Konzepte

Eine relationale Datenbank kann man sich als Sammlung von Tabellen vorstellen, in denen Datensätze abgespeichert sind. Jede Zeile ist ein Datensatz. Jeder Datensatz setzt sich aus Attributwerten zusammen. Das Relationsschema legt die Anzahl und den Typ der Attribute fest. Dabei muss jeder Datensatz eindeutig identifizierbar sein. Das geschieht über einen oder mehrere Schlüssel (engl. key).

Die Tabelle «movies» einer fiktiven Film-Datenbank.

id title year
1 Argo 2012
2 12 Years a Slave 2013
3 Birdman 2014
4 Spotlight 2015
5 Moonlight 2016
6 The Shape of Water 2017
Tabelle der Relation «movies»
Datensatz
Jede Zeile enthält einen Datensatz, also einen Film. Dieser wird durch die Attribute und ihre Werte beschrieben. Je nach Konfiguration können einzelne Werte auch null sein. Jeder Film muss einen Titel haben, das Erscheinungsjahr könnte aber offen bleiben (Wenn man dieses nicht kennt oder der Film nächstes oder übernächstes Jahr erscheinen soll).
Schlüssel (keys)
id ist ein sogenannter Primärschlüssel (primary key). Jeder Film erhält hier eine eindeutige Zahl.
Attribute
title – Jeder Datensatz speichert hier den Titel des Filmes (Text)
year – Jeder Datensatz speichert hier das Erscheinungsjahr des Filmes (Zahl)

Verknüpfungen zwischen Tabellen

Verknüpfungen werden benutzt um Beziehungen zwischen Relationen auszudrücken; denn meistens bestehen Datenbanken nicht nur aus einer einzigen Relation.

Im Beispiel möchte man zu den Filmen noch weitere Angaben wissen: Wer hat mitgespielt? Wie wurde der Film bewertet? Welches sind die besten Zitate im Film?

Dazu führen wir nun weitere Relationen ein und verknüpfen diese mit der Relation «movies».

Kardinalität

Mit der Kardinalität beschreibt man den Grad einer Beziehung zwischen zwei Relationen. Die Angabe der Kardinalität erfolgt durch eine Zahl bzw. einen Buchstaben oder einer Buchstabenkombination, die man im Diagramm an die Verbindungslinie der beiden Rechtecke schreibt, welche für die Tabellen stehen. Die drei gebräuchlichsten Kardinalitätstypen sind:

1:1-Beziehung

Wir möchten zu jedem Film eine Bewertung haben. Dazu führen wir die Relation «ratings» ein.
Jeder Datensatz von «ratings» gehört genau zu einem Datensatz von «movies».

1:1-Beziehung

Umsetzung
Irgendwie müssen wir zu jedem Film den korrekten Eintrag in der Tabelle «ratings» finden. Da jeder Film durch seinen Primärschlüssel eindeutig identifiziert werden kann, fügen wir diesen in der neuen Tabelle «ratings» ein.

movie_id rank votes
5 2 9310
3 232 3149
4 12 6702
2 74 2497
Tabelle der Relation «ratings»
Schlüssel (keys)
movie_id ist ein sogenannter Fremdschlüssel (foreign key). Er beschreibt zu welchem Film die Bewertung gehört. Da es pro Film maximal eine Bewertung geben kann, ist movie_id gleichzeitig der Primärschlüssel der Tabelle «ratings»

1:n-Beziehung

Wenn wir jedem Film Zitate zuweisen möchten, dann kann ein Film mehrere Zitate haben – jedoch macht es wenig Sinn wenn ein Zitat zu mehr als einem Film gehören soll.

1:n-Beziehung

Umsetzung
Die Detail-Tabelle erhält eine zusätzliche Spalte, die als Fremdschlüssel den Primärschlüssel der Master-Tabelle aufnimmt.

id movie_id quotetext
1 5 Little: My name is Chiron, people call me little.
2 5 Black: It is what it is.
3 3 Mike Shiner: Popularity is the slutty little cousin of prestige.
Tabelle der Relation «quotes»
Schlüssel (keys)
id ist der Primärschlüssel der Relation «quotes». Er identifiziert eindeutig ein Zitat, also einen Datensatz in der Tabelle «quotes»
movie_id ist ein Fremdschlüssel der Relation «movies». Mit ihm kann man dem Zitat einen Film zuweisen.

n:m-Beziehung

Für die Schauspieler haben wir eine eigene Relation. Diese beinhaltet einen Primärschlüssel, den Namen und das Geschlecht des Schauspielers.

id name sex
91 Michael Keaton m
213 Emma Stone w
1034 Rachel McAdams w
Tabelle der Relation «actors»
Schlüssel (keys)
id ist der Primärschlüssel der Tabelle «actors»

In jedem Film spielen mehrere Schauspieler mit, aber jeder Schauspieler kann auch in mehreren Filmen mitspielen.

n:m-Beziehung

Umsetzung
m:n-Beziehungen können in den meisten relationalen Datenbanken nicht direkt umgesetzt werden. Zur Realisierung wird eine zusätzliche Tabelle erstellt, welche die Primärschlüssel beider Tabellen als Fremdschlüssel enthält. Die m:n-Beziehung wird also aufgelöst, und man erhält eine weitere Datenbanktabelle, die zwei 1:n-Beziehungen realisiert. Oft werden für die Bezeichnung der zusätzlichen Tabelle die Bezeichnungen der zwei daran beteiligten Tabellen aneinandergehängt. Wenn nötig können zusätzliche Informationen zur Verknüpfung mit weiteren Attributen gespeichert werden.

movie_id actor_id as_character
4 91 Walter 'Robby' Robinson
4 1034 Sacha Pfeiffer
3 91 Riggan
3 213 Sam
Verknüpfungstabelle «movies2actors»
Schlüssel (keys)
movie_id ist der Fremdschlüssel der Tabelle «movies»
actor_id ist der Fremdschlüssel der Tabelle «actors»
movie_id und actor_id ist ein zusammengesetzter Primärschlüssel. Somit braucht die Tabelle «movies2actors» nicht eine weitere Spalte «id». Dies hat aber zur Folge, dass jeder Schauspieler pro Film nur 1x mitspielen kann.
Attribute
as_character – Jede Zuordnung eines Schauspielers zu einem Film merkt sich hier welche Rolle der Schauspieler in diesem Film gespielt hat.

Beantworte die folgenden Fragen an Hand der im Beispiel verwendeten Tabellen:

  1. In welchen Filmen hat Michael Keaton mitgespielt?
  2. Findest du ein Zitat aus dem Film mit der höchsten Bewertung (ranking so tief wie möglich)?
  3. Welche Schauspieler haben im Film «Spotlight» mitgespielt?
  4. Wie müsste die Tabelle «movie2actors» angepasst werden damit ein Schauspieler im selben Film mehrere Rollen übernehmen kann?
  1. Aus der Tabelle «actors» findet man die id von Michael Keaton, nämlich 91. Danach sucht man in der Verknüpfungstabelle «movies2actors» nach Einträgen mit einer actor_id mit diesem Wert. Man findet zwei Datensätze und merkt sich die beiden Werte für movie_id. Damit können nun in der Tabelle «movies» in der Spalte id die beiden Filme gefunden werden: «Spotlight» und «Birdman»
  2. Man sortiert die Tabelle «ratings» nach rank und sucht den tiefsten Wert. Die dazugehörende movie_id kann verwendet werden um in der Tabelle «quotes» nach dem entsprechenden Film zu suchen: Wir finden zwei Zitate: «Little: My name is Chiron, people call me little.» und «Black: It is what it is.» (Wir mussten dazu die Tabelle «movies» gar nicht verwenden, da der Film durch den Fremdschlüssel movie_id gegeben ist.)
  3. «Spotlight» hat die id 4. Damit finden wir in der Tabelle «movies2actors» zwei Rollen, eine mit actor_id 91 und eine mit actor_id 1034. Dies führt uns über die Tabelle «actors» zu Michael Keaton und Rachel McAdams.
  4. Übernähme ein Schauspieler mehrere Rollen im selben Film, so wären die Werte für actor_id und movie_id nicht mehr eindeutig. Die beiden Fremdschlüssel könnten also nicht mehr als Primärschlüssel eingesetzt werden. Man müsste für den Primärschlüssel eine Spalte id einführen und dort eine eindeutige Nummer setzen die jeweils automatisch erhöht wird.
id movie_id actor_id as_character
1 4 91 Walter 'Robby' Robinson
2 4 1034 Sacha Pfeiffer
3 3 91 Riggan
4 3 213 Sam
5 3 213 Julie
verbesserte Verknüpfungstabelle «movies2actors»

Relationale Datenbanken
Frank Murmann via Wikimedia Commons (CC0)
https://commons.wikimedia.org/wiki/File:Begriffe_relationaler_Datenbanken.svg
1.5.2018