c c c c c c c c c c c c c c c c c c c c INSTITUT FÜR INFORMATIK DER TECHNISCHEN UNIVERSITÄT MÜNCHEN LEHRSTUHL III · DATENBANKSYSTEME · PROF. DR. GRUST Übungen zur Vorlesung “Database Supported XML Processors” Wintersemester 2005/2006 · Jens Teubner ([email protected]) 3. Übungsblatt Ausgabe: 2. November 2005 · Besprechung: 10. November 2005 Aufgabe 1: Relationale XPath-Auswertung Aufgrund ihrer hervorragenden Skalierbarkeit liegt es nahe, relationale Datenbanksysteme auch zur Speicherung von (baumstrukturierten) XML-Dokumenten zu verwenden. Ein naheliegender Ansatz dazu ist der folgende: • Jeder Knoten im XML-Dokument wird mit einem eindeutigen Schlüsselwert identifiziert. • Zu jedem Knoten im Baum speichern wir ausserdem den Schlüsselwert des entsprechenden Vaterknotens. Der Wurzelknoten trägt dabei als einziger einen Nullwert. 0a– 1b0 5f 0 6g5 2c 1 3d 2 4e2 7h5 8i 7 9j 7 id 0 1 2 3 4 5 .. . parent – 0 1 2 2 0 .. . tag a b c d e f .. . Die document order läßt sich in einer solchen Codierung geschickt implementieren, indem man z. B. die Schlüsselwerte wie im Beispiel als fortlaufende Werte realisiert. Der Einfachheit halber nehmen wir im folgenden an, dass unsere XML-Dokumente nur aus Element-Knoten bestehen. In der relationalen Codierung speichern wir dabei zu jedem Element seinen Tagnamen. Die relationale Codierung soll nun für die Auswertung von XPath-Anfragen herangezogen werden. Betrachten Sie dabei die folgenden Anfragen: (1) v /child::node()/child::h (2) v /child::node()/descendant::node() (3) v /child::node()/descendant::j (4) v /child::b/following-sibling::node() (5) v /descendant::h/ancestor::node() Der Kontext-Knoten v sei dabei ein beliebiger Knoten, dessen id-Wert Sie kennen. Wie können die obigen Anfragen mit Hilfe dieser relationalen Codierung ausgewertet werden? (a) Formulieren Sie die vier XPath-Anfragen als SQL-Anfragen auf der relationalen Codierung. Berücksichtigen Sie dabei auch die Semantik von XPath (document order und Duplikatfreiheit). (b) Das Datenbanksystem wird verschiedene Zugriffstechniken zur Auswertung verwenden. Nehmen Sie an, das System kennt ausschließlich die folgenden drei Operationen: (bitte wenden) lookup-by-id(n) Liefert das Tupel mit dem id-Wert n zurück. lookup-by-parent(n) Gibt eine Liste aller Tupel zurück mit dem parent-Wert n. lookup-by-tag(t) Bestimmt eine Liste der Tupel mit dem tag-Wert t. Wie lassen sich die obigen Anfragen mit Hilfe dieser drei Operationen berechnen? Schätzen Sie den Aufwand für jede Anfrage, indem Sie die Anzahl benötigter Operationen ermitteln. Die erste Anfrage könnte zum Beispiel wie folgt ausgewertet werden: C1 ← lookup-by-parent(parent(v )); foreach c1 in C1 do C2 ← lookup-by-parent(parent(c1 )); foreach c2 in C2 do if tag(c2 ) = h then append c2 to result;