Wieso speichert man XML? XML Repositories Web Informationssysteme Wintersemester 2002/2003 Donald Kossmann • • • • • • • Cache (z.B. Web Proxies) Dokumentenmanagementsysteme, Web Site Protokollierung von Business Prozessen Metadaten, Kataloge, Indexe Zwischenergebnis der Anfragebearbeitung Archivierung von Dokumenten Wissenschaftliche Daten (Messreihen) XML im „Äther“ bleibt wichtigstes Szenario! Klassische Anforderungen an DB (nach Kemper / Eickler) • • • • • • • Vermeidung von Redundanz, Inkonsistenzen Mächtige Zugriffsmöglichkeiten Mehrbenutzerbetrieb Dauerhaftigkeit der Daten, Robustheit Prüfung von Integritätsbedingungen Sicherheit Skalierbarkeit Man braucht nicht immer alles. Es ist aber schön, nicht darüber nachdenken zu müssen! Reines XML • • • • Beispiel: Normale Dateien im Filesystem (Alternativ: in DB als BLOB -> siehe später) Referenzierung über „Dateinamen“ (oder URI) Zusätzliche Indexe mit speziellen Tools möglich – Insbesondere Schlüsselwortsuche • Besonders relevant für folgende Anwendungen – Cache, Web Site, Archivierung • Zusätzliche Verbesserung durch Komprimierung • Schätzung: 70 Prozent Marktanteil Übersicht • Reines XML – Evtl. komprimiert – Evtl. indexiert • Spezielle (interne) Repräsentation – (DOM) Baum – Token Stream • (Objekt-) Relationaler Datenbank – – – – – XML als BLOB SQL/XML Geschredded (generisch) DTD / Schema Mapping (XML Sicht auf relationale Daten) Komprimierung • Jedes klassische Verfahren anwendbar – Z.B. Lempel-Ziv oder Huffman-Codierung • Xmill: Besseres Verfahren; nutzt XML Struktur – Grundidee: Trenne Daten -> geringere Enthropie – Trenne Daten und Struktur in Containern komprimiere Tags im speziellen Container – Gruppiere Daten nach Typ (z.B. Integer, Namen, ...) – Verwende spezielle Kompressionsalgos für Container z.B. gzip für strings; Nullsuppression für Integer • Vorsicht – Komprimierung nur für große Dokumente (> 20 KB) – Konflikt zwischen Komprimierung und Indexierung (?) 1 Xmill Architektur Xmill Beispiel XML <book price=„69.95“> <title> Die wilde Wutz </title> <author> D.A.K. </author> <author> N.N. </author> </book> Parser Path Processor Cont. 1 Cont. 2 Cont. 3 Cont. 4 Compr. Compr. Compr. Compr. – Codierung der Tags (Dictionary Compression): book = #1, @price = #2, title = #3, author = #4 – Codierung des Inhaltes: ints in C1, strings in C2 – Codierung der Struktur (/ für Endtags): gzip( #1 #2 C1 #3 C2 / #4 C2 / #4 C2 / / ) Komprimiertes XML Bewertung Indexierung • Index ist Abbildung Wert -> XML Instanz • Für XML verschiedene Arten von Indexen • Vermeidung von Redundanz, Inkonsistenzen • Mächtige Zugriffsmöglichkeiten – Abhängig von Indexierung und Tools evtl. okay – Siehe Kapitel 7 • Mehrbenutzerbetrieb • Dauerhaftigkeit der Daten, Robustheit • Problem: Zeiger auf XML Instanz. • Identifiziere einen Knoten oder Wert durch – – – – – – Bei niedriger Updaterate; sonst schlecht URI des Dokumentes Start Offset im Dokument Ende Offset im Dokument (alternativ Länge) Schön: IDs drücken Eltern-Kind Beziehungen aus Schlecht: Physische IDs bei Updates • • • • (DOM) Bäume • Speichere XML Dokument als Baum – Geordnet und annotiert • Beliebteste Schnittstelle zur Navigation: DOM – W3C Standard, viele Tools, sehr beliebt bei Apache – Aber Vorsicht: DOM und Xquery DM beißen sich • Vorteile – DOM als stabile Schnittstelle (Formatänderungen möglich) – Updates einfach zu implementieren • Nachteile – DOM schwergewichtiges Interface (-> Performance) – Pipelining nicht einfach – Serialisierung für Speicherung auf Platte teuer (oder schwer) Prüfung von Integritätsbedingungen Sicherheit Skalierbarkeit, Performance Kosten Document Object Model (DOM) • • • • • Erstes vom W3C standardisierte Datenmodell Drei Level ... Sehr beliebt in der Apache Community Verwendet im Internet Explorer (ab V 5.0) Repräsentiert XML als Baum – Beliebte Repräsentation von XML (s. Kapitel 5) • API zur Navigation im Baum • Schwergewichtig 2 Bewertung <person, id = 4711> <name> Lilly Potter </name> person <child> <person, id = 314> <name> Harry Potter </name> </child> name person 4711 child Lilly Potter James Potter person 314 name </person> <person, id = 666> <name> James Potter </name> 666 name Harry Potter <child> 314 </child> • • • • • • • • Vermeidung von Redundanz, Inkonsistenzen Mächtige Zugriffsmöglichkeiten Mehrbenutzerbetrieb Dauerhaftigkeit der Daten, Robustheit Prüfung von Integritätsbedingungen Sicherheit Skalierbarkeit, Performance Kosten (?) - viele public domain tools Man kann mit DOM ein „Baum DBMS“ bauen. Aber ich glaube nicht, dass es einfach wird, gute Performance zu kriegen. </person> Natix • Repräsentiere Dokument als Baum Referenzen auf Kinder, Vater, Geschwister • Speichere Bäume in Blöcke auf Festplatte • Mehrere Bäume (Dokumente) pro Block möglich • Große Dokumente - Prinzip von B-Bäumen – Splitte falls Dokument größer als Block – Halte Proxies für Teilbäume im Wurzelblock Proxy hält Referenz auf einen Teilbaum im Kindblock – Speichere Teilbäume in jedem Kindblock – (Baum von Blöcken ist allerdings nicht balanciert) Token Stream • Grundidee: XML als Folge von Tokens – Z.B. ein Token für die Zahl „3“ – Z.B. ein Token für <book> – Z.B. ein Token für END ELEMENT. • Verwende einen eventbasierten Parser (z.B. SAX) – Events werden direkt in Tokens übersetzt • Vorteile – Sehr kompakte Repräsentation (Objektsharing!!!) – Pipelining sehr gut unterstützt • Nachteile – Schwierig zu debuggen, sensibel bei Formatänderung (man sieht nicht ganzes Element, schlechte Kapselung) Natix <bib> <book> <title>...</title> <author>...</author> </book> </bib> bib book title author DM <-> Token Stream • Document Knoten [BEGIN DOC] ... Content ... [END DOC] – Content ist Repräsentation von PIs, Wurzelelement, Kommentaren und Texten • Text Knoten [BEGIN TEXT] [CharData] [END TEXT] – [CharData] trägt den Inhalt als Zeichenkette • Kommentar [BEGIN COMMENT] [CharData] [END TEXT] • Processing Instruction [BEGIN PI] [QName] [CharData] [END PI] – [QName] repräsentiert einen qualifizierten Namen („prefix“ vom Typ URI und „localname“ als Zeichenkette) • Namespace Knoten [BEGIN NS] [QNAME] [END NS] 3 Element Knoten [BEGIN ELEM] [QName] [QName] Namespaces Attributes (Elements | Comments | PIs | Text)* typed-value* [END ELEM] • 1. Qname: (qual.) Namen des Elementes • 2. Qname: (qual.) Namen des Typs des Elementes • <code>007</code> Attribute Knoten [BEGIN ATTR] [Qname] [Qname] [CharData] [typed-values]* [END ATTR] • Namen und Typen wie beim Element • „string-value“ als Zeichenkette • <... hobby = „Fußball Hockey Lesen“ ...> [BEGIN ELEM] [code] [element of int] [BEGIN TEXT] [CharData(„007“)] [END TEXT] [Int(5)] [END ELEM] [BEGIN ATTR] [hobby] [string*] [CharData(„Fußball Hockey Lesen“)] [string(„Fußball“)] [string(„Hockey“)] [string(„Lesen“)] [END ATTR] Komprimierung, Mergen Identifikatoren • Qnames kann man „sharen“ – – – – Wichtig für Dokumente mit vielen gleichen Elementen Halte nur Zeiger auf Name und Typ MM: Spart Speicher und CPU für Object Allocation Disk: Dictionary Compression • „End“ Tokens sind statische Objekte – Erneut nur Zeiger anstatt ganzes Token notwendig – MM: Spart Speicher und CPU für Object Allocation – Disk: Spezielles (kurzes) END Symbol wie bei Xmill • Mergen der Qnames in [BEGIN ELEM/ATTR] – Spart keinen Speicher – Spart CPU bei Iteration durch den Tokenstrom • Optionaler Teil eines „Begin“ Tokens – N.B. ohne IDs sind „Begin“ Tokens statische Objekte • Aufbau eines Identifikators – – – – Code des Dokumentes (Ordnung auf Dokumenten) Präfixnummer im Dokumentenbaum Postfixnummer im Dokumentenbaum Zeiger auf Vater • Verwendung von Ids in Anfragebearbeitung – Sortieren in Dokumentorder, Prädikate auf Ordnung – Parent, Ancestor, Root Axes Abbildung auf Blöcke auf Platte B+ Baum für Suche nach ID • Zerhacke TokenStream in Blöcke • (Alternative: Organisation alla Natix) • Optional: Speichere zusätzliche Referenzen 5 – Begin -> End (für Geschwister, Insert at End) – Begin -> Parent (für Reverse Traversal) – (Verzeigerung zu Kindern implizit) 3 3 • Optional: Verwende B+ Baum für Ids 1 2 3 4 5 6 7 8 4 Bewertung B+ Baum für Suche nach ID • • • • • • • • 6 3 1 2 3 3 4 5 6 7 8 9 Vermeidung von Redundanz, Inkonsistenzen Mächtige Zugriffsmöglichkeiten Mehrbenutzerbetrieb Dauerhaftigkeit der Daten, Robustheit Prüfung von Integritätsbedingungen Sicherheit Skalierbarkeit, Performance Kosten (?) Ich habe es gebaut. Es funktioniert! XML ungleich Relational XML in Relationalen DBs • XML als BLOB • XML als Datentyp (SQL/XML) • Generische Ansätze (shredding) – Edge Ansatz, Binary Ansatz, Inlining, ... – XML Triple • Mapping von DTDs • • • • • Name Harry Potter Age 12 Child NULL Hobby ? James Potter NULL ? NULL Lilly Potter NULL ? NULL viele NULL Werte Probleme mit Kollektionen (mehrere Hobbies) Verschachtelung vs. IDREFs wie behandelt man neue Elemente (z.B. Adresse) XML Elemente vs. Attribute, Reihenfolge XML als BLOB create table web page ( url varchar(100), xmlcontent blob); • DB weiß nicht, dass sie XML speichert • Keine Queryfunktionalität, keine Indexierung – Anwendung, Middleware macht die Arbeit – Keine Integritätsbedingungen • • • • Zugriff in Granularität ganzer Dokumente Speichere reines XML oder Token Stream Dauerhaftigkeit, Robustheit, Sicherheit: okay Marktanteil (geschätzt): ca. 25 Prozent SQL/XML create table web page ( url varchar(100), xmlcontent XML); • Derzeitige ISO (SQL) Standardisierungsinitiative – Besonders von Oracle gepusht – http://otn.oracle.com/tech/xml/xmldb/htdocs/sql_xml_codeexamples.html • Idee: XML als Datentyp für Spalte – XML Schemata importierbar • Besondere Syntax für Konstruktoren, Xquery Ausdrücke • Die Version, die ich kenne, noch unausgereift! (03/2002) • Wird aber kommen! 5 XML Beispiel Shredding <person, id = 4711> • Idee: Zerlege XML in seine Einzelteile – Abbildung: XML -> Graph – Speichern der Knoten und Kanten in Tabellen <name> Lilly Potter </name> <child> <person, id = 314> • Übersetze Anfrage nach SQL – Abbildung: XML Anfrage -> Graph – Implementierung der Kanten durch Joins in SQL – Tagger in Middleware erzeugt XML • Gutes Preis/Leistungsverhältnis – – – – – Sehr einfacher, generischer Ansatz für jedermann Indexierung möglich (Werte, Struktur und Text/Schlüsselworte) Ausnutzung der TA und Querymöglichkeiten von RDBMS Anfragen auf XML und relationale Daten möglich Aber: nicht optimal und passt nicht zu XQuery • Hat den „Test of Time“ nicht bestanden! <person, id = 4711> person <child> <person, id = 314> </child> Lilly Potter </person> <person, id = 666> <person, id = 666> <name> James Potter </name> <child> 314 </child> Speichern eines Graphen Edge Approach person <name> James Potter </name> i314 person 314 name 666 name James Potter Harry Potter <child> 314 </child> </person> Binary Approach Partitioniere die Edge Tabelle nach Label Target 4711 666 314 </person> </person> 4711 name child <name> Harry Potter </name> Person Tabelle <hobby> Quidditch </hobby> </child> 0 <name> Lilly Potter </name> Source 0 0 i314 <name> Harry Potter </name> Name Tabelle Source 4711 666 314 Target v1 v2 v3 Child Tabelle Source Target 4711 i314 666 i314 Age Tabelle Source Target 314 v4 Edge Table Source 0 0 4711 4711 666 666 Label person person name child name child Value Table (String) Target 4711 666 v1 i314 v2 i314 Id v1 v2 v3 Value Lilly Potter James Potter Harry Potter Value Table (Integer) Id v4 Value 12 Weitere Ansätze • Universal Approach OuterJoin aller „Binary Tables“ • Universal Normalized Approach besondere Behandlung von Kollektion • Inlining „Binary Tables“ OuterJoin „Value Tables“ • XML Triple: Codierung der Pfade • Mischformen und Varianten • Besonderheit aller Varianten – zusätzliche Felder für Reihenfolgetreue, Unterscheidung von Elementen und Attributen, etc. 6 XML Triple (R. Bayer) XML Anfragen • Finde den Namen aller Personen, die jünger als 18 sind und Quidditch als Hobby haben /persons[@age < 18 AND ./hobby = „Quidditch“]/name • Repräsentiere Anfrage als Graph + Überdeckung person Pfad Surrogat Value Author[1]/FN[1] 2.1.1.1 Rudolf Author[1]/LN[1] 2.1.2.1 Bayer name <18 XML-Anfragen -> SQL • Jede Kante in der XML Anfrage wird zu einem Join in der SQL Anfrage • Blätter in der XML Anfrage werden zu Joins mit der „Value Tabelle“ • // wird zu rekursiven SQL Anfragen • Optionale Prädikate werden zu Outerjoins • ... SELECT FROM WHERE Bewertung – Komplettes Xquery nur in Middleware • Mehrbenutzerbetrieb • Dauerhaftigkeit der Daten, Robustheit • Prüfung von Integritätsbedingungen – Nur in Middleware möglich • Sicherheit • Skalierbarkeit, Performance (ausreichend?) • Kosten (?) Einsatzgebiete noch unklar. Quidditch Beispiel (Edge Approach) Übersetzung kann automatisch realisiert werden ABER! Nur für einen Subset von Xquery untersucht • Vermeidung von Redundanz, Inkonsistenzen • Mächtige Zugriffsmöglichkeiten hobby age nv.value Edge p, Edge n, Edge h, Value nv, Value hv p.label = „person“ AND p.target = n.source AND n.label = „name“ AND n.target = nv.id AND p.target = h.source AND h.label = „hobby“ AND h.target = hv.id AND hv.value = „Quidditch“; DTD -> RDB Mapping • Lit.: Shanmugarsadaran et al. VLDB 1999 • Idee: Übersetze DTDs -> Relationen – – – – Elementtypen -> Tabellen Attribute -> Spalten Verschachtelung (= Beziehung) -> Tabellen „Inlining“, um Fragmentierung aufzuheben • Vorteile – Intuitiv (?), gute Performance • Nachteile – Nicht universell: ANY, XML Schema (?) • Keine Produkte bekannt; Leute machen es händisch 7 DTD Normalisierung • Vereinfache DTDs (rechte Seite von Elemtyp) (e1, e2)* -> e1*, e2* (e1, e2)? -> e1?, e2? (e1 | e2) -> e1?, e2? e1** -> e1* e1*? -> e1* e1?? -> e1? ..., a*, ... , a*, ... -> a*, .... • Grundlage – Gesetze regulärer Ausdrücke – Ordnung (Reihenfolge) ignorieren – Quantoren verallgemeinern (Obermenge repräsentieren) Beispiel: Relation „book“ <!ELEMENT book (title, author)> <!ELEMENT article (title, author*)> <!ATTLIST book price CDATA> <!ELEMENT title (#PCDATA)> <!ELEMENT author (fname, lname)> <!ELEMENT firstname (#PCDATA)> <!ELEMENT lastname (#PCDATA)> <!ATTLIST author age CDATA> Beispiel <!ELEMENT book (title, author)> <!ELEMENT article (title, author*)> <!ATTLIST book price CDATA> <!ELEMENT title (#PCDATA)> <!ELEMENT author (firstname, lastname)> <!ELEMENT firstname (#PCDATA)> <!ELEMENT lastname (#PCDATA)> <!ATTLIST author age CDATA> Beispiel: Relation „article“ <!ELEMENT book (title, author)> <!ELEMENT article (title, author*)> <!ATTLIST book price CDATA> <!ELEMENT title (#PCDATA)> <!ELEMENT author (fname, lname)> <!ELEMENT firstname (#PCDATA)> <!ELEMENT lastname (#PCDATA)> <!ATTLIST author age CDATA> book(bookID, book.price, book.title, book.author.fname, book.author.lname, book.author.age) article(artID, art.title) artAuthor(artAuthorID, artID, art.author.fname, art.author.lname, art.author.age) Alle weiteren Elementtypen XML-Anfrage -> SQL • Jeder Elementtyp -> Relation – Element könnte ja Wurzel sein! title(titleId, title) author(authorId, author.age, author.fname, author.lname) fname(fnameId, fname) lname(lnameId, lname) • Intuitive Vorgehensweise, Rekursion bei // – Viel weniger Joins als bei Shredding (!) • Titel der Artikel mit einem Autor jünger als 18 /article[author/@age < 18]/title SELECT a.title FROM article a, artAuthor aa WHERE aa.age < 18 AND a.artId = aa.artId; 8 DTDs mit Rekursion <!ELEMENT book (author)> <!ATTLIST book title CDATA> <!ELEMENT author (book*)> <!ATTLIST author name CDATA> Bewertung • Vermeidung von Redundanz, Inkonsistenzen • Mächtige Zugriffsmöglichkeiten – Komplettes Xquery nur in Middleware • Mehrbenutzerbetrieb • Dauerhaftigkeit der Daten, Robustheit • Prüfung von Integritätsbedingungen – Nur in Middleware möglich book(bookId, book.title, book.author.name) author(authorId, author.name) author.book(author.bookId, authorId, author.book.title) • Sicherheit • Skalierbarkeit, Performance (ausreichend?) • Kosten (?) Einsatzgebiete noch unklar. Fazit • Für einfache Anwendungen – Reines XML im Filesystem oder als BLOB in RDB • Für anspruchsvollere Anwendungen – Token Stream • Einsatz von relationalen Datenbanken – Politikum, Religionskrieg – RDBs ausgereifteste Technologie, aber passen nicht! – SQL/XML könnte der Akzeptanz helfen • Zusatzgimmics beachten Übungen • Wieso braucht man bei der Repräsentation von Attributen im TokenStream sowohl den „string-value“ als auch die „typed-values“. Geben Sie eine Beispielanfrage an. • Repräsentieren Sie unsere Bibliothek (aus Kapitel 1) als XML TokenStream. Speichern Sie die Bibliothek in Tabellen. • Bilden Sie folgende DTD ... auf ein relationales Schema ab. • Wie kann man aus einem XML Schema ein äquivalentes relationales Schema ableiten. Was unterscheidet bzgl. des Mappings XML Schema von DTDs? – Indexierung, Komprimierung, Verschlüsselung 9