Aufgabe 1 - TUM Informatik III: Datenbanksysteme
Aufgabe 1 - TUM Informatik III: Datenbanksysteme
Aufgabe 1 - TUM Informatik III: Datenbanksysteme
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