XML-Dokumente in objektrelationalen Datenbanksystemen Meike Klettke Universität Rostock [email protected] www.xml-und-datenbanken.de 1 Ein Titel ... und ein Untertitel XML-Dokumente in objektrelationalen Datenbanksystemen – Möglichkeiten in DB2 und Oracle, Kombination von XQuery und SQL, hybride Speicherung Motivation XML als Format zur Dokumentdarstellung existiert seit 10 Jahren als Schlagwort sehr populär (gewesen) mittlerweile gibt es viele Anwendungen, die XML-Dokumente erzeugen oder verwenden häufig ist eine dauerhafte Speicherung notwendig Datenbanksysteme wurde erweitert, um XML-Dokumente verarbeiten zu können ... in der Vorlesung heute ... Erweiterungen von Datenbankmanagementsystemen, um XMLDokumente zu speichern, anzufragen und zu verändern, dazu 1. Realisierung in objekt-relationalen Datenbanksystemen 1. 2. 3. 2. Speicherung Anfragen in DB2 und Oracle Updates und Schemaevolution Einsatz und Verwendung dieser Speicherungsvarianten Hybride Ansätze nachricht: <nachricht id="ID0001" bedeutung="4"> <autor autor_id="A0001"> <nachname>Fürst</nachname> <vorname>Christian</vorname> <agentur>dpa</agentur> <e-mail>[email protected]</e-mail> </autor> <einordnung> <rubrik>Mozartjahr 2006</rubrik> … <inhalt> <ueberschrift>Ein Vermarktungsfest </ueberschrift> <text>Als Wolfgang Amadeus Mozart im Alter von 35 Jahren starb, .. </text> </inhalt> </nachricht> id bedeutung autor inhalt ID0001 4 A0001 P0001 autor: ID autor_id nachname Vorname x00001 A0001 Fürst Christian <inhalt> <ueberschrift>Ein Vermarktungsfest </ueberschrift> <text>Als Wolfgang Amadeus Mozart im Alter von 35 Jahren starb, .. </text> </inhalt> für daten- als auch dokumentzentrierte Anteile Auswahl unterschiedlicher Speicherungsmethoden für verschiedene Dokumentanteile ... 3) Realisierung in objektrelationalen Datenbanken verschiedene Speicherungsmöglichkeiten werden unterstützt: Speicherungsmöglichkeiten bei Oracle: DB2: Abbildung nach Ulrike Schwinn, Oracle Realisierung in objektrelationalen Datenbanken Abbildung: DB2, aus einem Artikel von Holger Seubert 3.1) Verwenden des XML-Typs XML als nativer Datentyp, kann einzelnen Attributen zugeordnet sein Beispiel: create table nachricht ( id integer not null primary key, titel varchar(30) not null, autor varchar(30) not null, datum date, agentur varchar(10), text xml, kontext xml ); also hybride Speicherung Werte einfügen insert into nachricht values(1, 'Ein Vermarktungsfest', 'Christian Fürst', '2006-12-12', 'dpa', '<text>Als Wolfgang Amadeus Mozart im Alter von 35 Jahren starb, war er bettelarm. Jetzt, zu seinem 250. Geburtstag, zeigen insbesondere österreichische PR-Experten, wie man mit dem Namen des Salzburger Genies Millionen machen kann... </text>', '<einordnung> <ort> <land>Österreich</land> <stadt>Salzburg</stadt> <stadt>Wien</stadt> </ort> <zeit> ... </zeit> <rubrik>Festakte</rubrik> <kategorie>Mozart</kategorie> <kategorie>Musik</kategorie> <kategorie>Kultur</kategorie> </einordnung>'); es erfolgt: Test auf Wohlgeformtheit Gültigkeitstest beim Einfügen von Werten Test auf Gültigkeit ist möglich: dazu Schemazuordnung REGISTER XMLSCHEMA http://www.informatik.uni-rostock/~meike/testschema_text.xsd FROM /users/db01/meike/public_html/testschema_text.xsd AS text_schema COMPLETE; insert into nachricht values(1, 'Ein Vermarktungsfest', 'Christian Fürst', '2006-12-12', 'dpa', XMLVALIDATE ( XMLPARSE(document '<text>Als Wolfgang Amadeus Mozart im Alter von 35 Jahren starb, war er bettelarm. Jetzt, zu seinem 250. Geburtstag, zeigen insbesondere österreichische PR-Experten, wie man mit dem Namen des Salzburger Genies Millionen machen kann... </text>' ) ACCORDING TO XMLSCHEMA ID text_schema)), ... ); 3.2) Anfragen Anfragesprache für relationale: SQL Anfragesprache für XML-Dokumente: XQuery Anfragemöglichkeiten (Kombination dieser Anfragen): SQL SQL mit eingebettetem XQuery XQuery XQuery mit eingebettetem SQL Verwendung von build-in-functions zum Zugriff auf die XML-Anteile bzw. SQL-Anteile Zugriff auf die XML-Anteile über build-in-functions innerhalb von SQL-Anweisungen Dazu verfügbare build-in-functions (für die Einbettung von XQuery in SQL): xmlquery xmlexists xmltable ... Ergebnis der build-in-functions: Relation (xmltable) oder Wert (contains, xmlexists, xmlquery) XML-Element (XMLELEMENT) XML-Attribut (XMLATTRIBUTE) Relationale Anfragen /1 select * from nachricht; select titel, text from nachricht; Liefert als Ergebnis: TITEL TEXT -----------------------------------------------------------Ein Vermarktungsfest <text>Als Wolfgang Amadeus Mozart im Alter von 35 Jahren starb, ... </text> Mozartjahr eröffnet <text>Mit einem Fest für Mozart haben Salzburg und Wien am ... </text> Relationale Anfragen /2 In den Anfragen werden XML-Attribute nur als “Ganzes” behandelt, das heißt vollständig ausgegeben oder vollständig in Bedingungen verglichen Will man Bedingungen an die XML-Attribute formulieren, lässt sich die Funktion contains einsetzen, Beispiel: select titel from nachricht where contains(text, 'Mozart')=1; DB2 Net Search Extender muss dafür verfügbar sein, unterstützt werden: Schlüsselwortsuche, Stammwortsuche, fuzzy search in 37 Sprachen, .. SQL mit eingebetteten XQueryAnfragen /1 select titel, xmlquery( 'for $e in $i/einordnung/ort/stadt/text() return $e' passing kontext as "i ") as Ortsbezug from nachricht; Ergebnis: TITEL -------------------Ein Vermarktungsfest ORTSBEZUG ------------------------------Salzburg Wien Augsburg Mozartjahr eröffnet Salzburg Wien Augsburg SQL mit eingebetteten XQueryAnfragen /2 Verwendet wird also eine Funktion xmlquery, die als Eingabeparameter eine XQuery-Anfrage hat, weiterer Parameter beschreibt die Belegung einer XQuery-Variablen mit einem Datenbankattribut Ergebnis der Funktion ist ein Wert (String), der als Attribut ausgegeben wird XQuery-Anfragen /1 xquery for $e in db2-fn:xmlcolumn('NACHRICHT.KONTEXT') where $e/einordnung/ort/stadt/text()="Wien" return $e; Anmerkung: Großschreibung der Bezeichnungen NACHRICHT und KONTEXT notwendig, sonst werden Relation und Attribut nicht gefunden XQuery-Anfragen /2 Ergebnis: 1 ----------------------------------------------------------<einordnung><ort><land>Österreich</land><land>Deutschland</ land><stadt>Salzburg</stadt><stadt>Wien</stadt><stadt>Augsb urg</stadt></ort><zeit><datum>2006-0127</datum></zeit><rubrik>Festakte</rubrik><kategorie>Mozart </kategorie><kategorie>Musik</kategorie><kategorie>Kultur</ kategorie></einordnung> <einordnung><ort><land>Österreich</land><land>Deutschland</ land><stadt>Salzburg</stadt><stadt>Wien</stadt><stadt>Augsb urg</stadt></ort><zeit><datum>2006-0127</datum></zeit><rubrik>Festakte</rubrik><kategorie>Mozart </kategorie><kategorie>Musik</kategorie><kategorie>Kultur</ kategorie></einordnung> XQuery-Anfragen /3 xquery for $e in db2-fn:xmlcolumn('NACHRICHT.KONTEXT') where $e/einordnung/ort/stadt/text()="Wien" return $e; Innerhalb dieser Anfrage ist eine Funktion zu sehen: db2-fn:xmlcolumn, Hat als Parameter die Angaben zu (Owner.)Relation.Attribut Liefert den Inhalt des Attributes als Ergebnis, es muss ein Attribut vom Typ XML sein XQuery-Anfragen /4 Verwendung eines etwas komplexeren Beispiels mit Pfadausdrücken xquery for $e in db2-fn:xmlcolumn('NACHRICHT.TEXT')[person/text()= "Wolfgang Amadeus Mozart"] return $e; Ergebnis: 1 --------------------------------------------------<text>Jedes Jahr ist Mozartjahr. ... Aber nicht um isoliertes, unreflektiertes Feiern des 250. Geburtsjahres <person>Wolfgang Amadeus Mozart</person> sollte und durfte es beim WIENER MOZARTJAHR 2006 gehen, sondern um einen neuerlichen Versuch, sich dem „Wunder Mozart“ (Goethe) von verschiedenen Seiten zu nähern und gleichzeitig, mit seiner Hilfe, ... </text> XQuery mit eingebetteten SQLAnfragen man kann auch Anfragen stellen, die XQuery-Anfragen sind und über build-in-functions auf relationale Anteile zugreifen dazu jetzt ein Beispiel XQuery mit eingebetteten SQLAnfragen xquery for $n in db2-fn:sqlquery("select einordnung from nachricht where agentur='dpa‘ ") where $n[//land/stadt/text()="Wien"] return $n; Ergebnis: 1 ----------------------------------------------------<einordnung><ort><land>Österreich</land><land>Deutschland</ land><stadt>Salzburg</stadt><stadt>Wien</stadt><stadt>Augsb urg</stadt></ort><zeit><datum>Freitag, 27. Januar 2006</datum><uhrzeit>String</uhrzeit><zeitzone>String</zeit zone></zeit><rubrik>Festakte</rubrik><kategorie>Mozart</kat egorie><kategorie>Musik</kategorie><kategorie>Kultur</kateg orie></einordnung> Auch möglich: Verwendung von XQuery zur Anfrage relationaler Daten xquery for $x in db2-fn:sqlquery ("select XMLELEMENT(NAME ""headline"", XMLATTRIBUTES(id AS ""id""), titel) from nachricht") for $y in db2-fn:sqlquery ("select XMLELEMENT(NAME ""nachrichtenagentur"", XMLATTRIBUTES(id AS ""id""), agentur) from nachricht") where (contains($x/text(), 'Mozart')) and (contains($y/text(), 'spiegel')) and ($x/@id=$y/@id) return <klassiknachricht>{$x} </klassiknachricht>; Verwendung von XQuery zur Anfrage relationaler Daten /2 Ergebnis: 1 ---------------------------------------------<klassiknachricht><headline id="2">Mozartjahr eröffnet</headline></klassiknachricht> Verwendung von SQL Verwendung: Zur Anfrage relationaler Attribute Soll XML-Attribut als Ganzes ausgegeben werden und ist zur Suche auf den XML-Attributen Volltextsuche ausreichend dann eignet sich diese Variante Nicht realisierbar: Anfragen auf den XML-Attributen (XPath, XQuery) Verwendung von SQL mit eingebettetem XQuery Verwendung: überwiegend relationale Daten und wenig XMLFunktionalität, die ergänzt werden muss geeignet, wenn Anfragen gleichzeitig auf relationale Daten und XML-Daten zugreifen wenn Volltextsuchanfragen notwendig sind wenn Entwickler SQL bevorzugen Verwendung von XQuery Verwendung: reine XML-Anwendungen verfügbare XQuerys können mit nur geringen Änderungen (db2-fn:xmlcolumn() statt collection() ) verwendet werden wenn das Ergebnis XML sein soll kann joins zwischen XML-Dokumenten ausdrücken bisher keinen Volltextunterstützung keine Verwendung von user-defined functions Verwendung von XQuery mit eingebettetem SQL effizient bei Verwendung auf XML-Daten, ineffizient, wenn relationale Daten und XML-Daten zusammen ausgewertet werden Volltextsuche möglich (über contains) keine Joins zwischen relationalen Attributen und XML-Attributen Oracle: XML-Unterstützung /1 XMLType statt XML Anfragen ebenfalls über Funktionen realisiert, andere Bezeichnungen: ExtractValue extract existsNode im Create Table kann einem XML-Attribut ein Schema zugeordnet sein Oracle: XML-Unterstützung /2 Update von XML-Dokumenten ist hier möglich, Funktionen dazu: UpdateXML insertChildXML insertXMLbefore appendChildXML deleteXML im Fall einer Schemazuordnung: partielle Validierung Umsetzung der Schemaevolution bei Oracle Oracle: Schemaevolution seit Version 10g: Speicherung der XML-Dokumente als CLOB: Schemaevolution hat keine Auswirkungen, neue und alte Dokumente werden in der gleichen Relation/ im gleichen Attribut gespeichert Objektrelationale Speicherung: 2 Fälle: Alte Struktur soll neben der neuen weiterexistieren = Versionierung Anschließend existieren beide Speicherungsformen in der DB (zum Beispiel in 2 Relationen) Neue Struktur soll alte ersetzen Dokumente entladen, transformieren, neu laden in Oracle 10 automatisiert, Eingabeparameter: neues Schema und XSL-Stylesheets Schemaevolution in DB2 neue Version des Schemas als neues Schema registrieren Bestimmen, welche Attribute mit dem alten Schema validiert wurden: select xmlxsrobjectid(kontext) from nachricht where id=4; 1 -------------------11821949021857536 select objectname, schemaLocation from syscat.xsrobjects where objectid=11821949021857536; ----------------------------------------------------------------------------------------------EINORDNUNG_SCHEMA3 http://www.informatik.uni-rostock/ /~meike/testschema_einordnung3.xsd Update dieser Dokumente und Revalidieren mit dem neuen Schema Zusammenfassung Vorstellung der gegenwärtig vorhandenen Methoden zur Speicherung und Anfrage von XML-Dokumenten in DB2 und Oracle Schwerpunkt: verschiedene Varianten zur Anfragerealisierung weiterhin gezeigt: XML-Dokumentvalidierung bei Insert und Update offene Punkte im Bereich XML-Update und XMLSchema-Evolution Systeme, hybrid Hybride Speicherungsverfahren werden durch Datenbanksysteme unterstützt, die mehrere Speicherungsmöglichkeiten für XML-Dokumente anbieten. Oracle Speicherung eines XMLType in relationalen Datenbanken Anfragen realisierbar DB2 Speicherung von XML-Dokumenten als Attribut vom Typ XML in relationalen Datenbanken Anfragen realisierbar Updates bisher nur Austausch der gesamten XMLDokumente 5) Verwendung dieser Methoden Verwendung von XML-Typen in Datenbanken Verwendung der Anfragevarianten Verwendung der Validierung Verwendung der Updatefunktionen XML-Schemaevolution Literatur www.ibm.com Matthias Nicola, Fatma Ozcan: pureXML in DB2 9: Which way to query your XML data? http://www.ibm.com/developerworks/db2/library/techarticle/dm0606nicola/, Juni 2006 Holger Seubert: XML-Indizierung, Update und SchemaVerwaltung mit DB2 9, http://entwickler.de/zonen/portale/psecom,id,101,online,1037,p,0.h tml www.oracle.com Ulrike Schwinn (Oracle): XML in der Oracle Datenbank „relational and beyond“, BTW 2003