Modellierung von Datenbanken

Image by Mohamed Hassan from Pixabay

Von der Wirklichkeit zur Datenbank

Eine anspruchsvolle Aufgabe ist es, aus einer konkreten Problemstellung eine Datenbank zu entwickeln.

Dabei kann man in einzelen Schritten vorgehen:

  1. Wichtige Familien von Dingen, Gegenständen, usw., die für den Sachzusammenhang notwendig sind, werden identifiziert.
  2. Die erkannten Familien werden als Klasse mit Attributen als Klassenkarte dargestellt.
  3. Beziehungen zwischen den Klasen werden definiert und mit die zugehörigen Kardinalitäten benannt.
  4. Die Klassen werden in ein erstes Tabellenschema umgesetzt. Der Name der Tabelle ergibt sich aus dem Namen der Klasse. Attribute der Klasse entsprechen einer Tabellenspalte. Gleichzeitig werden geeignete Datentypen (Zahl, Text, Wahrheitswert) festgelegt. Für jede Tabelle wird ein geeigneter Primärschlüssel gewählt oder ein neuer künstlicher Schlüssel als weitere Spalte hinzugefügt.
  5. Die Beziehungen des Klassendiagramms werden umgesetzt:
    • 1:1-Beziehung:
    • Eine der beiden Tabellen, erhält eine weitere Spalte (Fremdschlüsselspalte). Diese enthält den Schlüssel der in Beziehung stehenden Tabelle.
    • 1:n-Beziehung:
    • Die Tabelle, zu deren Datensätze genau ein zugehöriger Datensatz der in Beziehung stehenden Tabelle gehört, erhält eine weitere Spalte (Fremdschlüsselspalte). Diese enthält den Schlüssel der in Beziehung stehenden Tabelle.
    • m:n-Beziehung:
    • Für diese Beziehung wird eine neue Tabelle mit geeignetem Namen mit zwei Spalten angelegt. Die beiden Spalten sind Fremdschlüsselspalten, die auf die jeweiligen Primärschlüssel der in Beziehung stehenden Tabellen verweisen. In den meisten Fällen bilden die beiden Spalten auch gleichzeitig den Primärschlüssel der Beziehungstabelle.
Bei der Modellierung gibt es zu einer Problemstellung nicht die einzig richtige Lösung. Stattdessen können verschiedene Tabellenentwürfe der Aufgabe genügen. Insbesondere die Bezeichnungen von Tabellen und Spalten ist häufig nicht festgelegt. Sie sollten aber sinnvoll und aussagekräftig sein.

Beispiel:

Aufgaben

Erstelle bei den folgenden Problemstellungen ein geeignetes Klassendiagramm mit den zugehörigen Beziehungen und Kardinalitäten. Überlege dir dazu sinnvolle Attribute.
Setze das Klassendiagramm in ein Tabellenschema um und markiere Primär- und Fremdschlüssel.
Erstelle eine SQL-Abfrage zu den angegebenen Fragestellungen.
SMV

Bild von StockSnap auf Pixabay

Die SMV eines Gymnasiums bildet zu verschiedenen Themen Arbeitskreise an. Ein Arbeitskreis, an dem alle Schülerinnen und Schüler mitarbeiten können, wird von einer Person geleitet.
Wer leitet den AK Unterstufenparty? Welche Schülerinnen und Schüler gehören ihm an?

Klassendiagramm:

Tabellenschema
Sinnvoll ist die Einführung von künstlichen Schlüsseln für die Klasse Schüler.
Als Schlüssel für die Klasse Arbeitskreis eignet sich die Bezeichnung, da es nicht mehrere Arbeitskreise gibt, die darin übereinstimmen. Möglich ist aber auch die Einführung eines künstlichen Schlüssels, um einen längeren Text als Primäschlüssel zu vermeiden.
Zur Umsetzung der Beziehung "leitet >" muss man der Tabelle Schüler eine Fremdschlüsselspalte hinzufügen, die auf die Bezeichnung des geleiteten Arbeitskreises (Primärschlüssel) verweist. Zur Umsetzung der m-n-Beziehung "nimmt_teil >" benötigt man eine zusätzliche Beziehungstabelle.
Schüler(SID: ZAHL, nachname: TEXT, vorname: TEXT, klasse: TEXT)
Arbeitskreis(bezeichnung: TEXT, kurzbeschreibung: TEXT, raum: TEXT, leiter_SID: ZAHL)
nimmt_teil(bezeichnung: TEXT, SID: ZAHL)

Abfragen
SELECT name, vorname
FROM Schüler, nimmt_teil, Arbeitskreis
WHERE Schüler.leiter_AK_bezeichnung=Arbeitskreis.bezeichnung AND Arbeitskreis.bezeichnung="AK Unterstufenparty";

Bemerkung: Auf die Tabelle Arbeitskreis kann auch verzeichtet werden, da der Fremdschlüssel in der Tabelle Schüler die Bezeichnung des Arbeitskreises ist.

SELECT name, vorname, klasse
FROM Schüler, Arbeitskreis
WHERE Schüler.SID=nimmt_teil.SID AND nimmt_teil.bezeichnung=Arbeitskreis.bezeichnung AND Arbeitskreis.bezeichnung="AK Unterstufenparty";

Bemerkung: Auf die Tabelle Arbeitskreis kann auch hier verzeichtet werden, da der Fremdschlüssel bezeichnung in der Beziehungstabelle "nimmt_teil" die Bezeichnung des Arbeitskreises enthält.

Wunschzettel

Image by Gerhard from Pixabay

Der Weihnachtsmann digitalisiert seine weihnachtliche Arbeit und speichert die Wünsche der Kinder in einer Datenbank.
Was wünscht sich Isidor. Welche Kinder wünschen sich das Buch 'Parry Hotter'?

Klassendiagramm:

Tabellenschema
Sinnvoll ist die Einführung von künstlichen Schlüsseln für beide Klassen.
Kind(KID: ZAHL, vorname: TEXT, nachname: TEXT, straße: TEXT, ort: TEXT)
Geschenk(GID: ZAHL, bezeichnung: TEXT, hersteller: TEXT, preis: ZAHL)
wünscht_sich(KID: ZAHL, GID: ZAHL)

Abfragen
SELECT bezeichnung
FROM Kind, wünscht_sich, Geschenk
WHERE Kind.KID=wünscht_sich.KID AND wünscht_sich.GID=Geschenk.GID AND Kind.vorname="Isidor";

SELECT vorname, nachname
FROM Kind, wünscht_sich, Geschenk
WHERE Kind.KID=wünscht_sich.KID AND wünscht_sich.GID=Geschenk.GID AND Geschenk.bezeichnung="Parry Hotter";

Secondhand

Image by Lenka Bartušková from Pixabay

Bei einem Online-Secondhandhandel können sich Personen mit einem frei gewählten Benutzernamen registrieren und gebrauchte Kleidungsstücke kaufen bzw. verkaufen. Benutzer können sich zudem auf einer Wunschliste Artikel merken.
Welche Artikel verkauft vickychic? Wie viele Artikel hat teddycool auf seiner Merkliste?

Klassendiagramm:

Tabellenschema
Person(benutzername: TEXT, nachname: TEXT, vorname: TEXT, ...)
Wunschliste(WID: ZAHL, bezeichnung: TEXT, benutzername: TEXT)
Kleidungsstück(KID: ZAHL, bezeichnung: TEXT, farbe: TEXT, hersteller: TEXT, größe: ZAHL, preis: ZAHL, benutzername: TEXT)
gehört_zu(WID: ZAHL, KID: ZAHL)

Abfragen
SELECT bezeichnung, größe, farbe, hersteller
FROM Kleidungsstück
WHERE Kleidungsstück.benutzername="vickychic";

SELECT COUNT(*)
FROM Wunschliste, gehört_zu, Kleidungsstück
WHERE Wunschliste.WID=gehört_zu.WID
AND gehört_zu.KID=Kleidungsstück.KID
AND gehört_zu.benutzername="teddycool";

Bemerkung:
Auf die Klasse Wunschliste kann auch verzichtet werden, wenn eine Person nur eine einzige Wunschliste besitzen kann. Dann würde einfach eine m:n-Beziehung wünscht_sich zwischen der Tabelle Person und der Tabelle Kleidungsstück bestehen.

Streamingdienst

Photo by Héctor Achautla on Unsplash

Bei einem Musik-Streaming-Anbieter können Bemutzer Playlisten erstellen, die aus einer ungeordnete Menge von Liedern bestehen.
Personen können Playlisten anderer Benutzer 'liken'.
Welche Lieder hat Holger in seiner Playlist „Chilling after school“? Wie alt ist die jüngste Person, der die Playlist „Sing and win“ gefällt?

Klassendiagramm:
bereits mit Attributen für künstliche Schlüssel

Tabellenschema
Person(PID: ZAHL, nachname: TEXT, vorname: TEXT, email: TEXT)
Playlist(PLID: ZAHL, bezeichnung: TEXT, PID: ZAHL)
Lied(LID: ZAHL, titel: TEXT, interpret: TEXT, dauer: ZAHL)
liked(PID: ZAHL, PLID: ZAHL) enthält(PLID: ZAHL, LID: ZAHL)

Abfragen
SELECT bezeichnung, größe, farbe, hersteller
FROM Person, Playlist, enthält, Lied
WHERE Person.PID=Playlist.PID
AND Playlist.PLID=enthält.PLID
AND enthält.LID=Lied.LID AND Person.vorname="holger" AND Playlist.bezeichnung="Chilling after school";
Bemerkung: Playlisten verschiedener Personen können auch die gleiche Bezeichnung haben.

SELECT nachname, vorname, alter , größe, farbe, hersteller
FROM Person, Playlist
WHERE Person.PID=Playlist.PID
AND Playlist.bezeichnung="Sing and win"
ORDER BY alter
LIMIT 1;
Bemerkung: LIMIT 1 bewirkt, dass nur ein Datensatz der Ergebnistabelle angezeigt wird.

Lernmittelfreie Bücherei

Bild von PayPal.me/FelixMittermeier auf Pixabay

Schülerinnen und Schüler leihen in der lernmittelfreien Bücherei Schulbücher aus. Von jeder Ausgabe eines Lehrbuchs gibt es mehrere Exemplare, die jeweils mit einem Strichcode versehen sind.
Welche Schülerinnen und Schüler haben das Englischbuch Pinkline 3 ausgeliehen. Von welchen Büchern wurden wie viele Exemplare ausgeliehen?

Klassendiagramm:
bereits mit Attributen für künstliche Schlüssel

Tabellenschema
Schüler(SID: ZAHL, nachname: TEXT, vorname: TEXT, klasse: TEXT)
Exemplar(EID: ZAHL, strichcode: ZAHL, SID: ZAHL)
Buch(BID: ZAHL, titel: TEXT, fach: TEXT, verlag: TEXT, jgst: ZAHL, verlag: TEXT, EID: ZAHL )

Abfragen
SELECT name, vorname, klasse
FROM Schüler, Exemplar, Buch
WHERE Schüler.SID=Exemplar.SID
AND Exemplar.BID=Buch.BID
AND Buch.titel="Pinkline 3"

SELECT titel, count(*)
FROM Exemplar, Buch
WHERE Exemplar.BID=Buch.BID
AND Exemplar.SID<>null
GROUP BY titel;
Bemerkung: Exemplar.SID<>null sorgt dafür, dass nur ausgeliehene Bücher gezählt werden.

Kino

Bild von annca auf Pixabay

Personen können über ein Onlineportal Kinokarten für die Vorstellungen von Filmen buchen.
In dem kleinen Kino, dass nur einen Saal besitzt, gilt dabei freie Platzwahl.
Liste alle Vorstellungen des beliebten Jugendfilms „Morgenstund‘ hat Gold im Mund“ auf. Welche Personen haben den Film „Learning by doing“ gesehen. Wie viele Karten wurden für die Nachmittagsvorstellung am 12.08.2022 für den Film „Cheer up!“ gebucht?

Klassendiagramm:
bereits mit Attributen für künstliche Schlüssel

Tabellenschema
Person(PID: ZAHL, nachname: TEXT, vorname: TEXT, email: TEXT)
Vorstellung(VID: ZAHL, datum: TEXT, uhrzeit: TEXT)
Film(FID: ZAHL, titel: TEXT, interpret: TEXT, dauer: ZAHL,VID: ZAHL)
bucht(PID: ZAHL, VID: ZAHL)

Abfragen
SELECT titel, datum, uhrzeit
FROM Vorstellung, Film
WHERE Vorstellung.FID=Film.FID
AND Film.titel="Morgenstund‘ hat Gold im Mund"

SELECT name, vorname
FROM Person, bucht, Vorstellung, Film
WHERE Person.PID=bucht.PID
AND bucht.VID=Vorstellung.VID
AND Vorstellung.FID=Film.FID
AND Film.titel="Learning by doing"

SELECT count(*)
FROM Person, bucht, Vorstellung, Film
WHERE Person.PID=bucht.PID
AND bucht.VID=Vorstellung.VID
AND Vorstellung.FID=Film.FID
AND datum="2022-08-12"
AND uhrzeit>"12:00"
AND Film.titel="Cheer up!"

Socialmedia

Bild von Erik Lucatero auf Pixabay

Beim sozialen Netzwerk Netfriends können sich Personen mit einem beliebigen Benutzernamen anmelden und eine gegenseitige Freundschaft mit anderen Teilnehmern eingehen. Außerdem können Fotos von Benutzern hochgeladen werden, bei denen andere Teilnehmer markiert werden können. Mitglieder können Fotos 'liken'.
Wer ist mit nobby0816 befreundet? Wie viele Bilder hat harry87 am 12.03.2022 hochgeladen? Wann wurde ein Bild aufgenommen, auf dem ms_poser abgebildet ist?

Klassendiagramm:
bereits mit Attributen für künstliche Schlüssel

Tabellenschema
Person(benutzername: TEXT, email: TEXT, passwort: TEXT)
Foto(FID: ZAHL, aufnahmedatum: TEXT, benutzername: TEXT)
befreundet_mit(benutzername_1: TEXT, benutzername_2: TEXT)
abgebildet_auf(benutzername_1: TEXT, FID: ZAHL)

Abfragen
SELECT p2.benutzername
FROM Person AS p1, befreundet_mit, Person AS p2
WHERE p1.benutzername=befreundet_mit.benutzername_1
AND p2.benutzername=befreundet_mit.benutzername_2
p1.benutzername="nobby0816";


oder kürzer mit nur einer Tabelle Person:
SELECT Person.benutzername
FROM Person, befreundet_mit
WHERE Person.benutzername=befreundet_mit.benutzername_2
AND benutzername_1="nobby0816";

Ergänzungsaufgabe:
Jeder Benutzer besitzt eine Pinnwand, deren Hintergrundfarbe er frei wählen kann und auf der Posts von beliebigen Personen veröffentlicht werden.
Liste die Inhalte aller Posts auf, die am 01.12.20022 auf der Seite von jenny321 veröffentlicht wurden

Klassendiagramm:
bereits mit Attributen für künstliche Schlüssel

Tabellenschema
Person(benutzername: TEXT, email: TEXT, passwort: TEXT)
Foto(FID: ZAHL, aufnahmedatum: TEXT, benutzername: TEXT)
befreundet_mit(benutzername_1: TEXT, benutzername_2: TEXT)
abgebildet_auf(benutzername_1: TEXT, FID: ZAHL)
Pinnwand(PWID: ZAHL, farbe: TEXT, benutzername: TEXT)
Post(PostID: ZAHL,datum: TEXT, inhalt: TEXT, PWID: ZAHL, benutzername: TEXT)

Abfragen
Beim obigem Tabellenschema ist die Tabelle Person nicht notwendig, da die Pinnwand als Fremdschlüssel den Benutzername des Inhabers der Pinnwand besitzt.
SELECT inhalt
FROM Post, Pinnwand
WHERE Post.PWID=Pinnwand.PWID
AND Post.benutzername="jenny321";


Rezeptdatenbank

Bild von Seksak Kerdkanno auf Pixabay

Das folgende Diagramm zeigt zwei Entwürfe (Klassendiagramme) für eine Rezeptdatenbank.

Aufgaben:


Beim ersten Diagramm ist eine 1:n-Beziehung sinnvoll. Der Nachteil ist jedoch eine redundante Speicherung von Informationen. So muss z. B. bei allen Rezepten die Mehl verwenden neben der Menge auch wiederholt der Name, der Brennwert usw. gespeichert werden.
Beim zweiten Diagramm sind zwei 1:n-Beziehungen empfehlenswert. Die Informationen über ein Nahrungsmittel werden so nur einmal abgespeichert. Ein Datensatz der Klasse Zutat vermerkt nur die Menge und das zugehörige Nahrungsmittel.
Bemerkung:
Eine m:n-Beziehung zwischen Rezept und Zutat wäre möglich, hätte aber den Nachteil, dass sich so nicht einfach die Menge einer Zutat bei einem bestimmten Rezept ändern ließe.

Tabellenschema
Rezept(rezeptNr: ZAHL, bezeichnung: TEXT, erstelldatum: TEXT, autor: TEXT)
Zutat(ZID: ZAHL, menge: ZAHL,rezeptNr: ZAHL,NID: ZAHL)
Nahrungsmittel(NID: ZAHL, name: TEXT, brennwertPro100g: ZAHL, glutenhaltig: BOOLEAN)

Abfragen
SELECT menge, name
FROM Rezept, Zutat, Nahrungsmittel
WHERE Rezept.rezeptNr=Zutat.rezeptNr
AND Zutat.NID=Nahrungsmittel.NID
AND Rezept.bzeichnung="Marmorkuchen";

SELECT bezeichnung
FROM Rezept, Zutat, Nahrungsmittel
WHERE Rezept.rezeptNr=Zutat.rezeptNr
AND Zutat.NID=Nahrungsmittel.NID
AND Nahrungmittel.name="Kakao";

SELECT bezeichnung
FROM Rezept, Zutat, Nahrungsmittel
WHERE Rezept.rezeptNr=Zutat.rezeptNr
AND Zutat.NID=Nahrungsmittel.NID
AND Nahrungmittel.name="Mehl"
AND menge<=150;

Paketlieferdienst

Bild von jhenning auf Pixabay

Ein Paketlieferdienst, der ausschließlich Pakete zwischen registrierten Kunden transportiert, verfügt über verschiedene Fahrzeuge, die von einem Zusteller gefahren werden. Pakete sind ausschließlich quaderförmig, haben einen bekannten Absender und Empfänger sowie ein Gewicht. Außerdem wird vermerkt, ob es sich um Gefahrgut handelt. Die Zustellfahrzeuge besitzen eine maximale Zuladung. Für die Verwaltung der Zustellung an einem Tag soll eine Datenbank verwendet werden, die unter anderem zu folgenden Fragen eine Antwort liefern soll:

Aufgaben

Pizzalieferdienst

Bild von Hans auf Pixabay

Der Inhaber eines Pizzalieferdienstes, verwaltet die Bestellungen digital mit Hilfe einer Tabellenkalkulation.

Aufgaben

In der Tabelle sind viele Informationen redundant gespeichert. Änderungen von einzelnen Informationen somit mehrmals vorgenommen werden, um die Daten stimmig (konsistent) zu halten. Die Datums- und Zeitangaben werden nicht einheitlich gespeichert, was eine spätere Suche oder Sortierung erschwert. Mehrere bestellte Speisen werden in einer Tabellenzelle vermerkt. Dabei werden Informationen redundant gespeichert. Außerdem sind Aggregatsfunktionen (z. B. Anzahl bestimmter Speisen) nicht möglich. Insgesamt folgt daraus, dass die Informationen dieser Tabelle in einzelne Tabellen aufgeteilt werden sollte.

Klassendiagramm

Das Klassendiagramm mit den Klassen Bestellung und Bestelldetails ist für den Datenbankneuling vielleicht nicht ganz naheliegend. Hier eine kurze Erklärung, warum sich diese Modellierung anbietet:
Beim Entwurf von Datenbanken sollten Redundanzen soweit wie möglich, eigentlich vollständig, vermieden werden. Würde man für die Bestellung nur eine einzelne Klasse wählen, müsste man die Zeit, die Anzahl der Speisen und die Frage, ob die Lieferung schon erfolgt, ein einer einzigen Tabelle speichern. Bei einer Bestellung, die mehrere Speisen umfasst, ergäben sich dann mehrere Datensätze, bei denen Information (Zeit, erledigt) redundant gespeichert würden. Bei einer nachträglichen Änderung der Lieferzeit müssten dann z. B. mehrere Datensätze verändert werden.

mögliche Fragestellungen:
Für den Pizzalieferdienst könnnen z. B. folgende Fragestellungen relevant sein:

  • Welche und wie viele Speisen/ Getränke gehören zu einer bestimmten Bestellung?
  • Wie oft hatte ein bestimmter Kunde etwas bestellt?
  • Welche und wie viele Pizzen sind heute bis 18.00 Uhr bereits bestellt?
  • Wie viele Pizzen einer bestimmten Sorte wurden im letzten Monat bestellt?
  • Welche Bestellungen stehen noch aus?