Lehrstuhl für Praktische Informatik III Prof. Dr. Guido Moerkotte Email: [email protected] Pit Fender B6, 29, Raum C0.02 68131 Mannheim Telefon: (0621) 181–2517 Email: [email protected] Datenbanksysteme 2 Frühjahr-/Sommersemester 2013 1. Übungsblatt 06. März 2013 Aufgabe 1 In der Vorlesung wurde die dezentrale Deadlockerkennung in verteilten Datenbanksystemen thematisiert. Dabei werden Warteinformationen zwischen den Stationen ausgetauscht. In der Vorlesung wurde dieses Vorgehen am Beispiel von zwei Stationen beschrieben. Zeigen Sie die Vorgehensweise, wenn der Zyklus sich über n Stationen erstreckt (wobei gilt 1 ≤ n ≤ Anzahl aller Stationen). Wieviele Nachrichten müssen ausgetauscht werden, damit ein Deadlock erkannt wird? Lösung Seien S1 . . . Sn die an einem Deadlock beteiligten Stationen mit den Transaktionen T1 . . . Tn . Station S1 berechnet seinen lokalen Wartegraphen und erhält E → T1 → T2 → E. Analog erhält S2 den Graphen E → T2 → T3 → E und so weiter. An Station Sn lautet der Graph E → Tn → T1 → E. Es liegt also ein Deadlock vor, an dem alle n Stationen beteiligt sind. Im Idealfall sendet S1 nun seinen Graphen an S2 , wo aus dem lokalen Graphen und dem von S1 erhaltenen Graphen der Graph E → T1 → T2 → T3 → E konstruiert wird. Danach übermittelt S2 seinen Graphen an S3 , wo der Graph E → T1 → T2 → T3 → T4 → E entsteht. Dies setzt sich fort bis zur Station Sn , die schließlich den Graphen E → T1 → T2 . . . Tn → T1 → E erzeugt und damit den Deadlock aufdeckt. Insgesamt wurden (n − 1) Nachrichten verschickt. Im Worst Case sendet Sn−1 ihren Graphen an Tn bevor sie den Graphen von Sn−2 erhalten hat. Der Graph von Sn−1 hat die Form E → Tn−1 → Tn → E. Sn kann daraus lediglich den Graphen E → Tn−1 → Tn → T1 → E erzeugen. Erst jetzt sendet Sn−2 ihren Graphen an Sn−1 . Diese wiederum erzeugt daraus den geänderten Graphen E → Tn−2 → Tn−1 → Tn → E und überträgt diesen an Sn . Pn−1 Setzt sich dies so fort, kann Sn den kompletten Wartegraphen erst nach i=1 i Nachrichten konstruieren. Dies enspricht einem asymptotischen Wachstum von O(n2 ). Aufgabe 2 In der Vorlesung wurden anhand einer ER-Modellierung von Polyedern die Nachteile relationaler Datenbanken diskutiert. 1 Geben Sie ein ODL-Schema für das Polyeder-ER-Modell aus der Vorlesung an. Verwenden Sie das relationship-Konstrukt zur Realisierung der Beziehungen. Benutzen Sie den Datentyp float für die Koordinatenwerte. Die Polyeder sollen außerdem die Attribute Material (string) und Gewicht (float) haben. Geben Sie allen Klassen eine Extension. Wenn Sie mehrere Alternativen zur Realisierung der Beziehungen erkennen, diskutieren Sie jeweils Vor- und Nachteile. Lösung class Polyeder (extent AllePolyeder) { attribute float Gewicht; attribute string Material; relationship set<Flaechen> seiten inverse Flaechen::seiteVon; }; class Flaechen (extent AlleFlaechen) { relationship Polyeder seiteVon inverse Polyeder:: seiten ; relationship set<Kanten> kanten inverse Kanten::kanteVon; }; class Kanten (extent AlleKanten) { relationship set<Flaechen> kanteVon inverse Flaechen::kanten; relationship set<Punkte> verbindet inverse Punkte::kanten; }; class Punkte (extent AllePunkte) { relationship set<Kanten> kanten inverse Kanten::verbindet; attribute float X; attribute float Y; attribute float Z; }; Aufgabe 3 In einem 3D-Zeichenprogramm soll eine photorealistische Darstellung von einigen der gespeicherten Objekte generiert werden. Dazu müssen zunächst für alle im Bildausschnitt vorkommenden Materialien die Texturen (Oberflächenbilder) geladen werden. Aufgabe 3 a) 2 Gegeben sei das relationale Schema für die Polyeder aus der Vorlesung. Formulieren Sie die folgende Anfrage in SQL: Ermittle alle Materialien jener Polyeder, die Punkte mit ” X- und Y -Koordinaten zwischen 0 und 100 haben.“ Lösung select from where c.material polyeder c, flaechen f, kanten k, punkte p p.x between 0 and 100 and p.y between 0 and 100 and (k.P1=p.PunktID or k.P2=p.PunktID) and (k.F1=f.FlaechenID or k.F2=f.FlaechenID) and f.PolyID=c.PolyID 3 Aufgabe 3 b) Formulieren Sie die Anfrage in OQL, mit dem ODL-Schema aus Aufgabe 1. Nutzen sie die relationships in Ihrem Schema aus, verwenden Sie z.B. möglichst einen Pfadausdruck! Lösung select from where f.seiteVon.material p in AllePunkte, k in p.kanten, f in k.kanteVon p.X>=0 and p.X<=100 and p.Y>=0 and p.Y<=100 oder select from where p.material p in AllePolyeder, f in p.seiten, k in f.kanten, v in k.verbindet v.X>=0 and v.X<=100 and v.Y>=0 and v.Y<=100 Aufgabe 4 Wie lässt sich die Objektidentität in einer objektorientierten Datenbank implementieren? Denken sie dabei insbesondere an den Objektidentifikator. Wie kann man sicherstellen, dass ein einmal vergebener Identifikator (OID) nicht wieder verwendet werden kann (dies muss während der gesamten Lebensdauer der Objektbank gelten)? Lösung Nach Kemper, Wimmer, Aufgabe 13.7 Prinzipiell gibt es zwei Ansätze: • physische OIDs und • logische OIDs. Die physische OID kodiert den Speicherort des identifizierten Objekts. Das geschieht über die ID des Speichermediums, der Seitenummer und Seitenposition. Die Seitenposition ist dann selbst ein Verweis auf den eigentlichen Speicherort innerhalb der Seite (slotted page). • Vorteil: Schneller Zugriff • Nachteil: Bei einer Datenbankreorganisation kann der Speicherort sich ändern (innerhalb der Seite wäre das kein Problem). In diesem Fall muss ein Platzhalter auf der Seite mit einer Referenz auf den neuen Speicherort eingefügt werden, damit die OID konstant bleibt. Dadurch entsteht eine weitere Indirektion (vgl. TID Konzept, overflow record). Des weiteren lässt sich die Wiederverwendbarkeit der OID nach erfolgter Löschung schwer verhindern. 4 Logische OIDs referenzieren den Speicherort nur indirekt und unterstützen Datenbankreorganisationen und Löschoperationen von vornherein. Die Auflösung der OID erfolgt über eine Indirektion, bei welcher der aktuelle Speicherort des Objektes ermittelt wird. Dazu werden Indexstrukturen wie B-Bäume oder Hash-Tabellen verwendet. Ein weiteres Verfahren für logische OID wurde als direct mapping bekannt. Hier wird ein Objekt-Handle eingeführt, dessen Speicheradresse in der OID kodiert wird (somit ist die OID mit einer Art physischer OID für das Objekt-Handle vergleichbar). Das Handle selbst ist ein Zeiger, welcher die tatsächliche Position des Objektes speichert. Handles werden in dem sogenannten Handle Segment abgelegt, welches als (erweiterbares) Array implementiert ist. Im Detail besteht die OID aus einer System-ID, einer Seiten-ID, dem Slot auf der Seite und dem eindeutigen Abschnitt. Über die System-ID, Seiten-ID und die Slot-ID wird somit das zuständige Handle im Handle Segment bestimmt. Der eindeutige Abschnitt ist nicht Teil der Referenz sondern verhindert eine Wiederverwendbarkeit der OID. Er ist im Wesentlichen ein Zähler, der Aktualisierungen in der Datenbasis unterstützt und ungültige Verweise (dangling references) von gültigen zu unterscheiden hilft. Soll ein Handle wiederverwendet werden, wird dann einfach der Zähler inkrementiert, wodurch die Eindeutigkeit der OID gewährleistet wird. 5