Eines der weitest 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.

Relationale Datenbanken
Relationale Datenbanken

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

Beispiel

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

Beispiel

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

Beispiel

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.

Beispiel

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

Beispiel

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.

Aufgabe

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?
anzeigen verstecken

Lösung

  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»

# Entity-Relationship-Model

Das Entity-Relationship-Modell, kurz ER-Modell oder ERM (deutsch Gegenstands-Beziehungs-Modell) dient dazu, im Rahmen der Datenmodellierung einen Ausschnitt der realen Welt zu beschreiben. Das ER-Modell besteht aus einer Grafik (siehe unten) und einer Beschreibung der darin verwendeten Elemente, wobei Dateninhalte (d.h. die Bedeutung bzw. Semantik der Daten) und Datenstrukturen dargestellt werden.

Der Einsatz von ER-Modellen ist der De-facto-Standard für die Datenmodellierung, auch wenn es unterschiedliche grafische Darstellungsformen gibt. Das ER-Modell wurde 1976 von Peter Chen in seiner «The Entity-Relationship Model» vorgestellt. Aus diesem Grund werden wir uns auch vor allem mit der sogenannten Chen-Notation befassen.

# ER-Diagramme in Chen-Notation

Die Chen-Notation besteht aus den unten abgebildeten drei Elementen (Knoten), die durch Linien (Kanten) miteinander verbunden werden. Sie bilden einen Graphen.

# Entität

Die Entität (entity) stellt ein individuell identifizierbares Objekt der Wirklichkeit dar. (Zum Beispiel der Film «moonlight» oder die Schauspielerin «Rachel McAdams»)

Entität, dargestellt durch ein Rechteck
Entität, dargestellt durch ein Rechteck

# Attribute

Eine Entität kann mehrere Attribute haben. Unterattribute sind auch zugelassen (z.B. könnte das Attribut «Name» in die Unterattribute «Vorname» und «Nachname» aufgeteilt werden). Die Entität «actor» hat die Attribute «name» und «sex» («id» ist ein Schlüssel und kein eigentliches Attribut weil der Wert nichts mit dem realen Objekt zu tun hat und nur für die Datenbank verwendet wird.)

Attribut, dargestellt durch ein Oval
Attribut, dargestellt durch ein Oval

# Beziehung

Eine Beziehung (relationship) verbindet zwei Entitäten. Optional kann der Grad der Beziehung (die Kardinalität) bei den Verbindungslinien notiert werden. So werden die Verknüpfungen der Entität «movies» mit den Entitäten «ratings», «quotes» und «actors» jeweils durch eine Beziehung dargestellt.

Beziehung, dargestellt durch ein Diamant
Beziehung, dargestellt durch ein Diamant

Beispiel

Die Beziehung zwischen den Entitäten «Sortiment» und «Lagerbestand» wird durch die Beziehung «ist vorhanden» ausgedrückt. Man könnte sagen «ein Artikel des Sortimentes ist im Lager vorhanden». Die Kardinalität wird durch die beiden Einsen links und rechts von der Beziehung ausgedrückt. Bei komplexen Strukturen (mehr Entitäten und mehrere Beziehungen) werden oft die Attribute und ev. auch die Kardinalitäten ausgeblendet.
Das komplette ER-Diagramm des vorherigen Beispiels

Aufgabe

Ein Pizza-Restaurant beauftragt Sie eine Datenbank zu entwerfen:

Jede Pizza hat einen Namen, einen Preis, verschiedene Zutaten und genau einen Pizzaiolo welcher für diese Pizza zuständig ist. Zutaten haben einen Namen und sind entweder vegetarisch oder nicht. Die Pizzeria beschäftigt mehrere Pizzaioli, welche für eine oder mehrere Pizzen zuständig sind. Die Pizzaioli haben einen Namen und ein Alter.

  1. Bestimmen und markieren Sie zuerst im Text die Entitäten, Attribute und Relationen
  2. Planen Sie dann die DB indem sie ein ER-Diagramm zeichnen
  3. Setzen Sie das ER-Diagramm um, indem sie in Excel die entsprechenden Tabellen erstellen
  4. Markieren Sie Primärschlüssel durch Unterstreichen, Fremdschlüssel durch gepunktetes Unterstreichen
  5. Füllen Sie einige Fantasie-Daten in die Tabellen ein
anzeigen verstecken

Lösung

Aus dem Text erhält man Entitäten (fett), Attribute (markiert) und Relationen (kursiv):

Jede Pizza hat einen Namen, einen Preis, verschiedene Zutaten und genau ein Pizzaiolo welcher für diese Pizza zuständig ist. Zutaten haben einen Namen und sind entweder vegetarisch oder nicht. Die Pizzeria beschäftigt mehrere Pizzaioli, welche für eine oder mehrere Pizzen zuständig sind. Die Pizzaioli haben einen Namen und ein Alter.

Dies ergibt das folgende ER-Diagramm:

ER-Diagramm

Daraus lassen sich die folgenden Tabellen ableiten:

id name preis pizzaiolo_id
1 Margarita 15 2
2 Prosciutto e Funghi 17 2
3 Hawaii 18 1
Relation «Pizza» inklusive Verknüpfung «verantwortlich» durch Fremdschlüssel `pizzaiolo_id`
id name vegetarisch
1 Tomaten ja
2 Pilze ja
3 Schinken nein
4 Ananas ja
Tabelle der Relation «Zutat»
id name alter
1 Mario 34
2 Luigi 31
Tabelle der Relation «Pizzaiolo»
pizza_id zutat_id
1 1
2 1
2 2
2 3
3 1
3 3
3 4
Verknüpfung «besteht aus» durch Fremdschlüssel der beiden beteiligten Tabellen

Relationale Datenbanken
Frank Murmann via Wikimedia Commons (CC0)
https://commons.wikimedia.org/wiki/File:Begriffe_relationaler_Datenbanken.svg
1.5.2018
Letzte Änderung: 10.3.2020, 10:53:45