DBS IIb SS03 mit XML
Transcrição
DBS IIb SS03 mit XML
4 XML und Datenbanken XML wird von Internet Explorer ab Version 5.0 und von Netscape ab Version 6 unterstützt. XML-Datenbanken mit der Anfragesprache XQuery sind z.B. Tamino von der Software AG (erste kommerzielle Implementierunmg von XQuery in Version 4.1, Dez. 2002) und IBM DB2-Xperanto (geplant für 1. Halbjahr 2003). 4.1 XML als Dokumentbeschreibungssprache Die Grundidee von Dokumentbeschreibungssprachen (markup language) ist die unabhängige Beschreibung von • Struktur (z.B. Kapitel, Unterkapitel, Absätze), • Inhalt (der eigentliche Text, Bilder) und • Aussehen (z.B. Textschrift, Textstil, Textgröße, Position des Bildes) eines Dokuments. Dafür wurde schon 1986 SGML (standard generalized markup language) genormt. Von SGML leiten sich sowohl HTML (hypertext markup language) als auch XML (extensible markup language) (www.w3.org/XML/) ab. XML wurde 1996 von einer Arbeitsgruppe unter Jon Bosik entwickelt und ist seit 1998 eine Empfehlung (recommendation) des World Wide Web Consortiums (W3C). XML dient zur Strukturierung, Speicherung und Austausch –nicht zur Darstellung– von Information. Ein XML-Dokument tut nichts (führt keine Anweisungen aus). XML basiert auf Unicode; daher sind in XML-Dokumenten viele Zeichen erlaubt, deutsche Umlaute genauso wie chinesische Zeichen. Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 179 Einschub: Unicode Die Zeichenmenge Unicode hat zum Ziel, alle auf der Welt gängigen Schriften und Zeichen zu umfassen. Die ersten 128 Zeichen von Unicode stimmen mit US-ASCII überein; die ersten 256 Zeichen entsprechen ISO-8859-1 (Latin-1), dem Zeichensatz für die meisten europäischen Sprachen. Ein Code aus Unicode wird mit der Notation U+xxxx geschrieben; dabei ist xxxx eine vierstellige Hexadezimalzahl. Z.B. steht U+0020 für ein Leerzeichen, U+000A ist der Zeilenumbruch (line feed) und U+20AC für das €-Symbol. Zwei gängige Codierungen von Unicode sind UTF-8 und UTF-16. In UTF-8 werden alle Codes kleiner als 128 in einem Byte codiert (damit ist jeder US-ASCII-Text auch UTF-8 codiert), andere Zeichen mit zwei, drei oder vier Bytes. In UTF-16 werden alle Codes kleiner als 65536 in zwei Bytes codiert, alle anderen Zeichen mit vier Bytes. Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 180 Einschub: Unterschiede zwischen XML und HTML • XML wurde zur Beschreibung von Daten entworfen, HTML zur Darstellung von Daten. • Elemente sind in HTML vordefiniert, in XML müssen sie erst definiert werden. • In XML haben alle Elemente eine Endmarke. In HTML gibt es Elemente ohne Endmarke (z.B. <HR>) oder mit optionaler Endmarke (z.B. <P>). • XML unterscheidet –anders als HTML– bei Elementen und Attributen zwischen Groß- und Kleinschreibung. • Argumente von Attributen müssen stets in Anführungsstriche gesetzt werden; in HTML sind Anführungsstriche nur notwendig, wenn das Argument Sonderzeichen enthält. • Mehrere Leerzeichen werden in XML nicht –wie in HTML– zu einem Leerzeichen zusammengefasst. • Eine neue Zeile wird in XML stets –wie in Unix– durch ein LF (line feed) dargestellt, nicht durch ein CR (carriage return) –wie im Mac OS– oder durch CR LF –wie in Windows–. • Ein fehlerhaftes XML-Dokument wird nicht bearbeitet, ein fehlerhaftes HTML-Dokument wird dagegen i.d.R. –oft sogar richtig– angezeigt. • XML basiert auf Unicode; Umlaute können daher direkt statt des umständlichen ä bzw. ß dargestelt werden. Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 181 4.1.1 Elemente und Attribute Ein XML-Dokument ist in XML-Elemente gegliedert. Ein Element wird durch Marken (tags) begrenzt; Marken werden in spitze Klammern eingeschlossen, um sie vom normalen Text zu unterscheiden: <XXX>. Der Name der Marke XXX darf Buchstaben, Ziffern und Sonderzeichen enthalten, aber nicht mit einer Ziffer, einem Sonderzeichen oder XML (in allen Groß- und Kleinschreibvarianten) beginnen. Einige Zeichen ( - . : ) können manchmal zu Komplikationen führen und sollten daher nicht im Namen enthalten sein. Da die Attribute einer Datenbank oft mit den Elementen eines XML-Dokuments korrespondieren, sollte man auch die Namensregeln des Datenbanksystems berücksichtigen. Ein Element beginnt mit einer Anfangsmarke einer Endmarke </XXX>. <XXX> und endet stets mit Dazwischen liegt der Inhalt (content) des Elements; der Inhalt kann aus einfachem Text und/oder weiteren Elementen bestehen, er kann auch leer sein. Elemente können dadurch hierarchisch geschachtelt werden. Anfangsmarken können ein oder mehrere XML-Attribute enthalten, die durch Zwischenraum getrennt werden. Ein Attribut kann ein Argument haben, das direkt nach dem Attribut und einem Gleichheitszeichen –stets in doppelte oder einfache Anführungsstriche eingeschlossen– angegeben wird, z.B. <XXX YYY="zzz">. Ein leeres Element, d.h. ein Element mit Anfangsmarke, leerem Inhalt und Endmarke: <XXX YYY="zzz"> </XXX> darf auch kurz <XXX YYY="zzz"/> geschrieben werden (auch ohne Attribute). Die Reihenfolge der Elemente in einem Dokument, die Dokumentenreihenfolge (document order), hat oft eine Bedeutung. Dagegen ist die Reihenfolge der Attribute in einer Anfangsmarke stets irrelevant. Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 182 In XML sind die Marken nicht vordefiniert wie in HTML, sondern müssen in einer Dokumenttypdefinition (DTD, document type definition) oder einem XML Schema definiert werden. XML-Dokumente sind erweiterbar; das Hinzufügen von neuen Elementen stört vorhandene Anwendungen nicht. Ein XML-Dokument besteht aus • einem (optionalen) Prolog, • einer (optionalen) DTD oder Schema und • einem einzigen Element, dem Wurzelelement, das weitere Elemente enthalten kann. Außerdem können (ungeschachtelte) Kommentare <!-- text --> und Verarbeitungsanweisungen (processing instruction) <? anweisung ?> vorkommen. Beispiel: <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE note SYSTEM "order.dtd"> <!-- über dieser Zeile steht eine externe DTD --> <order> <customer>Schmidt</customer> <position> <isbn>1-234-56789-0</isbn> <number>2</number> <price currency="Euro">30.00</price> </position> </order> Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 183 Ein XML-Dokument kann vorteilhaft als Baum dargestellt werden: order customer position Schmidt isbn number price 1-234-56789-0 2 30.00 @currency Euro Die Kinder eines Element(knoten)s können z.B. Text-, Element- oder Attrributknoten sein. Attributknoten sind hier mit dem Präfix @ gekennzeichnet. Die Baumdarstellung legt folgende Redeweise nahe: • Das erste Element eines XML-Dokuments heißt Wurzelelement. • Bei geschachtelten Elementen heißt das äußere Element Elternelement, das innere Element Kindelement. Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 184 Die gleichen Daten können in Attributen oder als Kindelement gespeichert werden. <person sex="female"> <firstname>Anna</firstname> <lastname>Smith</lastname> </person> <person> <sex>female</sex> <firstname>Anna</firstname> <lastname>Smith</lastname> </person> Da Attribute insbesondere keine strukturierten Werte enthalten können und nicht einfach erweiterbar sind, sind Kindelemente i.d.R. (außer für künstliche Schlüssel) vorzuziehen. Eine Faustregel ist: Daten sollten durch Elemente dargestellt werden, Metadaten durch Attribute. Ein XML-Dokument heißt wohlgeformt (well-formed), wenn es syntaktisch korrekt ist. Am Anfang des Dokuments nennt man dazu die XML-Version und den verwendeten Zeichensatz: <?xml version="1.0" encoding="ISO-8859-1"?> Ein XML-Dokument heißt gültig (valid), wenn es semantisch korrekt ist, d.h. zu den Regeln seiner DTD oder seinem XML Schema passt. Dazu gibt man am Anfang des Dokument den Dateinamen der DTD an: <!DOCTYPE note SYSTEM "order.dtd"> In der DTD sind insbesondere die Namen der definierten Elemente angegeben. XML-Dokumente sollten validiert werden (z.B. www.w3schools.com/dom/dom_validate.asp), da sie sonst nicht bearbeitet werden können. Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 185 Texte, die vom XML-Prozessor unverändert als textueller Inhalt (nicht als Marke!) übernommen werden sollen, können als CDATA-Abschnitt gekennzeichnet werden. <![CDATA[ text ]]> CDATA-Abschnitte lassen sich nicht schachteln. Formatanweisungen (entities) dienen zur Formatierung einzelner Zeichen. Sie werden durch die Zeichen & und Semikolon ; geklammert. In XML sind folgende fünf Entities vordefiniert: lt (für <), gt (für >), amp (für &), quot (für ") und apos (für '). Analog kann man z.B. das Unicode-Zeichen U+00FF hexadezimal als ÿ oder dezimal als ÿ schreiben. Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 186 4.1.2 Kanonische Form von XML-Dokumenten In XML kann dieselbe Information auf verschiedene Art syntaktisch formuliert werden: • • • • • • • • • Ein leeres Element kann auf zwei verschiedene Arten notiert werden. Ein Attributwert kann in einfache oder doppelte Anführungszeichen eingeschlossen werden. Die Attributreihenfolge ist beliebig. Attributwerte können über eine Vorbelegung oder durch explizite Zuweisung auf denselben Wert gesetzt werden. Die Kodierung von XML-Dokumenten kann unterschiedlich sein. Ein Zeichen kann direkt, als dezimale Zeichenreferenz oder als hexadezimale Zeichenreferenz dargestellt sein. Daten können in oder außerhalb von CDATA-Abschnitten vorliegen. Für denselben Namensraum können verschiedene Kürzel verwendet werden. Namensraumdefinitionen können redundant und/oder an verschiedenen Stellen vorgenommen werden. Diese syntaktische Vielfalt erschwert es festzustellen, ob zwei Dokumente logisch äquivalent sind. Für diesen Zweck führt man die kanonische Form von XML-Dokumenten (Canonical XML) ein, indem bestimmte Regeln auf Elemente, Attribute, Namensräume etc. angewendet werden, z.B.: • Alle Wertebelegungen (z.B. durch Vorbelegung) werden zu expliziten Attributen. • Die Attribute eines Elements werden alphabetisch sortiert. Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 187 4.2 Beschreibung der Datenbankwerte in XML Eine relationale Datenbank (als Menge von Mengen von Tupeln) kann z.B. wie folgt in XML modelliert werden: <db> <relation1> <tupel-relation1> <attribut1>Wert1</attribut1> <attribut2>Wert2</attribut2> … </tupel-relation1> <tupel-relation1> <attribut1>Wert1</attribut1> <attribut2>Wert2</attribut2> … </tupel-relation1> … </relation1> <relation2> … </relation2> … </db> Eine logische Datenbank (als Menge von Grundfakten) kann z.B. in XML wie folgt modelliert werden: <db> <grundfakt1> <attribut1>Wert1</attribut1> <attribut2>Wert2</attribut2> … </grundfakt1> <grundfakt2> … </grundfakt2> … </db> Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 188 4.3 Vokabular und Schema Im Gegensatz zu HTML sind in XML die Typen der Elemente nicht vorab festgelegt, die in einem Dokument vorkommen können. Insbesondere müssen die Namen der Elemente und der Attribute, das Vokabular, festgelegt werden. Im einfachsten Fall geschieht dies –ohne Schema– durch Benutzung der Elemente und Attribute im (wohlgeformten) XML-Dokument selbst. Stets müssen folgende Eindeutigkeitsbedingungen erfüllt sein: • Die Namen der Elementtypen müssen innerhalb des Dokuments eindeutig sein. • Die Namen der Attribute müssen innerhalb eines Elements eindeutig sein. Systematischer kann die Festlegung des Vokabulars durch eine Schemadefinition geschehen: • durch eine Dokumenttypdefinition –wie generell in SGML– oder • durch ein XML Schema Dokument. Jedes XML Dokument bestimmt aber (im Gegensatz zu Datenbanken) selbst, ob und falls ja, welches Schema es hat. Natürlich können mehrere Dokumente das gleiche Vokabular benutzen. Dazu beziehen sich die Dokumente –am einfachsten– auf die gleiche (externe) DTD oder XML Schema-Definition. Manchmal möchte man sogar in einem Dokument verschiedene Vokabulare (vielleicht sogar mit z.T. gleichen Namen und verschiedener Bedeutung) benutzen. Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 189 Mengen von Namen können zu Namensräumen zusammengefasst werden: Ein Namensraum (name space, ns) ist eine URI (z.B. eine URL). In einem Dokument wird innerhalb eines Elements mit dem Attrribut xmlns auf einen Namensraum verwiesen: xmlns:kürzel="datei" Dabei wird für einen Namensraum ein Kürzel festgelegt, das nur innerhalb dieses Dokuments gültig ist. Alle Element- und Attributnamen, die dieses Kürzel als Präfix haben, beziehen sich auf diesen Namensraum. Das Kürzel und der eigentliche Name werden durch einen Doppelpunkt getrennt; insgesamt entsteht ein qualifizierter Name: [kürzel : ] lokaler_Name Der Namensraum mit dem leeren Kürzel (ε) (default name space) xmlns="datei" gilt für alle Elementnamen ohne Präfix; nicht jedoch für Attributnamen. Der Gültigkeitsbereich einer Namensraumdefinition ist das Element, in dem die Namenraumdefinition steht mit allen Unterelementen, sofern dort das Kürzel nicht umdefiniert wird. Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 190 4.4 Dokumenttypdefinition (DTD) Eine (interne) Dokumenttypdefinition hat folgenden Rahmen: <!DOCTYPE Dokumenttypname [ … ]> In einer Dokumenttypdefinition können Elementtypen und Attributtypen beschrieben werden. Die Reihenfolge der Definitionen in der DTD spielt keine Rolle. Alle Definitionen in der DTD sind global. 4.4.1 Elementtypen Bei der Definition eines Elementtyps wird sein Name und –eingeschlossen in runden Klammern– sein möglicher Inhalt festgelegt. <!ELEMENT name (content)> Der Inhalt (content) kann aus Zeichenketten (#PCDATA (parsed character data)) oder Elementtypen bestehen oder leer (EMPTY) sein. Beispiel: <!ELEMENT artikel (name, hersteller)> <!ELEMENT name (#PCDATA)> <!ELEMENT hersteller (#PCDATA)> Ein Element vom Typ artikel hat name und hersteller als Unterelemente. Dabei gibt es folgende Strukturierungsmöglichkeiten zur Beschreibung des Inhalts: • Eine Liste (sequence) von Elementtypen element1, element2, …, elementn beschreibt, dass ein Elementtyp genau n Unterelemente hat, die genau einmal und in der vorgegebenen Reihenfolge vorkommen. • Eine Auswahl (choice) von Elementtypen element1 | element2 | … | elementn beschreibt, dass ein Elementtyp ein Unterelement hat, entweder element1 oder element2 … oder elementn. Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 191 Die Häufigkeit des Auftretens von Unterelementen kann durch Postfixe festgelegt werden (analog zur regulären Ausdrücken): • ein Unterelement darf höchstens einmal angegeben werden (0–1): ? • ein Unterelement kann beliebig oft angegeben werden (0–n): * • ein Unterelement muss mindestens einmal angegeben werden (1–n): + Beispiele für die Häufigkeit der Unterelemente B eines Elements A: für eine (0,1)-Häufigkeit: <!ELEMENT A (B?)> für eine (0,n)-Häufigkeit: <!ELEMENT A (B*)> für eine (1,1)-Häufigkeit: <!ELEMENT A (B)> für eine (1,n)-Häufigkeit: <!ELEMENT A (B+)> für eine (2,5)-Häufigkeit: <!ELEMENT A (B, B, (B, (B, B?)?)?)> Beispiel: <!ELEMENT Anschrift (((Straße, Hausnr?) | Postfach), PLZ, Ort)> Eine Anschrift kann aus Straße und evtl. Hausnummer oder aus einem Postfach bestehen; in beiden Fällen müssen zusätzlich Postleitzahl und Ort angegeben sein. Direkte oder indirekte Rekursion ist möglich. <!ELEMENT Knoten (Knoten*)> Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 192 4.4.2 Attributtypen Schließlich können in der DTD auch die für ein Element zulässigen Attribute definiert werden. In einer Attributliste kann man mehrere Attributtypen eines Elements definieren: <!ATTLIST elementname attrname Typ Häufigkeit/Vorbelegung attrname Typ Häufigkeit/Vorbelegung … > Beispiel: Ein Attributtyp status wird definiert, das als Wert drei Konstanten annehmen kann (Standardwert ist normal). <!ATTLIST artikel status (normal|neuheit|angebot) "normal"> Folgende Typen kann man in einer Attributliste verwenden. • Zeichenketten (CDATA), • den Identifikatortyp ID. Die Werte aller ID-Attribute müssen im Dokument eindeutig sein (selbst wenn es sich um verschiedene Attribute handelt), • den Referenztyp auf den Identifkatortyp IDREF (bei Listen von Referenzen IDREFS), • ein einzelnes Token (eine Folge von Buchstaben, Zahlen und bestimmten Sonderzeichen, aber ohne Leerzeichen) NMTOKEN (name token) (bei Listen von Token NMTOKENS), • Aufzählungstypen, deren einzelne Werte durch senkrechten Strich getrennt und in runde Klammern eingeschlossen sind und die Token sein müssen. Außerdem kann man noch Angaben zur Häufigkeit und Vorbelegung machen. Da derselbe Attributname innerhalb eines Elements höchstens einmal vorkommen darf, bleibt bzgl. der Häufigkeit nur zu klären, ob ein Attribut vorkommen muss oder nicht. • #REQUIRED bedeutet, dass das Attribut vorkommen muss; in allen anderen Fällen ist das Attribut optional. • #IMPLIED bedeutet, dass das Attribut keinen Vorbelegungswert hat, falls es nicht angegeben wird. • "Vorbelegungswert" bedeutet, dass das Attribut diesen Vorbelegungswert hat, falls es nicht angegeben wird. • #FIXED bedeutet, dass der Attributwert als Konstante angesehen wird. Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 193 Verweise innerhalb desselben Dokuments können mit Hilfe von Attributen des Typs IDREF erfolgen. Das Verweisziel benötigt ein Attribut des Typs ID. Beispiel: <!ELEMENT <!ATTLIST <!ELEMENT <!ATTLIST … artikel (name, beschreibung?)> artikel id ID #REQUIRED> bestellposition (name, anzahl, gesamtpreis)> bestellposition artikel IDREF #REQUIRED> <artikel id="01"> <name>Bohrmaschine</name> <beschreibung> … </beschreibung> </artikel> … <bestellposition artikel="01"> <name>Bohrmaschine</name> <anzahl>1</anzahl> <gesamtpreis>299</gesamtpreis> </bestellposition> Diese Verweise können nicht typisiert werden, d.h. man kann bei einem IDREF-Attribut nicht angeben, zu welchem Elementtyp das referenzierte IDAttribut gehört.. 4.4.3 Entitydefinitionen In einer DTD können als Entities auch häufig genutzte Textbausteine definiert werden: <!ENTITY SGDH "Sehr geehrte Damen und Herren,"> Auch binäre Daten, wie z.B. Bilder, können als Entity definiert werden: <!ENTITY Ziege SYSTEM "Bilder/Ziege.gif" NDATA gif> Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 194 4.5 XML Schema XML Schema bietet –allgemeiner als DTDs– Möglichkeiten zur • Verwendung von Datentypen, • Strukturierung durch komplexe Datentypen, Kardinalitäten und Elementdeklarationen, • Spezifikation von Integritätsbedingungen (Eindeutigkeit, Schlüssel, Fremdschlüssel), • Wiederverwendung (Schemadokumentation, Modularisierung, Erweiterung). Außerdem entspricht ein XML Schema-Dokument –im Gegensatz zur DTD– der XML-Syntax. Das Vokabular von XML Schema wird festgelegt durch den Namensraum http://www.w3.org/2001/XMLSchema (oft mit dem Präfix xs). In unseren Beispielen verzichten wir aus Platzgründen auf die Angabe dieses Präfixes. Schema-bezogene Attribute aus dem Namensraum http://www.w3.org/2001/XMLSchema-instance dürfen in jedem XML-Dokument stehen (oft mit Präfix xsi). Insbesondere die Einbettung einer Schemadefinition erfolgt für einen XMLTeilbaum mit Hilfe dieses Namensraums: <marke xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" xsi:schemaLocation="Namensraumdefinition"> bzw. ohne Namensraumdefinition <marke xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" xsi:noNameSpaceSchemaLocation="file:…"> Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 195 Wie bei einer Dokumenttypdefinition gibt es auch in XML Schema Konstrukte für die Deklaration von Elementen und Attributen: • <element name="elementName" type="typName" /> • <attribute name="attrName" type="typName" /> Für Attribute und für Elemente mit einfachen Typen können Standardwerte mittels default vergeben werden. Konstante Werte können als fixed gekennzeichnet werden. Attribute haben stets einen einfachen Typ. Bei Attributen kann festgelegt werden, ob sie wahlweise (use="optional") angegeben werden können oder stets erforderlich sind (use="required"). Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 196 4.5.1 Datentypen in XML Schema XML Schema unterscheidet zwischen einfachen und komplexen Typen. Die Werte einfacher Typen bestehen aus nur einem Textknoten (PCDATA). Elemente mit Unterelementen können durch komplexe Typen beschrieben werden. XML Schema beschreibt einfache Typen durch • ihren Wertebereich (value space), • ihre Repäsentation (lexical space) in XML-Dokumenten und • ihre (fundamentalen und einschränkenden) Eigenschaften (facet). Fundamentale Eigenschaften wie Gleichheit, Ordnung, obere und untere Schranken, Kardinalität sind unveränderlich. Einschränkende Eigenschaften können zur Ableitung neuer Typen benutzt werden. 4.5.1.1 Einfache Datentypen in XML Schema Einfache Typen in XML Schema sind (neben Listen- und Vereinigungstypen) folgende atomare Typen: • Der Typ Boolean umfasst die Werte "true" und "false" (ohne Ordnung). • Der Typ String bescheibt Zeichenketten mit Zeichen aus dem kompletten Unicode-Zeichenvorrat. Eine Ordnungsrelation ist nicht festgelegt, da sie sprachabhängig wäre, aber für Anwendungen definierbar. • Der Typ anyURI ist der Typ für Uniform Resource Identifier wie URLs. • diverse numerische Datentypen: Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 197 decimal integer nonPositiveInteger nonNegativeInteger negativeInteger positiveInteger double (64 Bit) long unsignedLong (–263…263–1) (0…264–1) float (32 Bit) (–231…231–1) int unsignedInt (0…232–1) short unsignedShort (–215…215–1) (0…216–1) byte (–27…27–1) unsignedByte (0…28–1) Die oberen Datentypen haben einen unbegrenzten Wertebereich zur Beschreibung von Zahlen mit beliebiger Genauigkeit, bei den unteren Datentypen ist der Wertebereich begrenzt. Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 198 • Ebenso gibt es vielfältige temporale Datentypen zur Beschreibung von Zeitpunkten, wiederkehrenden Zeitpunkten und Zeitdauern: Zeitpunkte dateTime wiederkehrende Zeitpunkte Zeitdauer time duration (HH:MM:SS.SSSS[ZHH:MM]) ([–]PnYnMnDTnHnMnS) date (CCYY–MM–DD) gMonthDay (– –MM–DD) gYearMonth (CCYY–MM) gMonth (– –MM– –) gYear (CCYY) gDay (– – –DD) Die Repräsentation für den Typ dateTime ist CCYY-MM-DDTHH:MM:SS.SSSSZHH:MM CC steht dabei für das Jahrhundert, YY für das Jahr, MM für den Monat, DD für den Tag, HH für die Stunden (0-23), MM für die Minuten, SS.SSSS für die Sekunden(bruchteile) und HH:MM für die Zeitzonendifferenz (ggf. mit Vorzeichen). Weitere XML-spezifische einfache Datentypen sind • normalizedString (Zeichenketten ohne Zeilenumbrüche und Tabulatoren), • token (Zeichenketten ohne Zeilenumbrüche, Tabulatoren, keine Leerzeichen am Anfang und Ende sowie mehrfache Leerzeichen sonst), • language (Typ für die zweibuchstabigen Standardsprachidentifikatoren (ISO 639)), • Name (Typ für alle in XML erlaubten Bezeichner), NCName (für alle erlaubten Namensraumbezeichner), QName (für alle Bezeichner mit einem Namensraumpräfix), Notation (für alle Notationsbezeichner), Entity (für alle Entitätsbezeichner), • ID und IDREF(S) sind Typen für die Schlüssel bzw. Fremdschlüssel. Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 199 4.5.1.2 Durch Einschränkungen abgeleitete einfache Datentypen Durch einschränkende Eigenschaften können –ausgehend von einem Basistyp– neue einfache Typen definiert werden mit der gleichen Ordnung und Repräsentation, aber kleinerem Wertebereich. Folgende Einschränkungen (restriction) stehen zur Verfügung: • enumeration gibt eine Menge von abschließend aufgezählten Werten vor, • length, minLength, maxLength legt bei Zeichenketten die (exakte, minimale, maximale) Anzahl der (Unicode-)Zeichen fest, bei Listen die Anzahl der Listenelementen, • minInclusive, minExclusive, maxExclusive, maxInclusive legt bei numerischen Typen Unter- bzw. Obergrenzen fest; mit xxxInclusive lassen sich abgeschlossene Intervalle, mit xxxExclusive offene Intervalle beschreiben, • totalDigits, fractionDigits legt bei numerischen Datentypen mit beliebiger Genauigkeit Beschränkungen für die maximale Anzahl der Ziffern bzw. für die Anzahl der Nachkommastellen fest, • pattern beschreibt bei Zeichenketten den Wertebereich durch einen regulären Ausdruck (Perl-ähnlich), • whiteSpace beschreibt den Umgang mit Leerraum. Die Option preserve lässt Leerraum unverändert, durch die Option replace werden Tabulatoren und Zeilenumbruch durch ein Leerzeichen ersetzt, collapse bewirkt, dass führende, mehrfache und endständige Leerzeichen entfernt werden. Beispiele: Ein Typ Währung soll beliebig große Beträge, aber nur zwei Nachkommastellen zulassen: <simpleType name="waehrung"> <restriction base="decimal"> <fractionDigits value="2" /> </restriction> </simpleType> Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 200 Ein Typ Telefonnummer soll internationale Telefonnummern im Format +Landeskennzahl (Ortskennzahl) Anschluss zulassen (d steht für Ziffer): <simpleType name="telefonnummer"> <restriction base="string"> <pattern value="\+\d+\(\d+\)\d+" /> </restriction> </simpleType> Ein Typ Bundesland soll nur die deutschen Bundesländer zulassen: <simpleType name="bundesland"> <restriction base="string"> <enumeration value="Baden-Württemberg" /> <enumeration value="Bayern" /> … </restriction> </simpleType> Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 201 4.5.2 Komplexe Typen Komplexe Typen sind erforderlich, falls ein Element Attribute, Kindelemente oder einen leeren Inhalt haben soll. Definitionen von komplexen Typen beginnen mit dem complexTypeElement. Um die Kindelemente festzulegen, werden innerhalb der Definition Typkonstruktoren verwendet. • Durch den Typkonstruktor sequence wird ein kartesisches Produkt von Elementtypen definiert. Ein Element dieses Typs ist dann eine (geordnete) Liste der angegebenen Elemente. • Durch den Typkonstruktor choice wird eine Vereinigung von Elementtypen definiert. Ein Element dieses Typs ist dann ein Element eines dieser Elementtypen. • Durch den Typkonstruktor all wird festgelegt, dass bestimmte Elemente vorkommen müssen, aber in beliebiger Reihenfolge. Innerhalb des all-Konstruktors sind keine weiteren Konstruktoren erlaubt und keine wiederholbaren Elemente. Die Typkonstruktoren sequence und choice können beliebig geschachtet werden, der Konstruktor all ist nur auf der obersten Ebene zulässig. Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 202 4.5.2.1 Kardinalitäten Für jedes Element kann festgelegt werden, wie oft ein Element auftreten darf. Die Attribute minOccurs und maxOccurs können als Werte natürliche Zahlen annehmen oder den Wert unbounded (∞). Insbesondere lässt sich so festlegen, ob ein Element optional (minOccurs=0) und/oder wiederholbar (maxOccurs>1) ist. Der Standardwert für minOccurs und maxOccurs ist 1 ! Beispiel: <complexType name="Katalog"> <sequence> <element name="Eintrag" type="Katalogelement" /> minOccurs="0" maxOccurs="unbounded" /> </sequence> </complexType> <complexType name="Katalogelement"> <sequence> <element name="name" type="string" /> <element name="beschreibung" type="string" minOccurs="0" maxOccurs="1" /> </sequence> <attribute name="katalogElementID" type="integer" /> </complexType> Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 203 4.5.2.2 Abgeleitete komplexe Typen Von einem komplexen Typ können weitere komplexe Typen abgeleitet werden, einerseits durch Einschränkung der Instanzen (restriction), andererseits als Erweiterung durch Hinzufügen weiterer Elemente (extension). Aus der Beziehung zwischen abgeleiteten Typen und ihren Basistypen entsteht eine Ableitungshierarchie. Da nur jeweils ein Basistyp angegeben werden kann, gibt es keine Mehrfachvererbung: die Typen bilden einen Baum. Dabei gilt jeder komplexe Typ als von anyType abgeleitet, jeder einfache Typ als von anySimpleType. Die Restriktion eines Typs ist durch folgende Einschränkungen möglich: • Verschärfung der Kardinalitäten: Durch Heraufsetzen von minOccurs oder Herabsetzen von maxOccurs werden für den abgeleiteten Typ weniger Instanzen zugelassen. • Attributvorkommen: Ein –im Basistyp optionales– Attribut wird (durch use="prohibited") weggelassen. • Attributwert: Dem Attribut wird ein Standardwert oder ein konstanter Wert zugeordnet. • Festlegen von Typen, falls für ein Element noch kein Typ festgelegt war. Oder Ersetzen eines einfachen Typs durch eine Einschränkung dieses Typs. • Wegfall von Oder-Knoten. Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 204 Bei der Erweiterung eines Basistyps können neue Attribute und Elemente (hinten) angehängt werden: Beispiel: <complexType name="Artikel"> <extension base="Katalogelement"> <element name="hersteller" type="string" /> <element name="lieferzeit" type="duration" /> <element name="bild" type="anyURI" /> <element name="stückpreis" type="währung" /> </extension> </complexType> Die Einschränkung und Erweiterung eines Typs können durch Setzen des Attributs final in der Typdefinition verhindert werden: • final="restriction" verbietet weitere Einschränkungen, • final="extension" verbietet weitere Erweiterungen, • final="#all" verbietet beides. Das Attribut abstract="true" verhindert, dass ein Typ direkt, also ohne abgeleitet worden zu sein, verwendet wird. Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 205 4.5.3 Integritätsbedingungen Schlüsseleigenschaften sichern zu , dass eine bestimmte Attributkombination (ohne Nullwerte!) nur ein einziges Mal vorkommt. Fremdschlüssel verweisen auf den (existierenden!) Schlüssel eines Gegenstands. 4.5.3.1 Nullwerte Nullwerte drücken aus, dass für ein bestimmtes Element kein Wert vorhanden ist. Auf Typebene kann ein Nullwert zugelassen werden oder nicht, indem bei dem entsprechenden Element das Attribut nillable auf true oder false gesetzt wird. Einem Element kann dann ein Attribut nil (xsi:nil="true") hinzugefügt werden. 4.5.3.2 Schlüssel- und Eindeutigkeitsbedingungen In XML Schema besteht eine Schlüsseldeklaration aus drei Teilen: • dem Kontext, in dem die Schlüsseleigenschaft gelten soll; das ist das Element, wo der Schlüssel definiert wird, • der Selektor, der eine Menge von Knoten definiert, die durch den Schlüssel eindeutig identifizierbar sein sollen, und • eine Menge von Feldern (Elemente und Attribute), die den Identifikator für jeden der selektierten Knoten festlegen. <element name="kontext"> … <key name="Schlüsselname"> <selector xpath="Selektor" /> <field xpath="Schlüsselattribut1" /> <field xpath="Schlüsselattribut2" /> … </key> </element> Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 206 Beispiel: Personen sind an Hand ihres Namens, Vornamens und Geburtsdatums eindeutig identifizierbar. <complexType name=PersonTyp"> <element name="name" type="string" /> <element name="vormane" type="string" /> <element name="geburtsdatum" type="date" /> <element name="adresse" type="adressTyp" /> </complexType> <element name="personen"> <complexType> <sequence> <element name="person" type="PersonTyp" minOccurs="0" maxOccurs="unbounded" /> </sequence> </complexType> <key name="personenschlüssel"> <selector xpath="person" /> <field xpath="name" /> <field xpath="vorname" /> <field xpath="geburtsdatum" /> </key> </element> Ersetzt man key durch unique, so ist die spezifizierte Attributkombination ebenfalls eindeutig, darf aber Nullwerte enthalten. Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 207 4.5.3.3. Fremdschlüsselbedingungen Die Fremdschlüsseldefinition ist ähnlich wie die Schlüsseldefinition: <element name="kontext"> … <keyref name="Fremdschlüsselname" refer="Schlüsselname"> <selector xpath="Selektor" /> <field xpath="Fremdschlüsselattribut1" /> <field xpath="Fremdschlüsselattribut2" /> … </keyref> </element> Die Reihenfolge der Fremdschlüsselattribute muss dabei zur Reihenfolge der Schlüsselattribute passen. Brüggemann, Vorlesungsnotizen zu Datenbanksysteme IIb, Uni Hannover, Sommersemester 2003 208