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.
Die Relation beschreibt durch Attribute und Tupel eine Tabelle mit Spaltennamen und zeilenweisen Einträgen.
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 |
id
ist ein sogenannter Primärschlüssel (primary key). Jeder Film erhält hier eine eindeutige Zahl.title
– Jeder Datensatz speichert hier den Titel des Filmes (Text)year
– Jeder Datensatz speichert hier das Erscheinungsjahr des Filmes (Zahl)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».
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:
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».
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 |
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»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.
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. |
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.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 |
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.
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 |
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.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:
ranking
so tief wie möglich)?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»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.)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.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 |