WS 2011/12 Fakultät Angewandte Informatik Programmierung verteilter Systeme 05.12.2011 Prof. Dr. Bernhard Bauer Übungen zur Vorlesung Informatik II, Blatt 6 - Musterlösung Aufgabe 21 * (Objektrelationale Abbildung und SQL) Übersetzen Sie den folgenden Ausschnitt eines Klassendiagramms in Tabellen einer relationalen Datenbank und tragen Sie in jede Tabelle exemplarisch 2 Datenobjekte ein. Lösung: Adresse strasse plz ort hausnummer id Universitätsstrasse 89159 Augsburg 2 1 Eichleitnerstrasse 86159 Augsburg 30 2 Datum tag monat jahr id 1 2 2010 1 2 2 2010 2 1 Patient nachname adresseID geburtsdatumID anamnese ID Lorenz 2 2 null 1 Huber 1 1 null 2 Arzt nachname ID Meier 1 Denk 2 Arzt_Fachgebiet arztID fachgebiet 1 Homöopathie 1 Ophthalmologie Behandlung datumID diagnose arztID patientID ID 1 Streß 1 1 1 1 Grippe 2 2 2 Entwerfen Sie SQL-Anfragen, um: die Tabelle zum Datentyp Datum zu kreieren create table Datum ( ID integer tag integer monat integer jahr integer ); not not not not null, null, null, null, einen neuen Patienten aufzunehmen insert into Patient values (‘Kölbl‘,3,15,47); alle Datum-Datensätze vor dem 1.1.2000 zu löschen delete from Datum where jahr < 2000; alle Ärzte mit dem Fachgebiet Ophthalmologie auszugeben select Arzt.nachname from Arzt, Arzt_Fachgebiet where Arzt.ID = Arzt_Fachgebiet.arztID and Arzt_Fachgebiet.fachgebiet = ‘Ophthalmologie‘; Diskutieren Sie die Vor- und Nachteile, den Datentyp Datum als eigene Tabelle darzustellen. Überlegen Sie sich eine alternative Vorgehensweise. Vorteil: minimale Redundanz Nachteil: Information wird häufig gebraucht; jedes Mal ist ein Join nötig: ineffizient 2 Alternative: Nehme Attribute tag, monat, jahr in Tabellen Patient und Behandlung auf. Aufgabe 22 ** (Objektrelationale Abbildung und Generalisierungen) Geben Sie drei verschiedene Übersetzungen der folgenden Vererbungshierarchie in Tabellen einer relationalen Datenbank an und füllen Sie jedes Modell mit Beispieldaten (mit mindestens einem Objekt pro konkreter Klasse). Lösung 1: Alle Attribute der Hierarchie in eine Tabelle Grafik linieLaenge winkel laenge breite positionX positionY ID typ 10 90 null null 0 0 1 linie 20 120 null null 0 10 2 pfeil null null 10 20 10 0 3 rechteck null null 20 10 10 10 4 oval Lösung 2: Eine Tabelle für jede konkrete Klasse Linie laenge winkel positionX positionY ID 10 90 0 0 1 laenge winkel positionX positionY ID 20 120 0 10 1 Pfeil Rechteck 3 laenge breite positionX positionY ID 10 20 10 0 1 laenge breite positionX positionY ID 20 10 10 10 1 Oval Lösung 3: Eine Tabelle für jede Klasse Grafik positionX positionY ID 0 0 1 0 10 2 10 0 3 10 10 4 FlaechenloseGrafik laenge winkel grafikID 10 90 1 20 120 2 laenge breite grafikID 10 20 3 20 10 4 FlaechenGrafik Linie grafikID 1 Pfeil grafikID 2 Rechteck grafikID 3 Oval grafikID 4 4 Versuchen Sie, für alle drei Alternativen SQL-Anfragen zu entwerfen, um: • alle Linien um 90 Grad nach rechts zu drehen Lösung 1: update Grafik set winkel = winkel + 90 where typ = 'linie'; Lösung 2: update Linie set winkel = winkel + 90; Lösung 3: hier muss man die Tabellen Linie und FlaechenloseGrafik joinen: haben wir nur für select besprochen: update Linie,FlaechenloseGrafik set FlaechenloseGrafik.winkel = FlaechenloseGrafik.winkel + 90 where FlaechenloseGrafik.grafikID = Linie.GrafikID; • alle Grafiken um jeweils 100 Pixel nach rechts und unten zu verschieben Lösung 1: update Grafik set positionX = positionX + 100, positionY = positionY + 100; Lösung 2: 4 Anweisungen notwendig (für jede Tabelle eine) update Linie set positionX = positionX + 100, positionY = positionY + 100; ... Lösung 3: update Grafik set positionX = positionX + 100, positionY = positionY + 100; • ein neues Rechteck einzufügen Lösung 1: insert into Grafik values (null,null,20,20,20,20,5,‘rechteck‘); Lösung 2: insert into Rechteck values (20,20,20,20,5); Lösung 3: 3 Anweisungen notwendig (da Informationen über drei Tabellen verstreut) insert into Grafik values (20,20,5); insert into FlaechenGrafik values (20,20,5); insert into Rechteck values (5); Welche Schwierigkeiten hatten Sie? Diskutieren Sie die Vor- und Nachteile der drei Alternativen auf der Basis Ihrer Erfahrungen mit der Formulierung von SQL-Anfragen: ● Wie kombiniert man update, insert, delete mit where? 5 ● ● ● ● Lösung 1: kein Join notwendig, Anweisungen einfach zu entwerfen Lösung 2: Schwierig sind Aufgaben, die mehrere Spezialisierungen einer Oberklasse betreffen Lösung 3: Schwierig sind Aufgaben für spezielle Klassen (z.B. für geerbte Attribute) ... Aufgabe 23** (Datenbankzugriff über Konsole) siehe Code. Aufgabe 24*** (Datenbankzugriff über GUI) a) - e): siehe Code. f) * Diskussion: i. Inwiefern ist die implementierte Schichtenarchitektur vereinfacht? Antwort: Als Wurzel-Container wird ein Daten-Container (StudentenContainer) verwendet. Außerdem wird keine Schnittstelle für die Vorgabe von Lade- und Speicher-Operationen verwendet. Das wäre auch nicht sinnvoll, da sich keine „allgemeingültigen“ Prototypen angeben ließen, die auch noch nach Erweiterung Systems um weitere Datenklassen verwendbar wären. Dadurch wird die Erweiterung um weitere Datenklassen und der Austausch der Datenhaltungsschicht erschwert. ii. Wieso sollte das Anzeigefenster modal sein? Antwort: Es ist keine Aktualisierung des Anzeigefensters bei Datenänderung implementiert. Deshalb sollte auch keine Datenänderung (z.B. neues Student-Objekt erfassen) möglich sein, solange das Anzeigefenster offen ist. iii. Wie sollte sich das Programm bei einem Datenbank-Verbindungsfehler verhalten? Ist z.B. eine Warnung auf Kommandozeile, wie oben vorgeschlagen, ausreichend? Machen Sie sich über Alternativen Gedanken. Antwort: Das Programm sollte ● entweder mit oder nach einer Warnung auf Konsole oder durch einen Dialog abgebrochen werden: ● oder vor irgendeiner anderen Aktion erlauben, erneut eine Verbindung zur Datenbank aufzubauen: 6