Image by Mohamed Hassan from Pixabay
Eine anspruchsvolle Aufgabe ist es, aus einer konkreten Problemstellung eine Datenbank zu entwickeln.
Dabei kann man in einzelen Schritten vorgehen:
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,
nimmt_teil(
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.
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(
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";
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:
TabellenschemaPerson(benutzername: TEXT, nachname: TEXT, vorname: TEXT, ...)
Wunschliste(WID: ZAHL, bezeichnung: TEXT,
Kleidungsstück(KID: ZAHL, bezeichnung: TEXT, farbe: TEXT, hersteller: TEXT, größe: ZAHL, preis: ZAHL,
gehört_zu(
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.
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,
Lied(LID: ZAHL, titel: TEXT, interpret: TEXT, dauer: ZAHL)
liked(
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.
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,
Buch(BID: ZAHL, titel: TEXT, fach: TEXT, verlag: TEXT, jgst: ZAHL, verlag: TEXT,
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.
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,
bucht(
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!"
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,
befreundet_mit(
abgebildet_auf(
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,
befreundet_mit(
abgebildet_auf(
Pinnwand(PWID: ZAHL, farbe: TEXT,
Post(PostID: ZAHL,datum: TEXT, inhalt: 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";
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,
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;
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
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
Rezept(rezeptNr: ZAHL, bezeichnung: TEXT, erstelldatum: TEXT, autor: TEXT)
Zutat(ZID: ZAHL, menge: ZAHL,
Nahrungsmittel(NID: ZAHL, name: TEXT, brennwertPro100g: ZAHL, glutenhaltig: BOOLEAN)
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: