09.10.2013 Aufrufe

Aufgabe 1 - TUM Informatik III: Datenbanksysteme

Aufgabe 1 - TUM Informatik III: Datenbanksysteme

Aufgabe 1 - TUM Informatik III: Datenbanksysteme

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!