Musterlösung

Werbung
Eidgenössische
Technische Hochschule
Zürich
Ecole polytechnique fédérale de Zurich
Politecnico federale di Zurigo
Swiss Federal Institute of Technology Zurich
Dr. C. Türker
Objektrelationale, erweiterbare Datenbanken
WS03/04
Übung 4
Musterlösung
Aufgabe 1: Klassen: Typen und Extensionen / Objektalgebra
Im Anwendungsszenario sollen diesmal die Klassen Artikel und Haushaltswaren
näher betrachtet werden.
1. Definieren Sie die Funktionen (Attribute) für die Klasse Artikel und deren Subklasse Haushaltswaren. Die UML-Assoziationen können hier vernachlässigt werden.
Lösungsvorschlag:
(a) Fkt(Artikel) = {Nummer, Bezeichnung, Preis, Beschreibung, Bilder }
(b) Fkt(Haushaltswaren) = Fkt(Artikel) ∪ {Garantie, Farbe}
Haushaltswaren werden im Folgenden mit H, Artikel mit A abgekürzt.
2. Geben Sie für die Klasse Haushaltswaren eine Projektion an, um nur die Funktionen der Superklasse zu erhalten.
Lösungsvorschlag:
R1 = π [Nummer(x), Bezeichnung(x), Preis(x), Beschreibung(x), Bilder(x)] (x
IN H)
3. Schreiben Sie eine Anfrage, um alle Haushaltswaren zu erhalten, die weniger
als 5 Franken kosten.
Lösungsvorschlag:
R2 = σ [Preis(x) < 5] (x IN H)
4. Lassen Sie sich von den eben ausgewählten Haushaltswaren die Attribute
Nummer, Bezeichnung, Preis und Farbe anzeigen.
Lösungsvorschlag:
R3 = π [Nummer(y), Bezeichnung(y), Preis(y), Farbe(y)] (y IN R2)
5. Lassen Sie sich nun die Garantie der Haushaltswaren anzeigen, die weniger
als 5 Franken kosten.
Lösungsvorschlag:
R4 = π [Garantie(y)] (y IN R2)
6. Geben Sie für alle Artikel, die mehr als 25 Schweizer Franken kosten, die
Nummer und den Preis sowohl in Schweizer Franken als auch in Euro aus.
Der Umrechnungskurs sei 1 SFR = 0,66 Euro.
Lösungsvorschlag:
R5 = π [Nummer(x), Preis(x), 0.66 * Preis(x)] (σ [Preis(x) > 25] (x IN A))
7. Zeichnen Sie die Typ- bzw. Extensionshierarchien für obige Klassen und
Anfrageergebnisse auf und ermitteln Sie daraus die Ober-/UnterklassenBeziehungen.
Lösungsvorschlag:
Super-/Suptypbeziehungen:
(a) A=R1 ≥ H = R2
(b) R3 ≥ H
(c) R4 ≥ H
Extensionsbeziehungen:
(a) A ⊇ H = R1 ⊇ R2 = R3 = R4
(b) A ⊇ R5
Klassenbeziehungen:
(a) A À R1 À H À R2
(b) R3 À R2
(c) R4 À R2
Aufgabe 2: Distinct-Typen und Casting in SQL:1999
Zwei verschiedene Unternehmen, die jeweils über getrennte Materialdatenbanken
verfügen, wollen zusammenarbeiten. Da ein Unternehmen in Europa, das andere
in den USA sitzt, werden aber die Schmelztemperaturen der Materialien einmal
in Grad Celsius und einmal in Fahrenheit gespeichert. Nun soll trotzdem eine
einheitliche Sicht auf diese Daten möglich sein.
1. Definieren Sie in SQL:1999 entsprechende Distinct-Typen für die verschiedenen Einheiten, um Temperaturwerte speichern zu können.
Lösungsvorschlag:
CREATE TYPE Celsius AS DECIMAL(5,2) FINAL;
CREATE TYPE Fahrenheit AS DECIMAL(5,2) FINAL;
2. Definieren Sie in SQL:1999 eine Konvertierungsfunktion, um ein implizites
Casting zu ermöglichen. Hinweis: TF ahrenheit = TCelsius ∗ 9/5 + 32
Lösungsvorschlag:
CREATE FUNCTION Fahrenheit(c Celsius)
RETURNS Fahrenheit
RETURN Fahrenheit(CAST(c AS DECIMAL(5, 2)) * 9 / 5 + 32));
-- Auch möglich:
-- RETURN CAST((CAST(c AS DECIMAL(5, 2)) * 9 / 5 + 32)
AS Fahrenheit);
CREATE CAST (Celsius AS Fahrenheit)
WITH FUNCTION Fahrenheit(Celsius) AS ASSIGNMENT;
3. Es sollen die Schmelztemperaturen von Materialien verglichen werden,
die sich in verschiedenen Datenbanken befinden. Wenn man hierbei beispielsweise für ein Material aus der europäischen Datenbank alle Materialien aus der amerikanischen Datenbank ausgegeben bekommen möchte,
die eine niedrigere Schmelztemperatur haben, so müssen Werte der
Schmelztemperatur-Attributen der beiden Datenbanken verglichen werden.
Was passiert in einem solchen Falle, falls der Vergleich
(a) ohne Cast,
(b) mit explizitem Cast auf den Basisdatentyp bzw.
(c) mittels implizitem Cast (aus der vorigen Teilaufgabe)
erfolgt.
Lösungsvorschlag:
(a) Ohne Cast dürfen Werte verschiedener Distinct-Typen nicht verglichen
werden, weil SQL:1999 streng typisiert ist. Es würde also ein Typfehler
erzeugt.
Eine entsprechende (unzulässige) Anfrage hätte hierbei die folgende
Form:
SELECT u.id
FROM EuroMaterial e, USMaterial u
WHERE e.ID = 101 AND e.Schmelztemp < u.Schmelztemp
(b) Nach einem (einfachen) expliziten Cast auf den Basistyp sind die beiden Werte vergleichbar, d.h. eine solche Operation ist nun syntaktisch
zulässig. Allerdings geht mit diesem Cast die Semantik verloren, da –
anschaulich gesprochen – einfach die Einheiten weggelassen werden. So
sind nun 100 Grad Celsius und 212 Fahrenheit ungleich, oder anders 10
Grad Celsius wären gleich 10 Fahrenheit, was natürlich nicht korrekt ist.
Eine syntaktisch zulässige, aber sinnlose Anfrage ist zum Beispiel:
SELECT u.id
FROM EuroMaterial e, USMaterial u
WHERE e.ID = 101 AND
CAST(e.Schmelztemp AS DECIMAL(5, 2))
< CAST(u.Schmelztemp AS DECIMAL(5, 2));
(c) Jetzt geschieht genau das, was man erwartet: Die beiden Werte werden
miteinander verglichen, wobei eine Umrechnung der Einheiten erfolgt.
Die Anfrage sieht in diesem Falle genauso wie bei Punkt (a) aus!
SELECT u.id, u.name
FROM EuroMaterial e, USMaterial u
WHERE e.ID = 101 AND e.Schmelztemp < u.Schmelztemp
Anzumerken ist noch, dass natürlich auch ein impliziter Cast sinnlos
definiert werden kann, während bei Angabe der richtigen Umrechungsfunktion auch ein expliziter Cast das richtige Ergebnis liefert.
4. Setzen Sie die obigen Teilaufgaben — soweit es geht — mittels DB2-SQL um.
Beachten Sie dabei kleinere syntaktische Unterschiede zu SQL:1999. Für die
DB2-Syntax sei auf das DB2-Manual SQL Reference“ verwiesen.
”
Folgende Aufgaben sollten auf jeden Fall umgesetzt werden:
• Definition der Distinct-Typen Celsius und Fahrenheit.
• Definition der Tabellen EuroMaterial(ID, Schmelztemparatur in Celsius)
und USMaterial(ID, Schmelztemparatur in Fahrenheit).
• Erzeugen von Beispielzeilen für beide Tabellen. Dabei sollte ein EuroMaterial mit der ID=101 enthalten sein.
• Definition einer Funktion, die Celsius in Fahrenheit umrechnet.
• Formulierung einer Anfrage, die alle US-Materialen ermittelt, die eine
höhere Schmelztemparatur haben, als das Euro-Material mit der ID=101.
• Definition einer Sicht, die alle Euro- und US-Materialien mit ihrer
Schmelztemparatur in Fahrenheit enthält.
Da IBM DB2 Version 7.2 keine benutzerdefinierten Casts unterstützt, müssen
die Konvertierungen explizit durchgeführt werden.
Lösungsvorschlag:
CREATE DISTINCT TYPE Celsius AS DECIMAL(5,2)
WITH COMPARISONS;
CREATE DISTINCT TYPE Fahrenheit AS DECIMAL(5,2)
WITH COMPARISONS;
CREATE FUNCTION Fahrenheit(c Celsius)
RETURNS Fahrenheit
RETURN Fahrenheit(CAST(c AS DECIMAL(5, 2)) * 9 / 5 + 32);
CREATE TABLE EuroMaterial (ID INT, Schmelztemp Celsius);
CREATE TABLE USMaterial (ID INT, Schmelztemp Fahrenheit);
INSERT INTO EuroMaterial VALUES (101, Celsius(78.5));
INSERT INTO EuroMaterial VALUES (102, Celsius(69.23));
INSERT INTO EuroMaterial VALUES (103, Celsius(99.71));
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
USMaterial
USMaterial
USMaterial
USMaterial
VALUES
VALUES
VALUES
VALUES
(201,
(202,
(203,
(204,
Fahrenheit(198.5));
Fahrenheit(192.3));
Fahrenheit(141.9));
Fahrenheit(170.2));
SELECT e.ID AS EuroMaterial,
Fahrenheit(e.Schmelztemp) AS Temp,
u.ID AS USMaterial,
u.Schmelztemp AS Temp
FROM EuroMaterial e, USMaterial u
WHERE e.ID = 101 AND Fahrenheit(e.Schmelztemp) < u.Schmelztemp;
CREATE VIEW Material(ID, SchmelztempFahrenheit) AS
SELECT ID, Fahrenheit(Schmelztemp)
FROM EuroMaterial
UNION
SELECT ID, Schmelztemp
FROM USMaterial;
Herunterladen