18.11.2013 Aufrufe

Aufgabe 1 - TUM Informatik III: Datenbanksysteme

Aufgabe 1 - TUM Informatik III: Datenbanksysteme

Aufgabe 1 - TUM Informatik III: Datenbanksysteme

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

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 />

Lösung von Blatt Nr. 8<br />

<strong>Aufgabe</strong> 1<br />

Übung zur Vorlesung <strong>Datenbanksysteme</strong><br />

Stefan Seltzsam (Stefan.Seltzsam@in.tum.de)<br />

Martin Wimmer (Martin.Wimmer@in.tum.de)<br />

Geben Sie die SQL-Schemadefinitonen an, um das in <strong>Aufgabe</strong> 3 von Blatt 3 gewonnene relationale<br />

Schema zu implementieren. Achten Sie darauf, in dieser Schemadefinition so viele gültige<br />

Integritätsbedingungen wie möglich zu beachten.<br />

Lösung<br />

Dem SQL/92 Standard nach bestehen unter anderem folgende Möglichkeiten, Integritätsbedingungen<br />

in einer Datenbank zu formulieren:<br />

Constraints auf Wertebereiche (domain constraints)<br />

Beispiel:<br />

CREATE DOMAIN cities CHAR(15)<br />

DEFAULT ’???’<br />

CHECK (VALUE IN (’Berlin’, ’Hamburg’, ’München’, ’???’))<br />

Eine Domain kann anstelle eines built-in Datentypen in Tabellendefinitionen verwendet<br />

werden.<br />

Wird in der Regel nicht unterstützt.<br />

Allgemeine Constraints (general constraints)<br />

Beispiel:<br />

CREATE ASSERTION ic10 CHECK<br />

(NOT EXISTS (SELECT p.PersNr<br />

FROM professoren p, Vorlesungen v<br />

WHERE p.PersNr = v.gelesenVon<br />

GROUP BY p.PersNr<br />

HAVING SUM(v.sws) > 8 ) )<br />

Eine Assertion ist ein first-class Element eines Datenbankschemas.<br />

Wird in der Regel nicht unterstützt.<br />

Constraints auf Tabellen (base table constraints)<br />

Diese Constraints sind weiter aufgeteilt in:<br />

• Schlüsseldefinitionen.<br />

• Fremdschlüsseldefinitionen.<br />

• ”<br />

check constraint“ Definitionen.<br />

1


Alle diese Constraint Definitionen können, falls Sie sich auf eine Spalte beziehen, in die<br />

Definition der Spalte aufgenommen werden.<br />

check constraints Laut SQL/92 kann in einem check constraint eine beliebige Bedingung<br />

spezifziert werden, die auch den Zugriff auf andere Tabellen beinhalten kann.<br />

Check Constraint für eine Tabelle p:<br />

constraint ic35 check<br />

( not exists (select * from sp<br />

where sp.pno = p.pno<br />

and (sp.qty * p.weight) > 2000 ) )<br />

references constraints Auch ohne on update . . . und on delete . . . ist eine references<br />

Bedingung sinnvoll:<br />

Es können nur Tupel eingefügt werden, deren Werte für die Fremdschlüssel ein Tupel<br />

in der ”<br />

Ziel“- Tabelle referenzieren.<br />

Ehrenrettung der Systeme: Komplexe Constraints lassen sich mit Hilfe von Triggern<br />

realisieren.<br />

Aktionen, die bei on update/on delete möglich sind:<br />

• NO ACTION ist die Defaulteinstellung.<br />

• CASCADE<br />

• SET DEFAULT<br />

• SET NULL<br />

Relationales Modell:<br />

Umsetzung in eine SQL Tabellendefinition:<br />

Städte : {[Name : string, Bundesland : string]}<br />

create table Staedte (<br />

Name<br />

varchar(40) not null,<br />

Bundesland varchar(40) not null,<br />

primary key (Name, Bundesland))<br />

Hinweis: DB2 verlangt bei Attributen, die zum primary key gehören, dass not null nochmal<br />

explizit angegeben wird.<br />

Relationales Modell:<br />

Bahnhöfe : {[Name : string, #Gleise : integer, SName : string, SBundesland : string]}<br />

Umsetzung in eine SQL Tabellendefinition:<br />

create table Bahnhoefe (<br />

Name<br />

varchar(40) not null primary key,<br />

Gleise integer check ( Gleise > 0),<br />

SName<br />

varchar(40),<br />

SBundesland varchar(40),<br />

foreign key (SName,SBundesland)<br />

references Staedte on delete cascade )<br />

2


Relationales Modell:<br />

Züge : {[ZugNr : integer, Länge : integer, StartBahnhof : string, Zielbahnhof : string]}<br />

Umsetzung in eine SQL Tabellendefinition:<br />

create table Zuege (<br />

ZugNr<br />

integer not null primary key,<br />

Laenge integer check (Laenge > 0),<br />

StartBhf varchar(40) references Bahnhoefe on delete set null,<br />

ZielBhf varchar(40) references Bahnhoefe on delete set null )<br />

Relationales Modell:<br />

verbindet : {[VonBahnhof : string, NachBahnhof : string, ZugNr : integer<br />

Ankunft : time, Abfahrt : time]}<br />

Umsetzung in eine SQL Tabellendefinition:<br />

create table verbindet (<br />

vonBahnhof varchar(40) not null<br />

references Bahnhoefe on delete cascade,<br />

nachBahnhof varchar (40) not null<br />

references Bahnhoefe on delete cascade,<br />

ZugNr<br />

integer not null references Zuege on delete cascade,<br />

Ankunft Time,<br />

Abfahrt Time,<br />

primary key (vonBahnhof, ZugNr) )<br />

<strong>Aufgabe</strong> 2<br />

Trigger werden oft auch eingesetzt, um replizierte Daten konsistent zu halten. Man denke etwa<br />

an ein Attribut AnzahlHörer, der der Relation Vorlesungen zugeordnet ist. Der Wert dieses Attributs<br />

könnte mittels eines Triggers auf der Relation hören aktuell gehalten werden. Realisieren<br />

Sie die notwendigen Trigger im Datenbanksystem ”<br />

Ihrer Wahl“.<br />

Lösung<br />

Zuerst ist eine Anpassung des Uni-Schemas notwendig:<br />

alter table Vorlesungen add (AnzahlHoerer integer);<br />

update VORLESUNGEN set AnzahlHoerer = select(count(*)<br />

from hoeren h<br />

where h.VorlNr = VorlNr);<br />

Die Lösung für Oracle sieht dann folgendermaßen aus:<br />

3


create or replace trigger incAnzahlHoerer<br />

before insert on hoeren<br />

for each row<br />

begin<br />

update Vorlesungen<br />

set AnzahlHoerer = AnzahlHoerer + 1<br />

where VorlNr = :new.VorlNr;<br />

end;<br />

Die Lösung für den SQL-Server sieht so aus:<br />

create trigger incAnzahlHoerer on hoeren<br />

after insert<br />

as<br />

update Vorlesungen<br />

set AnzahlHoerer = select(count(*)<br />

from hoeren h<br />

where h.VorlNr = VorlNr);<br />

where VorlNr in (select VorlNr from inserted);<br />

Im Gegensatz zur Formulierung des Triggers in Oracle, sieht die SQL-Server Variante einen<br />

after insert Befehl vor, d.h. der Trigger wird erst nach Einfügen der Tupel ausgeführt. Dies<br />

ist hier nötig, da innerhalb der update-Anweisung ein Zählen der hören-Einträge erfolgt, wozu<br />

die neuen Einträge bereits eingefügt sein müssen.<br />

<strong>Aufgabe</strong> 3<br />

Zeigen Sie die Korrektheit der drei zusätzlich zu den Armstrong-Axiomen eingeführten Inferenzregeln<br />

(Vereinigungsregel, Dekompositionsregel und Pseudotransitivitätsregel) für funktionale<br />

Abhängigkeiten, indem Sie diese aus den Armstrong-Axiomen herleiten.<br />

Lösung<br />

Die Armstrong Axiome: α, β, γ und δ bezeichnen Teilmengen der Attribute aus R.<br />

Reflexivität: β ⊆ α ⇒ α → β<br />

Verstärkung: α → β ⇒ αγ → βγ<br />

Transitivität: α → β ∧ β → γ ⇒ α → γ<br />

Für die Herleitung von Gesetzmäßigkeiten über funktionale Abhängigkeiten gibt es zwei<br />

Möglichkeiten:<br />

• Herleitung mittels Anwendung von schon bewiesenen Regeln oder den Armstrong Axiomen.<br />

• Herleitung über die Definition der funktionalen Abhängigkeiten:<br />

⇔<br />

α → β<br />

∀r, t ∈ R : r.α = t.α ⇒ r.β = t.β<br />

Die Herleitung über bekannte Regeln ist meist einfacher.<br />

4


• Zu beweisen: Vereinigungsregel<br />

α → β ∧ α → γ ⇒ α → βγ<br />

Verstärkung von α → β mit α:<br />

αα → αβ ⇔ α → αβ<br />

Verstärkung von α → γ mit β:<br />

αβ → γβ ⇔ αβ → βγ<br />

Die beiden funktionalen Abhängigkeiten α → αβ und αβ → βγ, die nun als gültig<br />

hergeleitet wurden, können über die Transitivität verknüpft werden:<br />

α → αβ ∧ αβ → βγ ⇒ α → βγ<br />

Somit ist die Vereinigungsregel hergeleitet.<br />

• Zu beweisen: Dekompositionsregel<br />

α → βγ ⇒ α → β ∧ α → γ<br />

Wegen der Reflexivität gilt aufgrund von β ⊆ βγ:<br />

βγ → β<br />

Wegen der Reflexivität gilt aufgrund von γ ⊆ βγ:<br />

βγ → γ<br />

Mittels Transitivität folgt dann:<br />

und:<br />

α → βγ ∧ βγ → β ⇒ α → β<br />

α → βγ ∧ βγ → γ ⇒ α → γ<br />

Somit ist die Dekompositionsregel hergeleitet.<br />

• Zu beweisen: Pseudotransitivitätsregel<br />

α → β ∧ γβ → δ ⇒ αγ → δ<br />

Verstärkung von α → β mit γ:<br />

αγ → βγ ⇔ αγ → γβ<br />

Ausnutzen der Transitivität:<br />

αγ → γβ ∧ γβ → δ ⇒ αγ → δ<br />

Somit ist die Pseudotransitivitätsregel hergeleitet.<br />

5

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!