\documentclass{bschlangaul-aufgabe} \bLadePakete{syntax,er,mathe,rmodell} \begin{document} \bAufgabenMetadaten{ Titel = {Flughafen ER-Modell und Relationenmodell}, Thematik = {Flughafen}, Referenz = DB.Datenbankentwurf.Entity-Relation-Modell.Flughafen, RelativerPfad = Module/10_DB/20_Datenbankentwurf/01_Entity-Relation-Modell/Aufgabe_Flughafen.tex, ZitatSchluessel = db:ab:klausurvorbereitung, ZitatBeschreibung = {Aufgabe 1: Wiederholung ER-Modell und Relationenmodell}, BearbeitungsStand = mit Lösung, Korrektheit = unbekannt, Ueberprueft = {unbekannt}, Stichwoerter = {Entity-Relation-Modell}, } Für einen Flughafen soll eine Datenbank für folgendes Szenario entwickelt werden: Von den \textbf{Fluggesellschaften} sollen \emph{Name} und \emph{Hauptsitz} abgespeichert werden. Der Gesellschaftsname ist dabei eindeutig. Die Gesellschaften sind Eigentümer von Flugzeugen. Wichtig ist, seit wann das Flugzeug für die Gesellschaft im Einsatz ist und wie viele Flugzeuge die Gesellschaft insgesamt besitzt.\index{Entity-Relation-Modell} \footcite[Aufgabe 1: Wiederholung ER-Modell und Relationenmodell]{db:ab:klausurvorbereitung} Die \textbf{Flugzeuge} tragen eine eindeutige \emph{FZ-Nr}. Weiterhin soll auch der \textbf{Typ} des Flugzeuges mit \emph{Sitzplatzanzahl} und \emph{Größe der Besatzung} abrufbar sein. Für einen \textbf{Flug} setzt eine Fluggesellschaft ein Flugzeug ein. Dabei muss dieses Flugzeug aber nicht Eigentum der Fluggesellschaft sein. Der Flug hat eine \emph{Flug-Nr}. Bezüglich eines Fluges sind \emph{Flug-Nr}, \emph{Abflugzeit} und \emph{Zielflughafen} abzuspeichern. Ein \textbf{Passagier} kann Flüge buchen. Von den Passagieren müssen \emph{Name} und \emph{Gebdat} bekannt sein. Dabei ist aber davon auszugehen, dass es Passagiere mit gleichem Namen und gleichem Gebdat geben kann. Bei der \textbf{Buchung} wird dem Passagier eine \emph{Sitzplatz-Nr} zugeteilt. Für jeden Flug muss die Anzahl der gebuchten Plätze feststellbar sein. \begin{enumerate} %% % (a) %% \item Erstellen Sie ein ER-Diagramm! Verarbeiten Sie dabei nur die unbedingt notwendigen Informationen. Geben Sie an, wie die nicht im ER-Modell „auftauchenden“ Informationen bestimmt werden können. \begin{bAntwort} \begin{center} \resizebox{0.7\textwidth}{!}{ \begin{tikzpicture}[er2,node distance=3.3cm] \node[entity] (Fluggesellschaft) {Fluggesellschaft}; \node[attribute, left of=Fluggesellschaft] {Name} edge (Fluggesellschaft); \node[attribute, above of=Fluggesellschaft] {Hauptsitz} edge (Fluggesellschaft); \node[relationship,right of=Fluggesellschaft] (besitzt) {besitzt} edge (Fluggesellschaft); \node[entity,right of=besitzt] (Flugzeug) {Flugzeug} edge (besitzt); \node[attribute, above left of=Flugzeug] {FZ-Nr} edge (Flugzeug); \node[attribute, above of=Flugzeug] {Typ} edge (Flugzeug); \node[attribute, above right of=Flugzeug] {Sitzplatzanzahl} edge (Flugzeug); \node[attribute, right of=Flugzeug] {Besatzung} edge (Flugzeug); \node[entity,below of=Flugzeug] (Flug) {Flug}; \node[relationship,below of=besitzt] (setztEin) {setztEin} edge (Flug) edge (Flugzeug) edge (Fluggesellschaft); \node[relationship,right of=Flug] (bucht) {bucht} edge (Flug); \node[entity,below of=Flug] (Passagier) {Passagier} edge (bucht); \node[attribute, left of=Passagier] {Name} edge (Passagier); \node[attribute, below left of=Passagier] {Gebdat} edge (Passagier); \node[attribute, below of=Passagier] {PasID} edge (Passagier); \end{tikzpicture} } \end{center} %\includegraphics[width=\linewidth]{Aufgabe-1_muster} Wie viele Flugzeuge eine Fluggesellschaft besitzt ergibt sich nicht direkt aus dem ER-Modell, sondern kann später durch eine einfache SQL-Abfrage ermittelt werden: \begin{minted}{sql} SELECT FluggesellschaftName, COUNT (*) AS Anzahl FROM Eigentuemer_von GROUP BY FluggesellschaftName; \end{minted} Auch die Anzahl der gebuchten Sitze pro Flug lässt sich durch eine SQL-Abfrage ermit- teln: \begin{minted}{sql} SELECT Flug-Nr, COUNT (*) AS Anzahl FROM bucht GROUP BY Flug-Nr; \end{minted} \end{bAntwort} %% % (b) %% \item Legen Sie die Primärschlüssel fest. Begründen Sie Ihre Entscheidung, falls Sie zusätzliche künstliche Schlüssel einfügen. \begin{bAntwort} Von einem Passagier werden nur Name und Gebdat gespeichert. Da diese beiden nicht eindeutig sind, können sie nicht als Primärschlüssel verwendet werden. Folglich muss ein künstlicher Schlüssel eingeführt werden, die \verb|Passagier-Nr|. \verb|Typ-Nr| des Flugzeugtyps sollte auch gespeichert werden, da Personalzahl und Sitzplatzzahl nicht eindeutig sind. \end{bAntwort} %% % (c) %% \item Geben Sie die Funktionalitäten an! %% % (d) %% \item Erstellen Sie nun ein zu dieser Modellierung passendes Relationenschema! Markieren Sie Schlüssel und Fremdschlüssel. \begin{bAntwort} \verb|angehoeren| wird aufgelöst: \verb|Typ-Nr[Flugzeugtyp]| nach \verb|Flugzeug| \verb|besitzen| wird aufgelöst: \verb|FGName[Fluggesellschaft]| nach \verb|Flugzeug| \verb|fliegen| wird aufgelöst: \verb|FGName[Fluggesellschaft]| \verb|FZ-Nr[Flugzeug]| nach \verb|Flug| \bigskip { \footnotesize\ttfamily Fluggesellschaft(\bPrimaer{FGName}, Hauptsitz) Flug(\bPrimaer{Flug-Nr}, Abflugzeit, Zielflughafen, \bFremd{FGName[Fluggesellschaft]}, \bFremd{FZ-Nr[Flugzeug]}) Flugzeug(\bPrimaer{FZ-Nr}, \bFremd{FGName[Fluggesellschaft]}, DatumErsterEinsatz, \bFremd{Typ-Nr[Flugzeugtyp]}) Flugzeugtyp(\bPrimaer{Typ-Nr}, SitzplatzAnzahl, GroesseBesatzung) Passagier(\bPrimaer{Pass-Nr}, Name, Gebdat) buchen(\bFremd{Pass-Nr[Passagier]}, \bFremd{Flug-Nr[Flug]}, Sitzplatz-Nr) } \end{bAntwort} %% % (e) %% \item Finden Sie nun jeweils eine Datenbank-Anfrage (in SQL und in relationaler Algebra) zur Lösung der folgenden Problemstellungen: \renewcommand{\labelenumii}{\alph{enumii}.} \begin{enumerate} %% % a. %% \item Die Fluggesellschaft „Never-Come-Back-Airlines“ (NCA) will wissen, ob (und wenn ja bei welchem Flug) heute Abend Passagiere (Name, Sitzplatz-Nr) mit einem ihrer Flugzeuge unterwegs sind, die heute Geburtstag haben (GebDat = TODAY). \begin{bAntwort} $ \pi_{\text{Name,Sitzplatz-Nr}}( \sigma_{\text{GebDat} = \text{TODAY}}(\text{Passagier}) \bowtie \text{buchen}\\ \bowtie \sigma_{\text{Name} = \mlq \text{Never-Come-Back-Airlines} \mrq \land \text{Abflugzeit} > \text{18.00}}(\text{Flug}) ) $ \begin{minted}{sql} SELECT p.Name, p.Sitzplatz-Nr FROM Passagier p, Flug f, buchen b WHERE f.Name = 'Never-Come-Back-Airlines' AND f.Abflugzeit > 18.00 AND p.Gebdat = TODAY AND f.Flug-Nr = b.Flug-Nr AND b.Pass-Nr = p.Pass-Nr; \end{minted} \end{bAntwort} %% % b. %% \item Ein Passagier möchte erfahren, welcher Flug (Flug-Nr, FZ-Nr, Abflugzeit, FGName) derjenige mit dem „modernsten“ Flugzeug ist, der nach „London“ geht. \begin{bAntwort} \begin{minted}{sql} SELECT f.Flug-Nr, f.FZ-Nr, f.Abflugzeit, f.FGName FROM Flug f, Flugzeug fz WHERE f.FZ-Nr = fz.FZ-Nr AND f.Zielflughafen = 'London' AND fz.DatumErsterEinsatz = ( SELECT MAX(Flugzeug.DatumErsterEinsatz) FROM Flug, Flugzeug WHERE Flug.Zielflughafen = 'London' AND Flug.FZ-Nr = Flugzeug.FZ-Nr ) \end{minted} \end{bAntwort} \end{enumerate} \end{enumerate} \end{document}