Skip to Content

TU Wien Fakultät für Informatik DBAI Database and Artificial Intelligence Group
Top-level Navigation: Current-level Navigation:

Path: DBAI > Education > Datenbanksysteme > Übung > Beispiel 1

Tools: Drucken


Datenbanksysteme (VU 4.0, 184.686)
Übungsteil, WS 2015/16

Beispiel 1

Eine Eventtechnikfirma möchte seine Auftragsverwaltung in einer Datenbank erfassen. Dazu sollen folgende Informationen gespeichert werden:

Sie finden nun im folgenden Bild ein ER-Diagramm, das die grobe Struktur der Datenbank abbildet, wobei Sie davon ausgehen können, dass die Abbildung sowohl den Sachverhalt als auch alle Kardinalitäten bereits korrekt abdeckt.

ER-Diagramm

Ihre Aufgabe ist es nun:

Bei der Überführung in die CREATE-Anweisungen werden Sie feststellen, dass NULL-Werte durch das ERD erlaubt sind. Beim Abgabegespräch sollten Sie in der Lage sein, die betroffenen Tabellen zu nennen und Vorschläge zu machen, wie man diese NULL-Werte vermeiden kann. Es ist aber nicht notwendig, NULL-Werte bei den CREATE-Befehlen zu vermeiden und die mündliche Erklärung während des Abgabegesprächs ist ausreichend.

SQL

  1. Erstellen Sie eine Query, die alle Auftragsnummern ausgibt, welche noch unerledigte Auftragspositionen haben (Unerledigte Auftragspositionen haben keine zugehörige Rechnungsposition).
  2. Erstellen Sie eine View, die den Preis jeder Leistung inklusive der benötigten Leistungen ausgibt. Beachten Sie das Attribut Menge in der "benötigt" Relation. Hinweis: Die gesuchte Query verwendet WITH RECURSIVE.
  3. Erstellen Sie eine View, die alle Kunden mit ihren aktuellen (neuestes Erstelldatum) Kundendaten ausgibt.

PL/pgSQL

Erstellen Sie folgende Trigger:

  1. Rechnungspositionen einer Rechnung gehören immer zum selben Auftrag.
  2. Eine Auftragsposition kann entweder eine Sonstige Position oder eine Leistungsposition sein (nicht beides).
  3. Leistungen dürfen nicht zirkulär voneinander abhängig sein. Zum Beispiel kann die Leistung mit der Nummer 1 nicht die Nummer 2 benötigen welche wiederum Leistung Nummer 1 benötigt (mit beliebig vielen Zwischenstationen). Hinweis: Der Trigger verwendet eine Query mit WITH RECURSIVE.

Function:

  1. Schreiben Sie eine Funktion f_calc_apos, welche als Parameter die Auftragsnummer und die APNr einer Auftragsposition erhält.
    Die Funktion f_calc_apos soll nun für die übergebene Auftragsposition den Wert berechnen. Wobei folgendes zu beachten gilt:
    • Für eine Sonstige Position ist der zurückgegebene Wert, der Wert der Sonstigen Position minus dem Positionsrabatt minus dem aktuellen Sonderrabatt des Kunden.
    • Für eine Leistungsposition muss der Wert der Leistung inklusiver aller benötigten Leistungen ermittelt und mit der bestellten Menge multipliziert werden (sie können die angelegte View verwenden). Von diesem Betrag werden der Positionsrabatt minus der Sonderrabatt des Kunden abgezogen.

Aufgabenstellung

  1. Leiten Sie aus dem ER-Diagramm die Relationen der Datenbank in 3. Normalform so ab, dass sie verbundtreu und abhängigkeitstreu sind. Sie können die Ableitung der Relationen gleich unmittelbar in der geforderten Datei create.sql vornehmen und müssen KEIN explizites Dokument für das Relationenmodell (wie in den vorangegangenen Semestern) erstellen.

  2. Erstellen Sie eine Datei create.sql, in welcher die nötigen CREATE-Befehle gespeichert werden, um die Relationen mittels SQL zu realisieren. Dabei sind folgende Punkte zu beachten:

    • Wählen Sie für Geldbeträge keine Gleitkommatypen sondern z. B. NUMERIC mit zwei Nachkommastellen.
    • Realisieren Sie die fortlaufende Nummerierung der künstlichen Primärschlüssel-Attribute mit Hilfe von Sequences. Die Sequence für den Schlüssel der Tabelle Auftrag soll bei 10 beginnen und in Zehnerschritten erhöht werden (d.h. 10, 20, 30, ...).
    • Sollten zwischen zwei Tabellen zyklische FOREIGN KEY Beziehungen existieren, so achten Sie darauf, dass eine Überprüfung dieser FOREIGN KEYs erst zum Zeitpunkt eines COMMITs stattfindet.
    • Verwenden Sie keine Umlaute für Bezeichnungen von Relationen, Attributen, etc.
    • Stellen Sie die folgenden Sachverhalte durch geeignete CHECK-Bedingungen sicher:
      • Alle Werte bzw. Preise müssen größer gleich 1 sein.

  3. Erstellen Sie eine weitere Datei insert.sql, welche die INSERT-Befehle für die Testdaten der in Punkt 2 erstellten Tabellen enthält. Jede Tabelle soll zumindest drei Zeilen enthalten. Sie dürfen die Wahl der Namen, Bezeichnungen etc. so einfach wie möglich gestalten, d. h. Sie müssen nicht "real existierende" Aufträge, Personen, Leistungen, etc. wählen. Stattdessen können Sie auch einfach "Auftrag 1", "Auftrag 2", "Leistung 1", "Leistung 2" etc. verwenden.

  4. Erstellen Sie eine Datei queries.sql, welche den Code für die SQL Query und die beiden Views enthält.

  5. Erstellen Sie eine Datei plpgsql-teil.sql, welche den Code für die Trigger und die Funktion f_calc_apos enthält.

  6. Erstellen Sie eine Datei drop.sql, welche die nötigen DROP-Befehle enthält, um alle in den Punkten 2 und 4 erzeugten Datenbankobjekte wieder zu löschen. Das Schlüsselwort CASCADE darf dabei NICHT verwendet werden.

  7. Überlegen Sie sich eine sinnvolle Testabdeckung für die PL/pgSQL-Programmteile laut Punkt 5, z.B.: Erweiterung der Testdaten, Aufruf der zu testenden PL/pgSQL-Programmteile mit entsprechenden Ausgaben, so dass sich die erfolgreiche Durchführung der Tests überprüfen lässt. Denken Sie auch an negative Tests, welche mit einer Exception enden sollen, z.B. Aufruf der Funktion f_calc_apos mit einer falschen Auftragsnummer.
    Stellen Sie in Ihrem ZIP-Archiv die SQL-Dateien mit den zusätzlichen INSERT-Befehlen und den "Testtreibern" in der Datei test.sql bereit. Sie müssen in der Lage sein, diese SQL-Dateien und PL/pgSQL-Dateien im Rahmen des Abgabegesprächs ablaufen zu lassen.

  8. Stellen Sie in Ihrem Abgabearchiv eine Listing-Datei mit dem Namen listing.txt bereit, die Sie bei der Ausführung der SQL-Dateien erzeugt haben. Diese Datei soll alle Informationen beinhalten, die beim Ablauf der Dateien create.sql, insert.sql, queries.sql plpgsql-teil.sql, test.sql und drop.sql erzeugt werden. Beachten Sie dazu bitte die Hinweise zur Benützung von psql am Ende dieses Dokuments.

  9. Im Rahmen des Abgabegesprächs müssen Sie in der Lage sein, alle von Ihnen in der Abgabe bereitgestellten Dateien erklären zu können. Weiters wird erwartet, dass Sie auch das ER-Diagramm einwandfrei analysieren können, auch wenn es in diesem Semester bereits vorgegeben wurde. Bitte achten Sie auch darauf, dass sich alle von Ihnen abgegebenen Dateien auf dem bordo-Server ausführen lassen, um Probleme (und möglicherweise daraus resultierenden Punktabzug) zu vermeiden

Abgabe

Zusammenfassend sind nun folgende Dateien abzugeben:

Die aufgezählten Dateien sind in einer ZIP-Datei beispiel1.zip bis spätestens 02.11.2015 um 23:59 im TUWEL abzugeben. Es wird stets die zuletzt hochgeladene Version Ihrer Lösung gewertet.
Achten Sie darauf, dass der Name jeder dieser abzugebenden Dateien so lautet wie oben beschrieben. Erstellen Sie keine Ordner innerhalb der ZIP-Datei.

Abgabegespräche

Die Verteilung der Punkte erfolgt nach folgendem Schlüssel:

Im Rahmen des Kontrollgespräches wird nicht nur die Korrektheit, sondern vor allem das Verständnis der Konzepte überprüft. Durch die Übung sollen sowohl Ihre praktische Problemlösungskompetenz als auch das theoretische Wissen über Datenbanksysteme gefördert werden. Sie müssen daher bei den Abgabegesprächen in der Lage sein, nicht nur Ihre Beispiele zu erklären, sondern ebenfalls zeigen, dass Sie die bisher in der Vorlesung behandelte Theorie zu diesen Beispielen ausreichend verstanden haben. Dies soll Ihnen die Vorbereitung für die Prüfung erleichtern und so können Sie Ihr Wissen während der Abgabegespräche selbst testen und gegebenenfalls vertiefen.

Die volle Punktezahl gibt es nur, wenn die Beispiele korrekt gelöst wurden und die Lösung einwandfrei erklärt werden kann. Nicht selbstständig gelöste Abgaben werden mit 0 Punkten bewertet!

Erscheinen Sie in Ihrem eigenen Interesse pünktlich zum Abgabegespräch, da andernfalls nicht garantiert werden kann, dass Ihre gesamte Lösung in der verbleibenden Zeit beurteilt werden kann.

Bringen Sie bitte Ihren Studentenausweis zur Abgabe mit. Eine Abgabe ohne Ausweis ist nicht möglich.

Hinweise zur Verwendung von psql

Folgende Befehle können für Ihre Arbeit mit der interaktiven SQL-Shell psql von PostgreSQL hilfreich sein:


Home / Kontakt / Webmaster / Offenlegung gemäß § 25 Mediengesetz: Inhaber der Website ist das Institut für Logic and Computation an der Technischen Universität Wien, 1040 Wien. Die TU Wien distanziert sich von den Inhalten aller extern gelinkten Seiten und übernimmt diesbezüglich keine Haftung. Disclaimer / Datenschutzerklärung