Lehrprofessur für Informatik

Werbung
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
Herunterladen