Aufgabe 1 - TUM Informatik III: Datenbanksysteme
Aufgabe 1 - TUM Informatik III: Datenbanksysteme
Aufgabe 1 - TUM Informatik III: Datenbanksysteme
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Lösung von Blatt Nr. 4<br />
<strong>Aufgabe</strong> 1<br />
Eine 1:1-Beziehung der Art<br />
TU München, Fakultät für <strong>Informatik</strong><br />
Lehrstuhl <strong>III</strong>: <strong>Datenbanksysteme</strong><br />
Prof. Alfons Kemper, Ph.D.<br />
Übung zur Vorlesung <strong>Datenbanksysteme</strong> im WS05/06<br />
Richard Kuntschke (Richard.Kuntschke@in.tum.de)<br />
Martin Wimmer (Martin.Wimmer@in.tum.de)<br />
1<br />
(0, 1)<br />
1<br />
(0, 1)<br />
E1 R E2<br />
kann man sowohl durch Übernahme des Primärschlüssels von E2 (als Fremdschlüssel) in E1<br />
als auch umgekehrt modellieren. Wenn die Beziehung aber nur für wenige Elemente von E1<br />
definiert ist, enthält die Relation viele Tupel mit Null-Werten für diesen Fremdschlüssel.<br />
Geben Sie Beispiele aus der realen Welt, wo dies der Fall ist und man die Beziehungen deshalb<br />
besser in E2 repräsentiert.<br />
Geben Sie Beispiele, wo es sowohl für E1 als auch für E2 viele Elemente gibt, die die Beziehung<br />
R nicht ” eingehen“. Diskutieren Sie für diesen Fall die Vor- und Nachteile einer separaten<br />
Repräsentation der Beziehung als eigenständige Relation.<br />
Lösung<br />
Mögliche Umsetzungen ins relationale Modell:<br />
• Übernahme des Schlüssels von E2 als Fremdschlüssel in E1:<br />
E1 : {[Primärschlüssel von E1 : D1, . . . , Fremdschlüssel von E2 : D2]}<br />
E2 : {[Primärschlüssel von E2 : D2, . . .]}<br />
• Übernahme des Schlüssels von E1 als Fremdschlüssel in E2 (symmetrisch zur ersten<br />
Möglichkeit):<br />
E1 : {[Primärschlüssel von E1 : D1, . . .]}<br />
E2 : {[Primärschlüssel von E2 : D2, . . . , Fremdschlüssel von E1 : D1]}<br />
• Modellierung der Beziehung als separate Relation:<br />
bzw.<br />
E1 : {[Primärschlüssel von E1 : D1, . . .]}<br />
E2 : {[Primärschlüssel von E2 : D2, . . .]}<br />
R : {[Fremdschlüssel von E1 : D1, Fremdschlüssel von E2 : D2]}<br />
R : {[Fremdschlüssel von E1 : D1, Fremdschlüssel von E2 : D2]}<br />
1
Erstes Beispiel<br />
Modellierung der Ministerpräsidenten der Bundesländer:<br />
1 1<br />
Bundesland ist_Ministerpräsident<br />
Person<br />
Eine relativ schlechte Umsetzung ist:<br />
Bundesland : {[Name : string, . . .]}<br />
Person : {[SozVersNr : string, Name : string, MinisterpräsidentVon : string]}<br />
Diese hat den Nachteil vieler Nullwerte für das Attribut MinisterpräsidentVon.<br />
Eine bessere Umsetzung, bei der Nullwerte vermieden werden, ist:<br />
Zweites Beispiel<br />
Bundesland : {[Name : string, . . . , Ministerpräsident : string]}<br />
Modellierung von Eheschließungen:<br />
Person : {[SozVersNr : string, Name : string]}<br />
1 1<br />
Männer verheiratetMit<br />
Frauen<br />
Möglichkeiten, dies in das relationale Modell überzuführen, sind:<br />
oder<br />
Männer : {[Name : string, . . . , verheiratetMit : string]}<br />
Frauen : {[Name : string, . . .]}<br />
Männer : {[Name : string, . . .]}<br />
Frauen : {[Name : string, . . . , verheiratetMit : string]}<br />
Zudem kann der Beziehungstyp auch als eigene Relation im relationalen Modell realisiert<br />
werden:<br />
Männer : {[Name : string, . . .]}<br />
Frauen : {[Name : string, . . .]}<br />
verheiratetMit : {[FName : string, MName : string]} und<br />
verheiratetMit : {[FName : string, MName : string]}<br />
Man muss für die Relation verheiratetMit tatsächlich beide Schlüsselkandidaten angeben,<br />
um die 1 : 1-Beziehung ausdrücken zu können. Wählt man z.B. nur FName als Schlüsselkandidaten<br />
aus, so ist es möglich, dass ein Mann mit mehreren Frauen verheiratet ist. Die<br />
Konsistenzbedingung wäre damit verletzt.<br />
2
Hinweis: Damit ist nicht gemeint, dass {FName, MName} den Schlüssel bildet – denn damit<br />
würde man eine allgemeine N : M-Beziehung modellieren. Vielmehr müssen beide Schlüsselinformationen<br />
in der Datenbank getrennt realisiert werden (man wählt z.B. FName als<br />
primary key und setzt bzgl. MName das Constraint unique).<br />
Vergleicht man die dritte Realisierung mit den beiden vorangegangenen, so ergeben sich<br />
folgende Vorteile:<br />
• keine Nullwerte bei Personen, die nicht verheiratet sind,<br />
• schnelleres Durchsuchen der Beziehung (mit Indexunterstützung),<br />
• die Suche nach Ehepartnern wird in beide Richtungen gleich gut unterstützt,<br />
Abhängig von der tatsächlichen Ausprägung kann sowohl die eine, wie auch die andere<br />
Realisierung eine Speicherplatzersparnis bewirken, so dass dies weder als Vorteil noch als<br />
Nachteil gewertet wird.<br />
<strong>Aufgabe</strong> 2<br />
Finden Sie die Studenten, die Vorlesungen hören (bzw. gehört haben), für die ihnen die direkten<br />
Voraussetzungen fehlen. Formulieren Sie die Anfrage<br />
• in der Relationenalgebra,<br />
• im relationalen Tupelkalkül und<br />
• im relationalen Domänenkalkül.<br />
Erweitern Sie die oben gefundene Menge von Studenten um diejenigen, denen für eine gehörte<br />
Vorlesung die indirekten Grundlagen 2. Stufe (also die Vorgänger der Vorgänger der Vorlesung)<br />
fehlen. Kommt da was anderes heraus?<br />
Illustrieren Sie die Auswertung am Beispiel der Universitätsdatenbank.<br />
Für die Relationenalgebra sollten Sie die Anfrage auch als Operatorbaum aufzeichnen.<br />
Lösung<br />
Formulierung in relationaler Algebra<br />
1. Wir konstruieren eine hypothetische Ausprägung der Relation hören, die gelten müsste,<br />
wenn alle Studenten alle benötigten Vorgängervorlesungen hören.<br />
2. Von dieser Menge ziehen wir die tatsächliche Ausprägung von hören ab, so dass diejenigen<br />
Einträge übrigbleiben, bei denen ein Student die Vorgängervorlesung nicht hört<br />
(bzw. gehört hat).<br />
R := (ρVorlNr←Vorgänger(ΠMatrNr,Vorgänger(hören VorlNr=Nachfolger voraussetzen))<br />
−hören) Studenten<br />
Abbildung 1 zeigt den zugehörigen Operatorbaum<br />
3
Formulierung im Tupelkalkül<br />
ΠMatrNr,Vorgnger<br />
−<br />
VorlNr=Nachfolger<br />
hören voraussetzen<br />
Studenten<br />
hören<br />
Abbildung 1: Operatorbaum<br />
1. Wir selektieren die Studenten, die überhaupt eine Vorlesung hören (1. Existenzquantor).<br />
2. Wir wählen davon die Studenten aus, die eine Vorlesung hören, die einen Vorgänger<br />
hat (2. Existenzquantor).<br />
3. Wir fordern dann, dass die bisher ausgewählten Studenten diese Vorgängervorlesung<br />
nicht hören (negierter Existenzquantor).<br />
{s |s ∈ Studenten ∧ ∃ h ∈ hören<br />
(h.MatrNr = s.MatrNr ∧ ∃ v ∈ voraussetzen<br />
(h.VorlNr = v.Nachfolger ∧ ¬∃ h1 ∈ hören<br />
(h1.VorlNr = v.Vorgänger ∧ h1.MatrNr = s.MatrNr)))}<br />
Formulierung im Domänenkalkül<br />
Das Vorgehen ist analog zu dem beim relationalen Tupelkalkül. Unterschiede sind:<br />
1. Quantoren beziehen sich auf Domänenvariablen anstatt auf Tupelvariablen.<br />
2. Joinbedingungen können über Wiederverwendung von Domänenvariablen in Tupelkonstruktoren<br />
ausgedrückt werden, um somit Gleichheit von Variablen auszudrücken.<br />
3. Da über schon gebundene Domänenvariablen die hören-Tupel konstruiert werden können,<br />
die zu einem Ergebnis-Studenten nicht existieren dürfen, entfällt das ¬∃ hier.<br />
{[m,n] |∃ s([m,n,s] ∈ Studenten ∧ ∃ w([m,w] ∈ hören∧<br />
∃ v([v,w] ∈ voraussetzen ∧ ¬([m,v] ∈ hören))))}<br />
Wenn die bisher bestimmten Anfrageergebnisse um die Studenten erweitert werden sollen,<br />
denen die indirekten Grundlagen 2. Stufe zu gehörten Vorlesungen fehlen, ergibt sich keine<br />
andere Menge.<br />
4
Dazu betrachten wir eine Vorlesung v0 mit der direkten Voraussetzung v1 und der indirekten<br />
Voraussetzung v2.<br />
v0 → v1 → v2<br />
Nehmen wir an, dass ein Student / eine Studentin s v0 hört, aber nicht v2.<br />
Die Behauptung ist nun, dass der Student / die Studentin s bereits eine direkte Voraussetzung<br />
nicht hört und deswegen schon in dem bisherigen Anfrageergebnis enthalten ist.<br />
1. Fall Hört s v1, so ist v2 die direkte Voraussetzung zu v1 und die Behauptung ist wahr.<br />
2. Fall Hört s v1 nicht, so fehlt ihm/ihr die direkte Voraussetzung zu v0 und die Behauptung<br />
ist wahr.<br />
<strong>Aufgabe</strong> 3<br />
Finden Sie die Assistenten von Professoren, die den Studenten Fichte unterrichtet haben – z.B.<br />
als potentielle Betreuer seiner Diplomarbeit.<br />
Formulieren Sie die Anfrage in relationaler Algebra.<br />
Lösung<br />
Folgende Abfrage bildet zuerst das Kreuzprodukt über alle beteiligten Relationen, d.h. Studenten,<br />
Vorlesungen, Assistenten und hören. Anschließend erfolgt eine umfangreiche Selektion,<br />
die die auf Fichte zugeschnittenen Tupel extrahiert.<br />
Πa.PersNr, a.Name(σa.Boss=v.gelesenVon ∧ v.VorlNr=h.VorlNr ∧ h.MatrNr=s.MatrNr ∧ s.Name=’Fichte’<br />
(ρa(Assistenten) × ρs(Studenten) × ρv(Vorlesungen) × ρh(hören)))<br />
Die Bildung des Kreuzprodukts gilt es, falls möglich, zu vermeiden, da dadurch möglicherweise<br />
sehr große Zwischenergebnisse gebildet werden, was zu Leistungseinbußen während der<br />
Anfragebearbeitung führen kann. Folgende Anfrage berechnet dieselbe Ergebnismenge, setzt<br />
jedoch bereits Optimierungstechniken, wie frühe Selektion und den (natürlichen) Verbundoperator<br />
ein.<br />
<strong>Aufgabe</strong> 4<br />
ΠPersNr, Name((ΠPersNr, Name, VorlNr(Assistenten Boss=gelesenVon Vorlesungen))<br />
(ΠVorlNr(σName=’Fichte’(Studenten) hören)))<br />
Beweisen Sie, dass der natürliche Verbundoperator assoziativ ist.<br />
Gilt das auch für den linken (bzw. rechten) äußeren Join und die Semi-Joins?<br />
Lösung<br />
Behauptung 1. R (S T ) = (R S) T<br />
5
Beweis.<br />
Sei x ∈ R (S T )<br />
S<br />
R<br />
⇔ ∃r ∈ R, y ∈ S T : x.R = r ∧ x.(S ∪ T ) = y (d.h. x = [ry])<br />
<br />
r.(R ∩ S) = y.(R ∩ S) r.(R ∩ (S ∪ T )) =<br />
T<br />
r.(R ∩ T ) = y.(R ∩ T )<br />
⇔ ∃r ∈ R, s ∈ S, t ∈ T : r.(R ∩ S) = [st].(R ∩ S) ∧<br />
r.(R ∩ T ) = [st].(R ∩ T ) ∧<br />
s.(S ∩ T ) = t.(S ∩ T ) ∧<br />
x = [rst]<br />
⇔ ∃r ∈ R, s ∈ S, t ∈ T : r.(R ∩ S) = s.(R ∩ S) ∧<br />
r.(R ∩ T ) = t.(R ∩ T ) ∧<br />
s.(S ∩ T ) = t.(S ∩ T ) ∧<br />
x = [rst]<br />
y.(R ∩ (S ∪ T ))<br />
⇔ ∃z ∈ R S, t ∈ T : z.((R ∪ S) ∩ T ) = t.((R ∪ S) ∩ T ) ∧<br />
⇔ x ∈ (R S) T<br />
x = [zt]<br />
Behauptung 2. Linker und rechter äußerer Join sind nicht assoziativ.<br />
Beweis. Beweis durch Gegenbeispiel:<br />
R<br />
U V<br />
a b<br />
S<br />
U W<br />
c d<br />
T<br />
V W<br />
b e<br />
(R S) T = {(a, b, −, e)}<br />
R (S T ) = {(a, b, −, −)}<br />
Behauptung 3. Semi-Joins sind ebenfalls nicht assoziativ.<br />
Beweis. Beweis durch Gegenbeispiel:<br />
6
R<br />
U V<br />
a b<br />
S<br />
V W<br />
b c<br />
(R S) T = {(a, b)}<br />
R (S T ) = ∅<br />
7<br />
T<br />
W U<br />
d a