{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"# Relationaler Entwurf: Aufgaben (Lösungen)\n",
"\n",
"In diesem Tutorium beschäftigen wir uns damit, wie wir die in den vorherigen Wochen entwickelten (E)ER-Diagramme in Tabellen in schriftlicher Form überführen, ehe wir diese dann in der Folgewoche dann in einem tatsächlichen Datenbanksystem erstellen und mit Daten befüllen.\n",
"\n",
"Hinweis: Aufgaben, die durch einen Asterisk (*) markiert sind, sind Bonusaufgaben. Diese Aufgaben können im Tutorium behandelt werden, dies ist jedoch von den Übungsleitern nicht geplant."
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"## Aufgabe 1\n",
"\n",
"Wandeln Sie die folgenden ER-Diagramme in Relationen um."
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### Aufgabe 1.1"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"```{admonition} Musterlösung\n",
":class: dropdown, hint\n",
"#### Musterlösung\n",
"\n",
"+ Buch(ISBN, Datum, Alter)\n",
"+ hat(ISBN → Buch, ID → Autor)\n",
"+ Autor(ID, E-Mail, Name)\n",
"```\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### Aufgabe 1.2"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"```{admonition} Musterlösung\n",
":class: dropdown, hint\n",
"#### Musterlösung\n",
"\n",
"+ Professor(pID, Name, E-Mail)\n",
"+ hält(pID → Professor, mID → Modul, Raum)\n",
"+ verantworlich(mID → Modul, pID → Professor)\n",
"+ Modul(mID, Name)\n",
"\n",
"\n",
"#### Alternativ\n",
"\n",
"+ Professor(pID, Name, E-Mail)\n",
"+ hält(pID → Professor, mID → Modul, Raum)\n",
"+ Modul(mID, Name, verantworlich_pID → Professor)\n",
"\n",
"##### Hinweis\n",
"\n",
"* An der Stelle nicht über Kapazität diskutieren\n",
"```\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### Aufgabe 1.3"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"```{admonition} Musterlösung\n",
":class: dropdown, hint\n",
"#### Musterlösung\n",
"\n",
"+ Film(fID, Name, Jahr)\n",
"+ hat(vorgänger_fID → Film, nachfolger_fID → Film)\n",
"```\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### Aufgabe 1.4"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"```{admonition} Musterlösung\n",
":class: dropdown, hint\n",
"#### Musterlösung\n",
"\n",
"+ Firma(fID, Adresse, Telefon)\n",
"+ Hut(hID, Stil)\n",
"+ Material(mID, Farbe)\n",
"+ produziert(fID → Firma, hID → Hut, mID → Material)\n",
"```\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### Aufgabe 1.5"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"```{admonition} Musterlösung\n",
":class: dropdown, hint\n",
"#### Musterlösung\n",
"\n",
"+ A(KA)\n",
"+ B(KB1, KB2)\n",
"+ C(KC)\n",
"+ S(KS, KA → A, KB1 → B, KB2 → B)\n",
"+ R3(KA → A, KB1 → B, KB2 → B, KS → S, KC → C)\n",
"```\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"## Aufgabe 2: Generalisierung/Spezialisierung"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### Aufgabe 2.1\n",
"\n",
"Wandeln Sie folgende Generalisierung/Spezialisierung in Relationen um, jeweils im ER-, OO- und Nullwertstil und vergleichen Sie die Ergebnisse.\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"```{admonition} Musterlösung\n",
":class: dropdown, hint\n",
"#### Musterlösung\n",
"\n",
"##### ER-Stil\n",
"\n",
"+ Raum(Gebäude, Nummer, Kapazität)\n",
"+ Seminar(Gebäude → Raum, Nummer → Raum, Beamer, HDMI Anschlüsse)\n",
"+ Vorlesung(Gebäude → Raum, Nummer → Raum, Tafel, Beamer, E-Tafel)\n",
"+ Lernraum(Gebäude → Raum, Nummer → Raum, Whiteboard)\n",
"\n",
"\n",
"##### OO-Stil\n",
"\n",
"+ Raum(Gebäude, Nummer, Kapazität)\n",
"+ RaumSeminar(Gebäude, Nummer, Kapazität, Beamer, HDMI Anschlüsse)\n",
"+ RaumVorlesung(Gebäude, Nummer, Kapazität, Tafel, Beamer, E-Tafel)\n",
"+ RaumLernraum(Gebäude, Nummer, Kapazität, Whiteboard)\n",
"+ RaumSeminarVorlesung(Gebäude, Nummer, Kapazität, Beamer_S, HDMI Anschlüsse, Tafel, Beamer_V, E-Tafel)\n",
"+ RaumSeminarLernraum(Gebäude, Nummer, Kapazität, Beamer, HDMI Anschlüsse, Whiteboard)\n",
"+ RaumVorlesungLernraum(Gebäude, Nummer, Kapazität, Tafel, Beamer, E-Tafel, Whiteboard)\n",
"+ RaumSeminarVorlesungLernraum(Gebäude, Nummer, Kapazität, Beamer_S, HDMI Anschlüsse, Tafel, Beamer_V, E-Tafel, Whiteboard)\n",
"\n",
"**Hinweis**: Die Schlüssel der neu entstandenen Relationen teilen sich den Namespace nicht. Das heißt, dass z.B. Gebäude E-N, Raum 719 potenziell in Raum und RaumSeminar auftauchen kann, ohne dass eine Integritätsbedingung verletzt wird! \n",
"\n",
"##### NULL-Stil\n",
"\n",
"+ Raum(Gebäude, Nummer, Kapazität, is_Seminar, is_Vorlesung, is_Lernraum, Beamer_S, HDMI Anschlüsse, Tafel, Beamer_V, E-Tafel, Whiteboard)\n",
"```\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### Aufgabe 2.2\n",
"\n",
"Nun wird die Generalisierung / Spezialisierung um einen Entitytypen samt Relationshiptypen erweitert. Erweitere zuerst deine Lösung und erstelle dann ein ER-Diagramm (**nicht** EER) aus deinen Relationen.\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"```{admonition} Musterlösung\n",
":class: dropdown, hint\n",
"#### Musterlösung\n",
"\n",
"#### Relationen für ER-Stil/Null-Stil\n",
"\n",
"+ Veranstaltung(ID, Name)\n",
"+ findet_statt(ID → Veranstaltung, Gebäude → Raum, Nummer → Raum)\n",
"\n",
"#### ER-Stil Diagramm\n",
"\n",
"\n",
"\n",
"#### OO-Stil Relationen + Diagramm\n",
"\n",
"+ Veranstaltung(ID, Name)\n",
"+ findet_statt1(ID → Veranstaltung, Gebäude → Raum, Nummer → Raum)\n",
"+ findet_statt2(ID → Veranstaltung, Gebäude → RaumSeminar, Nummer → RaumSeminar)\n",
"+ findet_statt3(ID → Veranstaltung, Gebäude → RaumVorlesung, Nummer → RaumVorlesung)\n",
"+ findet_statt4(ID → Veranstaltung, Gebäude → RaumLernraum, Nummer → RaumLernraum)\n",
"+ findet_statt5(ID → Veranstaltung, Gebäude → RaumSeminarVorlesung, Nummer → RaumSeminarVorlesung)\n",
"+ findet_statt6(ID → Veranstaltung, Gebäude → RaumSeminarLernraum, Nummer → RaumSeminarLernraum)\n",
"+ findet_statt7(ID → Veranstaltung, Gebäude → RaumVorlesungLernraum, Nummer → RaumVorlesungLernraum)\n",
"+ findet_statt8(ID → Veranstaltung, Gebäude → RaumSeminarVorlesungLernraum, Nummer → RaumSeminarVorlesungLernraum)\n",
"\n",
"**Hinweis**: Die Schlüssel der neu entstandenen Relationen teilen sich den Namespace nicht. Das heißt, dass z.B. Gebäude E-N, Raum 719 potenziell in Raum und RaumSeminar auftauchen kann, ohne dass eine Integritätsbedingung verletzt wird! \n",
"\n",
"\n",
"\n",
"#### Null-Stil Diagramm\n",
"\n",
"\n",
"```\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### Aufgabe 2.3\n",
"\n",
"Welche Relationen werden im OO-Stil benötigt wenn die Bedingungen der Generalisierung/Spezialisierung verändert werden ((p,d), (t,o), (t,d))?\n",
"\n",
"| Relation | (p,o) | (p,d) | (t,o) | (t,d)\n",
"| ------------------------------|-------|-------|-------|-------\n",
"| Raum | | | |\n",
"| | | | |\n",
"| RaumSeminar | | | |\n",
"| RaumVorlesung | | | |\n",
"| RaumLernraum | | | |\n",
"| | | | |\n",
"| RaumSeminarVorlesung | | | |\n",
"| RaumVorlesungLernraum | | | |\n",
"| RaumSeminarLernraum | | | |\n",
"| | | | |\n",
"| RaumSeminarVorlesungLernraum | | | |"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"```{admonition} Musterlösung\n",
":class: dropdown, hint\n",
"#### Musterlösung\n",
"\n",
"| Relation | (p,o) | (p,d) | (t,o) | (t,d)\n",
"| ------------------------------|-------|-------|-------|-------\n",
"| Raum | x | x | |\n",
"| | | | |\n",
"| RaumSeminar | x | x | x | x\n",
"| RaumVorlesung | x | x | x | x\n",
"| RaumLernraum | x | x | x | x\n",
"| | | | |\n",
"| RaumSeminarVorlesung | x | | x |\n",
"| RaumVorlesungLernraum | x | | x |\n",
"| RaumSeminarLernraum | x | | x |\n",
"| | | | |\n",
"| RaumSeminarVorlesungLernraum | x | | x |\n",
"\n",
"```\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### Aufgabe 3: Kapazitätserhaltung"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### Aufgabe 3.1\n",
"\n",
"Gegeben seien zwei Relationen\n",
"- Person1(Name, Geburtstag, E-Mail)\n",
"- Person2(Name, Geburtstag, E-Mail)\n",
"\n",
" Welche Relation hat eine höhere Kapazität und wieso?"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"```{admonition} Musterlösung\n",
":class: dropdown, hint\n",
"#### Musterlösung\n",
"\n",
"3.1. Person2 weil mehr Name/Geburtstag Kombinationen möglich.\n",
"```\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### Aufgabe 3.2\n",
"\n",
"Gegeben ist ein ER-Modell und eine Umwandlung. Ist die gegebene Umwandlung des ER-Modells zu Relationen kapazitätserhaltend? Begründe.\n",
"\n",
"\n",
"\n",
"- Auto(Kennzeichen, Modell)\n",
"- gehört(Kennzeichen->Auto, ID->Person)\n",
"- Person(ID, E-Mail,Name)"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"```{admonition} Musterlösung\n",
":class: dropdown, hint\n",
"#### Musterlösung\n",
"\n",
"3.2. Nein, die Umwandlung erhöht die Kapazität(n zu m) und Totalität wird nicht beachtet.\n",
"```\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### Aufgabe 3.3\n",
"\n",
"Gib eine kapazitätserhaltende Umwandlung zum folgenden Modell samt Relationen an. Begründe deine Lösung."
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"```{admonition} Musterlösung\n",
":class: dropdown, hint\n",
"#### Musterlösung\n",
"\n",
"3.3. \n",
" - Auto(Kennzeichen, ID->Person\\*, Modell) \n",
" - Person(ID, E-Mail, Name)\n",
" + \\* Das Attribut darf nicht Null sein\n",
"```\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"### Aufgabe 4: Kinogruppe - Relationales Modell\n",
"\n",
"Überführen Sie das folgende (E)E/R-Modell von letzter Woche in ein relationales Modell."
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"```{admonition} Musterlösung\n",
":class: dropdown, hint\n",
"### Musterlösung\n",
"\n",
"* Schauspieler(SId, Name)\n",
"* Film(FId, Name, Genre, Altersfreigabe)\n",
"* spielt_in(SId → Schauspieler, FId → Film)\n",
"* setzt_fort(Vorgänger → Film, Nachfolger → Film)\n",
"* läuft(FId → Film, KinoId → Kino, Saalnummer → Saal, Preis, Datum, Uhrzeit)\n",
"* Kino(KinoId, Name)\n",
"* Kasse(Kassennummer, KinoId → Kino, Pid → Kassierer)\n",
"* Saal(Saalnummer, Kapazität, KinoId → Kino)\n",
"* Mitarbeiter(PId, Gehalt, Zuständigkeit, KinoId → Kino, PId → Manager)\n",
"* Manager(PId → Mitarbeiter, Büro, KinoId → Kino)\n",
"* Kassierer(PId → Mitarbeiter , Arbeitsvertrag)\n",
"```\n"
]
}
],
"metadata": {},
"nbformat": 4,
"nbformat_minor": 4
}