Datenbanken und Informationssysteme II Szenario: Mondial (zugehöriges DDL-Schema in Anhang A) Es gibt Länder, Provinzen, Städte und Grenzen. Aufgabe 1 (Trigger) [23 + 5] a) Analysiere das relationale Schema aus Anhang A und erstelle ein ER-Diagramm (Chen Notation mit min/max- Kardinalitäten). Bitte Attribute angeben, Schlüsselattribute unterstreichen, Not Null Statements beachten! Erstelle einen Trigger, der beim Update einer Stadt (Zuordnung zu einer anderen Provinz), die Einwohnerzahl der beteiligten Provinzen entsprechend der Einwohnerzahl der Stadt anpasst. Hinweis: Beachte, dass sich bei einem Update auch die Einwohnerzahl der Stadt ändern kann. Der Fall, dass eine Provinzhauptstadt verschoben wird muss nicht behandelt werden (Foreign Key Constraint Violation). b) Welchen Input bekommt der Trigger? Formuliere verbal welche einzelnen Schritte innerhalb des Triggers ausgeführt werden müssen. c) Implementiere den Trigger in PL/SQL. d) (Bonusaufgabe): Ändere das relationale Modell so ab, dass Grenzen zwischen Provinzen abgespeichert werden können. Wird dadurch die Tabelle borders (Anhang A) überflüssig? - warum? Aufgabe 2 (PHP) [16 + 10] Gegeben ist der in Anhang B dargestellte Programmierrahmen für eine objektrelationale Abbildungsschicht in PHP. Dieser Rahmen stellt in Basisklassen Zugriffsfunktionalität bereit. Grundlage ist weiterhin das relationale Schema aus Anhang A. Erweitere den Rahmen um folgende Methoden: a) Erstelle in der Klasse CRUD_Province eine Methode setcapital($city), welche die Provinzhauptstadt (Parameter $city ist eine Instanz) setzt. b) Erstelle eine von der Klasse CRUD_Country abgeleiteten Klasse Country mit einer Methode getcities(), welche alle Städte des Landes ausgibt (in Form eines Arrays mit Instanzen vom Typ City). Nutze dazu die Funktionalität der Basisklassen (kein SQL!) c) (Bonusaufgabe): Überschreibe in der Klasse Province die zuvor in der Oberklasse CRUD_Province definierte Methode setcapital($city), durch eine Version, die vor dem Setzen der neuen Hauptstadt überprüft, ob sich die Stadt überhaupt in der betreffenden Provinz befindet. Befindet sich die Stadt in einer anderen Provinz, so soll die Ausführung mit folgender Meldung beendet werden: Die Stadt <Stadtname> liegt in <Provinzname1> (<Länderkuerzel1>) und nicht in <Provinzname2> (Länderkürzel2) (bitte wenden ) 1
Hochschule Karlsruhe Technik und Umwelt- 2.7.2009 Fakultät für Informatik und Wirtschaftsinformatik SS 09 Aufgabe 3 (XML) [28 + 8] a) Gegeben ist das XML-Dokument in Anhang C. Formuliere folgende Anfragen mittels XPath (Inputs sind unterstrichen): - wie lange ist die Außengrenze von Deutschland? - zu welchem Land (Name des Landes) gehört die Insel Korfu? - wie viele französische Inseln gibt es? (Input France) b) Was ist das Ergebnis der folgernden Anfrage (Ausgabeformat, Anzahl Datensätze, Inhalt)? select extractvalue(column_value, '/*/name/text()') col1, extractvalue(column_value, '/*/population/text()') col2 from table (select xmlsequence(extract(xml_document, '//country[population/text()>50000000]')) from mondial_in_one) order by extract(column_value, '/*/population/text()').getnumberval() desc; Hinweis: Die Tabelle mondial_in_one enthält genau einen Datensatz, der den kompletten Mondial-Datensatz im XML_Format (entsprechend Anhang C) enthält. c) Erstelle ein SQLX Statement, das auf Basis des relationalen Schemas in Anhang A, die folgende Ausgabe liefert (Pro Land sollen alle in diesem Land vertretenen Religionen samt Prozentsatz ausgegeben werden): <land id="zambia"> <religion prozent="50">christian</religion> <religion prozent="24">muslim Hindu</religion> </land> <land id="zimbabwe"> <religion prozent="1">muslim</religion> <religion prozent="25">christian</religion> </land> d) (Bonusaufgabe): Erstelle ein XQuery-Statement, das als Output ein XML-Dokument mit folgender DTD hat: <!ELEMENT nachbarlaender (land+) > <!ELEMENT land EMPTY> <!ATTLIST land name CDATA #REQUIRED hauptstadt CDATA #REQUIRED> Das Dokument soll für alle Nachbarstaaten von Deutschland den Landesnamen und die Hauptstadt (jeweils als Attribut) ausgeben. 2
Anhänge: Anhang A: CREATE TABLE Country ( code VARCHAR2(4) PRIMARY KEY, name VARCHAR2(32) NOT NULL UNIQUE, capital VARCHAR2(35) NOT NULL, capital_province VARCHAR2(32) NOT NULL, population NUMBER CREATE TABLE Province ( name VARCHAR2(32), country VARCHAR2(4) REFERENCES Country(code), population NUMBER, capital VARCHAR2(35) NOT NULL, PRIMARY KEY (name, country), FOREIGN KEY(country) REFERENCES Country(code) CREATE TABLE City ( name VARCHAR2(35), country VARCHAR2(4), province VARCHAR2(32), population NUMBER, PRIMARY KEY (Name, Country, Province), FOREIGN KEY(country, province) REFERENCES Province(country, name) CREATE TABLE borders ( country1 VARCHAR2(4) not null references Country(code) on delete cascade, country2 VARCHAR2(4) not null references Country(code) on delete cascade, length NUMBER, PRIMARY KEY (country1,country2) ALTER TABLE Country ADD ( FOREIGN KEY( capital, code, capital_province) REFERENCES CITY( name, country, province) ALTER TABLE Province ADD ( FOREIGN KEY( capital, country, name) REFERENCES CITY( name, country, province) HIER HAT DIE TABELLE GEO_RELIGION GEFEHLT!! 3
Hochschule Karlsruhe Technik und Umwelt- 2.7.2009 Fakultät für Informatik und Wirtschaftsinformatik SS 09 Anhang B: class CRUD_City { protected $country; protected $province; static function getbyid($name, $country, $province) { function getname() { return $this->name; function getprovince() { // liefert Instanz der zugehörigen Provinz zurück class CRUD_Province { protected $country; protected $capital; protected $capprov; static function getbyid($name, $country) { function getcities() { // liefert Array von Städten zurück function setcapital($city) { function getcountry() { // liefert Landinstanz zurück function getname() { return $this->name; class CRUD_Country { protected $code; protected $capital; protected $province; static function getbyid($code) { function setcapital($city) { function getprovinces() { // liefert Array von Provinzen zurück function getname() { return $this->name; function getid() { return $this->code; 4
Anhang C (XML-Dokument) <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE simple-mondial SYSTEM "simple-mondial.dtd"> <simple-mondial> <country car_code="f" area="547030" capital="cty-france-paris"> <name>france</name> <population>58317450</population> <encompassed continent="europe" percentage="100"/> <religions percentage="1">muslim</religions> <religions percentage="1">jewish</religions> <languages percentage="100">french</languages> <border country="and" length="60"/> <border country="e" length="623"/> <border country="d" length="451"/> <province id="prov-cid-cia-france-2" capital="cty-france-strasbourg"> <name>alsace</name> <area>8280</area> <population>1624000</population> <city id="cty-france-strasbourg" is_state_cap="yes"> <name>strasbourg</name> <population>252338</population> </city> </province> </country> <island id="island-guadeloupe" country="f"> <name>guadeloupe</name> <area>1780</area> </island> <island id="island-martinique" country="f"> <name>martinique</name> <area>1100</area> </island> </simple-mondial> 5