5. Übungszettel (Abgabe Fr. 22.05.09 bis 18 Uhr) Einführung in Datenbanksysteme Datenbanken für die Bioinformatik Heinz Schweppe, Jürgen Broß, Katharina Hahn Übungsaufgaben Aufgabe 1 (Advanced SQL) 12 Punkte Gegeben sei der unten abgebildete Ausschnitt aus dem Datenbankschema des OpenStreetMap Projektes (www.openstreetmap.org), bestehend aus den Tabellen nodes, way_nodes und way_tags. Die Datenbank enthält geographische Objekte, wie etwa Straßenabschnitte, S Bahnlinien, Bushaltestellen und viele mehr. Für diese Aufgabe sind die Straßenabschnitte und deren Eigenschaften von Relevanz. Ein Straßenabschnitt ist wie folgt modelliert: Jeder Straßenabschnitt besitzt eine eindeutige ID. Ein Straßenabschnitt besteht aus mehreren Wegpunkten. Diese Wegpunkte sind in der Tabelle way_nodes verzeichnet. Wegpunkte sind eindeutig identifiziert über die ID des Straßenabschnitts und einer sequence_id. Die Zählung der sequence_id beginnt bei 1 und ordnet die Wegpunkte eines Straßenabschnitts. Eigenschaften eines Straßenabschnitts sind in der Tabelle way_tags verzeichnet. Die Tabelle enthält key/value Paare (z.b. key: maxspeed, value:70). Ein solches Paar wird über die ID einem Straßenabschnitt zugeordnet. Beachten Sie, dass in diesem Ausschnitt keine Entität Straßenabschnitt existiert und diese nur implizit über die IDs in way_nodes und way_tags vorhanden ist. Beachten Sie auch, dass die Tabelle way_nodes nicht nur Straßenabschnitte enthält, sondern z.b. auch S Bahnlinien. Straßenabschnitte sind in der Tabelle way_tags mit dem Schlüssel (Attribut k) highway und einem Wert ( Attribut v ) aus ( motorway, primary, secondary, tertiary, residential oder playing street ) getaggt. Die Tabelle nodes enthält alle bekannten geographischen Punkte. Dort sind evtl. zu einem Punkt zusätzliche Tags wie z.b. Ampeln oder Stoppschilder eingetragen. Ein way_node referenziert immer genau einen node. Die Tabelle nodes enthält auch geographische Punkte, die nicht von einem way_node referenziert werden. Untersuchen Sie die Datensätze, um mit der Datenbank vetraut zu werden!
Die OSM Datenbank ist sowohl unter Oracle, als auch unter PostgreSQL im Schema osm verfügbar. Die Daten in der Datenbank umfassen die Region Berlin. a) Sie wollen einen Graphen des Straßennetzes erzeugen. Knoten dieses Graphen sind alle Straßenkreuzungen. Schreiben Sie eine SQL Anweisung, die alle Straßenkreuzungen (Ids der Punkte aus nodes) liefert. Ein solcher Kreuzungspunkt wird von mind. 2 Straßenabschnitten referenziert. b) Schreiben Sie eine SQL Anweisung, die alle Straßenabschnitte (Id und Name) findet, auf denen eine Geschwindigkeitsbegrenzung von 30km/h (tag: maxspeed, wert: 30) vorliegt und mindestens eine Ampel existiert. (Ampel nodes.tags : highway=traffic_signals) c) Schreiben Sie eine SQL Anweisung, die berechnet wieviele Ampeln durchschnittlich auf Straßenabschnitten, die sich in der Datenbank aus mehr als 20 Wegstücken zusammensetzen, existieren. (Ampel nodes.tags : highway=traffic_signals) Abbildung 1: Datenbankschema des Ausschnittes aus der OSM Datenbank
Abbildung 2: Beispiel für die Modellierung von Straßenabschnitten Aufgabe 2 (Advanced SQL) 4 Punkte Gegeben sei die folgende geschachtelte Anfrage: SELECT * FROM R WHERE R.a <operator> (SELECT b FROM S WHERE S.c = 1); Welche der folgenden Formulierungen sind äquivalent, welche nicht? Begründen Sie Ihre Aussagen kurz. a) IN b) = ANY c) = ALL d) NOT IN e) <> ANY f) <> ALL
Aufgabe 3 (Views) 6 Punkte Erstellen Sie auf Basis des in Aufgabe 1 angegebenen Schemas für die OSM Datenbank folgende Sichten (Views): a) Eine Sicht, die nur Straßen vom Typ 'residential' enthält. Die Sicht enthält die ID eines Straßenabschnittes. b) Eine Sicht, die nur Straßenabschnitte vom Typ 'residential' enthält und die einen Straßennamen besitzen (way_tags: k=name). Die Sicht soll zu einem Straßenabschnitt die ID, die Koordinaten (latitude, longitude) des Beginns des Abschnitts, sowie den Straßenamen enthalten. Aufgabe 4 (SQL Funktionen & Trigger) 15 (+5) Punkte Wie Sie alle den Meldungen entnehmen konnten, gab es ein gehöriges Chaos bei der elektronischen Datenverarbeitung der Anträge zur Umweltprämie ( Abwrackprämie ). Auf dunklen Kanälen ist es den Übungsleitern gelungen an das Datenbankschema der für diese Zwecke entwickelten Software zu gelangen. Es ist untenstehend abgebildet. Die Abwrack Datenbank ist sowohl für Oracle, als auch für PostgreSQL als SQL Skript auf der Übungsseite verfügbar. Schreiben Sie folgende Funktionen in PL/SQL (Oracle) bzw. PG_PL/SQL (PostgreSQL): a) CO2BILANZ() NUMBER: Berechnet die Differenz des CO2 Ausstoßes zwischen neuer und alter Fahrzeugflotte. b) CO2BILANZ2(NUMBER konstante) NUMBER: Berechnet die Differenz des CO2 Ausstoßes zwischen neuer und alter Fahrzeugflotte, wenn für die frühzeitige Herstellung eines Neufahrzeugs (aufgrund der frühzeitigen Verschrottung) eine Konstante für den CO2 Ausstoß einberechnet wird. c) MARKTANTEIL(VARCHAR hersteller) NUMBER: Berechnet den Marktanteil eines Herstellers an den mit der Umweltprämie geförderten Neuwagen. d) Optionale Zusatzaufgabe mit 5 Zusatzpunkten KOSTEN(INTEGER steuer_vorteil_pauchale, FLOAT verbrauch_schwellwert) VARCHAR: Berechnet die kurzfristigen Kosten (ggf. auch den Gewinn) für den Staat, die durch Gewährung der Umweltprämie entstanden sind. Kosten sind bei jedem Antrag die gewährte Prämie. Steuergewinne ergeben sich aus der erhaltenen Mehrwertsteuer beim Verkauf eines Neuwagens. Wenn ein Neuwagen beim Verbrauch unter dem Schwellwert verbrauch_schwellwert liegt, müssen als Kosten noch pauschal KFZ Steuerausfälle von steuer_vorteil_pauschale berechnet werden.
Sollten Kosten entstanden sein, so gibt die Funktion aus: Uups, durch die Gewährung der Prämie sind Kosten von??? entstanden. Sonst gibt die Funktion aus: Hurra, es ist ein Gewinn von??? entstanden. e) Schreiben Sie einen Trigger, der folgende Aufgabe erfüllt: Wenn ein Sachbearbeiter einen Antrag bearbeitet ändert er aus Gründen der Nachvollziehbarkeit für den Bürger den Status des Antrags. Zum Beispiel von empfangen in in Bearbeitung und dann in gewährt oder abgelehnt. Ihr Trigger soll bei einer Änderung des Status eine Nachricht in die Nachrichten Tabelle für den zu informierenden Bürger einstellen. Je nach Status unterscheiden sich die Nachrichten. Beim Inhalt der Nachrichten haben Sie freie Wahl. Abbildung 3: Datenbankschema für die Abwrackdatenbank Informationen zur Programmierung von PL/SQL und PG_PL/SQL finden Sie in den entsprechenden Dokumentationen der beiden Datenbanksysteme.