Prof. Dr. rer.nat.habil. Bernhard Thalheim Information Systems Engineering Department of Computer Science Christian-Albrechts-University Kiel Olshausenstr. 40 D - 24098 Kiel Vorlesung Datenbanken I SS 2008 5. Komplex strukturierte DB 5 Komplex strukturierte Datenbanken 5.1 XML-Datenbanken Mit Hilfe von XML ist es möglich Daten zu strukturieren und in Form von XML-Dokumenten abzuspeichern. Die Struktur der Daten wird dabei mit Hilfe von XML-tags beschrieben. Aufgrund dieser Möglichkeit wird XML als Daten- bzw. Austauschformat im World Wide Web immer populärer. Die Dokumente können dann entweder im Dateisystem selbst oder in Datenbanken gespeichert werden. Kommerzielle Datenbanksysteme wie IBMs DB2 UDB bieten bereits den XML-Extender als Erweiterung an, mit dem es möglich ist XML Dokumente mit den Vorteilen eines Datenbankmanagementsystems zu verwalten. Auf die XML Informationen in den Datenbanken oder Dateisystemen könnten dann zukünftige Web-Server über XML Prozessoren zugreifen und diese z.B. mit Hilfe von HTML zur Präsentation graphisch aufbereitet werden. Von Electronic Data Interchange (EDI) erhofft man sich eine wichtige business application für XML. Firmen könnten mit Hilfe von EDI Daten über ihre Produkte und Dienstleistungen im WWW veröffentlichen. Und potentielle Kunden könnten diese Informationen automatisch vergleichen und auswerten lassen. Weiter könnten geschäftliche Partner interne, vertrauliche Daten über sichere Kanäle zwischen ihren Systemen austauschen oder sogenannte search robots könnten Daten verschiedenster Quellen, welche ihre strukturierten Daten in Form von XML anbieten, automatisch in eigene Anwendungen integrieren. Vorstellbar wären z.B. Aktienkurse von diversen Finanzseiten oder Sportdaten von verschiedenen Nachrichtenanbietern. Außerdem werden sich weitere Möglichkeiten ergeben, XML Daten auf verschiedenste Art und Weise zu integrieren, transformieren oder zu aggregieren. Hat sich XML erst einmal als Datenformat dauerhaft durchgesetzt, ist es leicht vorstellbar, daß viele Informationsquellen ihre Daten in XML Dokumente strukturieren und im Internet anbieten werden. Dann können Anwendungen wie EDI Wirklichkeit werden. Um Informationen aus einer Vielzahl von XML Dokumenten zu extrahieren, braucht man eine Anfragesprache. Diese soll strukturierte und inhaltsbezogene Anfragen ermöglichen, die als Ergebnis sehr genaue Informationen liefern und keine 15000 Treffer, die mit den gewünschten Informationen nicht viel gemeinsam haben, wie es bei heutigen Suchmaschinen keine Seltenheit ist. Demzufolge wurden gleich mehrere XML Anfragesprachen wie z.B. Lorel , XML-QL, XQL, YATL, XML-GL oder XSL entwickelt, die sich zum Teil stark unterscheiden. CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 2 XML - Alternative zur HTML-Strukturierung eXtensible Markup Language entstanden aus: MGML - minimal generalized markup language SIMPL - simple internet markup language in Spezialisierung von SGML Standardisierung 1997/1998 XML 1.0 “Erweiterung” von HTML start- und end-Bezeichner (evt auch / >) Erweiterungsprobleme von HTML Trennung von Struktur und Inhalt möglich (IR) neue Bezeichner definierbar <? XML version="1.0" ?> <spass> <brennt> Sage <quote> Gute Nacht</quote> Alf. </brennt> <anders> <quote> Gute Nacht, Alf. </quote></anders> </spass> <!- nur so zur Illustration --> Weiterentwicklung z.Z. in 2 committees: W3C mit partiell systematischen Hintergrund MS mit Firmen-Monopoly Euphorie in der “community” kaum eine Konferenz ohne XML auch wegen ASCII-Austausch CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 3 ISO 8879 (1986) Standard Generalized Markup Language (SGML) • Text Encoding Initiative TEI ähnlich breit wie Web • ISO 12083 Vereinheitlichung von elektronischen Manuskripten Textsorten: Bücher, Artikel, Periodika Einführung von DTD • umrankt von HyTime (Hypermedia and Time-based structuring language, ISO 10744, 1997) [für Verlinkung von multimedialen Dokumenten] (beliebige Dokumente mit hypermedialen Dokumenten ohne Strukturveränderung Lokation über Namenraum, sturkturelle Adressierung, semantische Adressierung, über Koordinatenraum XLink als vereinfachtes Linking-System XPointer zur Spezifikation relativer Knoten und Teilbäume und DSSSL (Document Style and Semantic Specification Language, ISO 10179, 1996) Erweiterungen und spezifische Anwendungen • TopicMaps (ISO 13250) (Topic Navigation Maps) als Architektur für Darstellung von thematischen Bezügen zwischen Informationsobjekten Formen: topicmap, topic, name, occur, assoc, assocrl, facet, fvalue • ICADD (International Committee for Accessible Document Design, 1991) für Sehbehinderte • Standard-DTD als Architekturen Ersatzpfad HTML • HyperText Markup Language über HyperText Transmission Protocol zur Beschreibung von Bildschirmseiten keine abstrakte inhaltliche Strukturierung des Textes, sondern nur formale Struktur eines Dokuments mit abstrakten Begriffen Nebenpfad Tex • D.E. Knuth in Wut über Textverarbeitung • Tex78, Tex 82 als public domain auf Web (Pascal-Dialekt) Trennung von Darstellungsinformation von Satzinformation mit eingelagertem Inhalt • LaTex als Programmiersprache der 4. Generation für Texte 1988 (L. Lamport) Text-Informationsverarbeitung Informationen als Text oder in hierarchischer Struktur evt. auch mit Verweisen CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 4 unterschiedliche Ebenen in Texten in Texten: geordnete Anordnung von abstrakten und konkreten Einheiten nahe am hierarchischen Datenbankmodell Buchstabenmengendeklaration i.a. UTB-8 oder UCS-2 <?XML <?XML ENCODING=’UTF-8’?> ENCODING=’EUC’-JP’?> Klassen für Buchstaben: Latin-1; Extended Latin-A, Latin-B; griechisch, koptisch, kyrillisch, armenisch, hebräisch, ... CAU Kiel, IfI, ISE 5.1.1 β SS 2008 Datenbanken I 5. Komplex strukturierte DB 5 Primäre Strukturierung in XML/SGML 2-Ebenen-Architektur für Informationseinheiten 1. Ebene der konkreten Daten 2. Ebene der abstrakten Einheiten (Zuordnung von Funktionen zu Daten bzw. Gruppierung) • Daten-Elemente für konkrete Daten • Container-Elemente mit Konstruktoren • Leere Elemente Datenelemente als Zeichenfolgen <!ELEMENT autor (#PCDATA)> # als vordefiniertes Schlüsselwort oft wird damit ‘Semantik’ vermutet es findet KEINE Integritätskontrolle statt Container-Elemente Konstruktoren • Tupel-Konstruktor <!ELEMENT buch (autor, titel, verlag, jahr)> • Wiederholungsausdrücke a Element genau einmal a? Element einmal oder keinmal a+ Element mindestens einmal a* beliebig oft <!ELEMENT buch (autor+, titel, verlag?, jahr?)> • Konnektoren a , b Sequenz a | b entweder-oder a & b erstes nach zweitem oder zweites nach erstem Element (SGML) β CAU Kiel, IfI, ISE SS 2008 Datenbanken I 5. Komplex strukturierte DB 6 Vorsicht vor Ambiguitäten <!ELEMENT a ((b, c) | (b, d))> <!ELEMENT a (b, (c | d )) > Hierarchisches Datenmodell <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT buch (autor+, titel, verlag?, jahr?)> autor (vorname+, familienname)> vorname (#PCDATA)> familienname (#PCDATA)> Leere Elemente <!ELEMENT autor ((vorname+, familienname) | unbekannt)> <!ELEMENT unbekannt EMPTY> Vorsicht vor implizit leeren Elementen <!ELEMENT katalog (buch)*> SGML erlaubt zusätzlich Exklusion/Inklusion komplette Teilbäume beliebig oft wiederholt bzw. vollkommen ausgeschlossen <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT a b c d (b, c) +(x) > (#PCDATA) > (b | d) > (#PCDATA) > <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT a b c d (x*, b, x*, c, x*)> (x | #PCDATA) > (x*, (b | d), x*)) > (#PCDATA) > e f g h (f, g) -(y) > (#PCDATA) > ((f, y?) | (h, y*))> (#PCDATA) +(y) > entspricht <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT können durch Normalisierung entfernt werden <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT e f g h (f, g) > (#PCDATA) > (f | h)) > (#PCDATA) > CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 7 Attribute als zusätzliche Strukturierung <!ATTLIST person geschlecht (m|f) #REQUIRED> unterschiedliche Werte-Integritätsbedingungen #REQUIRED: immer mit Wert belegt #IMPLIED: Zeichenkette auch optional ‘‘wert’’ : mit Wert <wert> vorbelegt #FIXED ‘‘wert’’ : Wert fest als Zeichekette vorgegeben #UNSPECIFIED: SGML - ohne Wert #CURRENT: SGML - zuletzt benutzter Wert der Geschwister Wertemengen für XML-Attribute #NAME: SGML-Zeichenkette #NUMBER: SGML-Zahl CDATA: beliebige Zeichenkette #NMTOKEN: XML/SGML-Wort (auch mit Ziffer beginnend) #NUTOKEN: SGML-Wort beginnend mit Ziffer <!ELEMENT person (name, funktion,adresse)> <!ATTLIST person geschlecht (m|w) #REQUIRED fakultaet (1|2|3|4) "1" geburtstag NMTOKEN #IMPLIED> <!ELEMENT adresse EMPTY> <!ATTLIST adresse strasse CDATA #REQUIRED nummer NMTOKEN #REQUIRED plz NMTOKEN #REQUIRED ort CDATA #REQUIRED > NDATA: weitere Datentypen als Notationen Name kann dann als Alias-Name weiterverwendet werden <!NOTATION GIF PUBLIC "+//ISBN 0-7923-9432-1::Graphic Notation//NOTATION CompuServe Graphic Interchange Format//EN"> Notation GIF mit Dokument “...” definiert, Verweis auf Beschreibung, PUBLIC SYSTEM - für private Notationen Externe Dateien als ‘Entitäten’ SGML-Identifikationsnummer CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 8 <!ENTITY btu-logo SYSTEM "/standard/logo.gif" NDATA GIF> oder mit Attributlisten und Quellenangaben <!ELEMENT bild EMPTY> <!ATTLIST bild quelle ENTITY #REQUIRED typ #NOTATION (GIF|BMP|JPG) <!ATTLIST form method CDATA #FIXED "POST"> "GIF" > Identifikatoren und Verweise ID als Referenztyp mit Möglichkeiten des Verweises IDREF auf ID mit Rückverweispflege IDREFS <!ATTLIST person personalnummer chef mitarbeiter ID #IMPLIED IDREF #IMPLIED IDREFS #IMPLIED> Unterstützung der Stern-Modellierung − semantisch einfach abhängige Attribute als XML-Attribute − strukturell bedeutsame Attribute als weiterführende XML-Elemente Entitäten ... auch mit Alias-Konzept &name; als Alias als gekapselte Informationseinheiten <!ENTITY BTU "Brandenburg University of Technology"> &BTU; &lt; < &gt; > &amp; & &apos; ’ &quod; " <!ENTITY ent-name SYSTEM "meinFile" > <!ENTITY ent-name PUBLIC "public-name" NDATA notation> <!ENTITY ent-name "meinFile" > <!ENTITY ent-name "Zeichenkette" > anlog Einfügen von files durch &name; <!ENTITY eroeffnung SYSTEM "http://.../beta/eroeff.html"> sowie parametrisierte Referenz-Entitites mit % vor Name CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 9 <!ENTITY % end-name .... > werden (sofort) expandiert bei Aufruf damit auch hierarchische Kapselung von Dokumenten Namen sollten eindeutig definiert sein, insbesondere für optionale Komponenten CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 10 Dokumententyp-Deklaration - DTD kann auch wegfallen <!DOCTYPE <!DOCTYPE <!DOCTYPE <!DOCTYPE <!DOCTYPE el-name el-name el-name el-name el-name > SYSTEM "Filename" > PUBLIC "publ-Name" > PUBLIC "publ-Name" [Deklarationen] > "File-Name" > Markierte Anweisungen <!ENTITY % draft "INCLUDE"> <!ENTITY % final "IGNORE"> <![%draft; [ <!ELEMENT buch(kommentar*, titel, inhalt, anhang?)> ]]> <![%final; [ <!ELEMENT buch(titel, inhalt, anhang?)> ]]> Verwendung von % anstelle von & Vorsicht mit verschachtelten Markierungen ! Vorteil: Deklaration als Parameter-Entität: <!DOCTYPE buch SYSTEM "book.dtd" [ <!ELEMENT name (#PCDATA)> .... <!ENTITY % m.spec-text "name|begriff|hervorgehoben" > .... <!ELEMENT para (#PCDATA|%m.spec-text;)*> <!ELEMENT zitat (#PCDATA|%mspec-text|auslassung)*> ]> .... <buch> .... </buch> analog können auch Attribute verschachtelt werden bzw. als globale Attribute definiert werden <!ENTITY <!ENTITY <!ENTITY <!ENTITY % % % % id-status "#IMPLIED"> spec-status "#IMPLIED"> x.global ""> a.global " %x.global; %a.linking; id ID %id-status; spec CDATA %spec-status,"> CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 11 XML erfordert nicht notwendigerweise eine DTD • Wohlgeformtheit korrekte Baumstruktur, nicht fehlerhaft, eindeutig • Validierbarkeit (wie bei SGML) Standardisierte DTD können auch als Architekturen genutzt werden (→ 2.2.2.) DocType kann auf externe Datei verweisen (mit Element-, Attribut-, Notationen- und Entity-Deklarationen) DTD kann auch vollständig im DocType mit enthalten sein (mit [] eingeschlossen) CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB Weitere Dokument-Strukturen: Tabellen Zeile 1 Zeile 2 Zeile 3 Spalte 1 Spalte 2 Spalte 3 Wert 1 Wert 2 Wert 3 Wert 4 Wert 5 Wert 6 wird erzeugt mit DTD für Tabellen <!ELEMENT tblrows (tbldefs,tblrow)+> <!ELEMENT tbldefs (tblcdef)+> <!ATTLIST tbldefs %a.format-alle-spalten;> <!ELEMENT tbldef EMPTY> <!ATTLIST tbldef %a.format-eine-spalte;> <!ELEMENT tblrows (tblrow)+> <!ATTLIST %a.format-alle-zeilen;> <!ELEMENT tblrow (tblcell)+> <!ATTLIST tblrow %a.format-eine-zeile;> <!ELEMENT tblcell (#PCDATA)> <!ATTLIST tblcell %a.format-zeile; colstart NMTOKEN #REQUIRED colspan NMTOKEN "1" rowspan NMTOKEN "1"> dagegen für einfache Tabellen mit folgender DTD <!ELEMENT <!ELEMENT <!ELEMENT tblrows tblrow tblcell (tblrow)+> (tblcell)+> (#PCDATA)> 12 analog zu LaTex CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 13 dann ist Tabelle definiert durch <table> <tabldefs> <tblrows> <tblrow> <tblcell <tblcell <tblcell <tblcell </tblrow> <tblrow> <tblcell <tblcell <tblcell <tblcell </tblrow> <tblrow> <tblcell <tblcell </tblrow> <tblrow> <tblcell <tblcell <tblcell </tblrow> <tbldef/> <tabldef/> <tabldef/> </tabldef> colstart="1"></tblcell> colstart="2">Spalte 1</tblcell> colstart="3">Spalte 2</tblcell> colstart="4">Spalte 3</tblcell> colstart="1">Zeile 1</tblcell> colstart="2">Wert 1</tblcell> colstart="3">Wert 2</tblcell> colstart="4" rowspan="2">Wert 3</tblcell> colstart="1">Zeile 2</tblcell> colstart="2" colspan="2">Wert 4</tblcell> colstart="1">Zeile 3</tblcell> colstart="2">Wert 5</tblcell> colstart="4" colspan="2">Wert 6</tblcell> einfache Tabelle mit Struktur <tblrows> <tblrow> ..... <tblcell>Zeile 3</tblcell> <tblcell>Wert 7</tblcell> <tblcell>Wert 8</tblcell> <tblcell>Wert 9</tblcell> </tblrow> </tblrows> LaTex-Definition dagegen \begin{tabular}{|c|c|c|c|} \hline & Spalte 1 & Spalte 2 & Spalte 3 \\ \hline Zeile 1 & Wert 1 & Wert 2 & Wert 3 \\ \cline{1-3} Zeile 2 & \multicolumn{2}{c|}{Wert 4} & \\ \hline Zeile 3 & Wert 5 & \multicolumn{2}{c|}{Wert 6} \\ \hline \end{tabular} CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 14 Graphen als gerichtete Graphen mit Mirror-Konzept als hierarchische Struktur 0 1 3 2 4 <!ELEMENT <!ELEMENT <!ATTLIST <!ELEMENT <!ATTLIST 5 gag (knoten)+> knoten (knoten|verweis)> knoten id ID #REQUIRED inhalt ENTITY #REQUIRED> verweis EMPTY> verweis zu-knoten IDREF #REQUIRED> damit ist dann die Struktur von oben halbkorrekt spezifiziert durch <gag> <knoten ID="k0" inhalt=knoten-0"> <verweis zu-knoten="k2"/> </knoten> <knoten ID="k1" inhalt=knoten-1"> <knoten ID="k2" inhalt="knoten-2"> <knoten ID="k4" inhalt="knoten-4"></knoten> </knoten> <knoten ID="k3" inhalt="knoten-3"> <verweis zu-knoten="k4"/> <knoten ID="k5" inhalt="knoten-5"></knoten> </knoten> </knoten> </gag> CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB Gerichte azyklische Graphen mit bewerteten Kanten <!ELEMENT <!ELEMENT <!ATTLIST <!ELEMENT <!ATTLIST <!ELEMENT <!ATTLIST gagb (knoten)+> knoten (kante)*> knoten id ID #REQUIRED inhalt ENTITY #REQUIRED> kante (knoten|verweis)> kante bewertung (a|b|c) #REQUIRED> verweis EMPTY> verweis zu-knoten IDREF #REQUIRED> Graph mit Bewertungen der Kanten halbkorrekt spezifiziert durch: <gagb> <knoten ID="k0" inhalt=knoten-0"> <kante bewertung="a"> <verweis zu-knoten="k2"/> </kante> </knoten> <knoten ID="k1" inhalt=knoten-1"> <kante bewertung="c"> <knoten ID="k2" inhalt="knoten-2"> <kante bewertung="c"> <knoten ID="k4" inhalt="knoten-4"></knoten> </kante> </knoten> </kante> <kante bewertung="b"> <knoten ID="k3" inhalt="knoten-3"> <kante bewertung="a"> <verweis zu-knoten="k4"/> </kante> <kante bewertung="a"> <knoten ID="k5" inhalt="knoten-5"></knoten> </kante></knoten></kante></knoten> </gagb> 15 CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB DTD als Umgebung <?xml version="1.0" standalone="yes"> <!DOCTYPE personal SYSTEM "personal.dtd"> <personal> <mitarbeiter mitarbid="ma007" leiter="ma0815"> Alf Blaha </mitarbeiter> .... </personal> mit der zugehörigen DTD <!ELEMENT mitarbeiter (#PCDATA)> <!ATTLIST mitarbeiter mitarbid ID #REQUIRED leiter IDREF #IMPLIED > ... falls standalone auf ‘‘no’’ steht, dann muß DTD angegeben werden XML • XML-Dokument • Dokument-Typ-Deklaration • Stil-Deklaration (eXtended Styesheet Language) XML-Dokumente als Bäume • Wurzel • Elemente • Text • Attribute • Bezeichner (namespace) • Verarbeitungsanweisungen • Kommentare 16 CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB <?xml version="1.0"?> <PERIODIC_TABLE> <ATOM> <NAME>Aluminum</NAME> <ATOMIC_WEIGHT>26.98154</ATOMIC_WEIGHT> <ATOMIC_NUMBER>13</ATOMIC_NUMBER> <OXIDATION_STATES>3</OXIDATION_STATES> <BOILING_POINT UNITS="Kelvin">2740</BOILING_POINT> <MELTING_POINT UNITS="Kelvin">933.5</MELTING_POINT> <SYMBOL>Al</SYMBOL> <DENSITY UNITS="grams/cubic centimeter"><!-- At 300K --> 2.7 </DENSITY> <ELECTRON_CONFIGURATION>[Ne] 3s2 p1 </ELECTRON_CONFIGURATION> <COVALENT_RADIUS UNITS="Angstroms">1.18</COVALENT_RADIUS> <ELECTRONEGATIVITY>1.61</ELECTRONEGATIVITY> <ATOMIC_RADIUS UNITS="Angstroms">1.43</ATOMIC_RADIUS> <HEAT_OF_VAPORIZATION UNITS="kilojoules/mole"> 290.8 </HEAT_OF_VAPORIZATION> <ATOMIC_VOLUME UNITS="cubic centimeters/mole"> 10 </ATOMIC_VOLUME> <HEAT_OF_FUSION UNITS="kilojoules/mole"> 10.7 </HEAT_OF_FUSION> <IONIZATION_POTENTIAL>5.986</IONIZATION_POTENTIAL> <SPECIFIC_HEAT_CAPACITY UNITS="Joules/gram/degree Kelvin"> 0.9 </SPECIFIC_HEAT_CAPACITY> <THERMAL_CONDUCTIVITY UNITS="Watts/meter/degree Kelvin"> <!-- At 300K --> 237 </THERMAL_CONDUCTIVITY> </ATOM> ... </PERIODIC_TABLE> 17 CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 18 XSL für Darstellung Verallgemeinerung von CSS (Cascading StyleSheets) noch im Vorschlagsstadium (Jan. 99 - 1. Version; Nov. 99 call) Ziel: Definition eines Dokumentes, das sich in HTML-Dokument konvertieren läßt je nach angewählter Umgebung z.B. <?xml version="1.0"?> <Springer:Katalog title="New books in March 2000"> <Springer:Book title="Entity-Relationship Modeling"> <Springer:Image src="http://www.springer.de/beta.gif"/> <Springer:Author>Bernhard Thalheim</Springer:Author> <Springer:Body>Database technology and ...</Springer:Body> </Springer:Book> </Springer:Katalog> wird umgeformt in das HTML-Dokument <HTML> <HEAD> <TITLE>New books in March 2000</TITLE></HEAD> <BODY><H1>Entity-Relationship Modeling</H1> <img src="http://www.springer.de/beta.gif"/> <H2>Bernhard Thalheim</H2> <P>Database technology and ...</P> </BODY> </HTML> Komponenten: 1. Konstruktionsregeln <xsl> <rule> <root/> <HTML> <HEAD> <TITLE>Style Sheet </TITLE> </HEAD> <BODY> <children/></BODY> </HTML> </rule> </xsl> bestehen aus 2 Teilen: • Muster (pattern) <rule> <target-element type="name"/> <DIV font-family="sans-serif" line-spacing="1.1" font-size="12pt" font-weight="bold" margin-left="30%" color="#333366"> <A href="=ancestor(’author’,this). getAttribute(’named’)+ ’.html’"> children/></A> </DIV> </rule> CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 19 named weil MS nicht mit ID umgehen kann • Aktion (action) (z.B. DIV zum Einsammeln der children-Elemente) Funktion ancestor ancestorChildNumber childNumber children formatNumber formatNumberList getAttribute hierarchicalNumberRecursive item length parent path tagName text Rückgabewert nächster Ahne mit dem übergebenen Namen nächster Ahne mit dem übergebenen Namen als Zahl (der wievielte) - gut für Kapitelnummern um das wievielte Element in der Reihe handelt es sich beim Kindelement die Kindelemente der Hierarchie Zahl als String Liste von Zahlen samt Trennzeichen (für Gliederungen) Wert eines Attributes die Nummern von Kindelementen - ähnlich den formatNumber- Funktionen (zum Beispiel: 2.1.2) das angegebene Element Länge einer Elementmenge der direkte Ahne des Elements Array inklusive der Elementnummer, bezogen auf die Geschwisterelemente/Eltern ... der Elementname Wert des Elements 2. Stilregeln z.B. begebenheit wird in Grau gesetzt, außer für den Attributwert wichtig (dann fett und rot) <style-rule> <target-element type="begebenheit"> <attribute name="kateg" value="wichtig"/> </target-element> <apply font-weight="bold" color="red"/> </style-rule> <style-rule> <target-element type="begebenheit"/> <apply color="#666666"> </style-rule> damit auch Funktionen einbettbar (z.B. Autoren mit Nummer in der Aufzählung) <!-- Ausgabe einer Gliederung oder aehnlicher Ziffernlisten --> <eval>formatNumberList(hierarchicalNumberRecursive("author",this), "1", ".")</eval>. oder auch selbstgeschriebene Funktionen (z.B. Monatsausgabe) <xsl><define-script><![CDATA[ function showMonth(m) {if (m == 1) return "Januar"; else if (m == 2) return "Februar"; else if (m == 3) return "M&auml;rz"; else if (m == 4) return "April"; else if (m == 5) return "Mai"; else if (m == 6) return "Juni"; else if (m == 7) return "Juli"; else if (m == 8) return "August"; else if (m == 9) return "September"; else if (m == 10) return "Oktober"; else if (m == 11) return "November"; CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 20 else if (m == 12) return "Dezember"; }]]> </define-script> <!-- Regeln ... --><!-- Regel fuer die Ausgabe des Monats --> <rule><target-element type="month"/> <TD background="#999999" color="#ffff33"> <eval>showMonth(this.text)</eval> </TD> </rule> </xsl> CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 21 Periodentabelle mit XSL: <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="PERIODIC_TABLE"> <html> <xsl:apply-templates/> </html> </xsl:template> <xsl:template match="ATOM"> <P> <xsl:apply-templates/> </P> </xsl:template> </xsl:stylesheet> verbunden mit: <?xml version="1.0"?> <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- templates go here --> </xsl:transform> und wird transformiert zu <HTML> <P> Hydrogen H 1 1.00794 20.28 13.81 0.0899 </P> <P> Helium He 2 4.0026 4.216 0.95 0.1785 </P> </HTML> CAU Kiel, IfI, ISE 5.1.2 β SS 2008 Datenbanken I 5. Komplex strukturierte DB 22 Sekundäre Strukturierung in XML/SGML HyTime-Standard: SGML-Dokumente mit hypermedialen Informationen • Repräsentation von Hyperlinks (Relationen der Anker in Dokumenten mit Rollen (Semantik)) damit auch unabhängige Verwaltung der Links • Lokationen in strukturierten Informationsgebilden • Adressierung über den Namenraum (ID-Attribute, Entitäten zur Lokalisierung) • strukturelle Adressierung (relative hierarchische und/oder sequentielle Position in Informationsbäumen • semantische Adressierung in Abhängigkeit von Objekt-Eigenschaften (damit auch spezielle Anfragesprachen) • Adressierung über den Koordinatenraum (abstrakt definerte Achsen (Raum-, Zeit-) • abstrakte Repräsentation hypermedialer Prozesse (Ereignisverläufe, Koordinatenräume) HyTime-engine (z.Z. nur für linking und adressing) abgeleitet: XLink für XML (vereinfachtes Linking-System) XPointer (Sprache zur Spezifikation relativer Knoten und Teilbäume im Informationsbaum) XLink und XPointer: XML Adressierungs- und Navigationssystem CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 23 in Verallgemeinerung: • General Architecture (z.Z. noch ohne engine) • Topic (Navigation) Maps (ISO/IEC 13250) mit architektonischen Formen • topicmap zur Deklaration für Architektur • topic zur Deklaration von Gegenstand und Konzepten (evt. auch mehrere Informationsobjekte umfassend, über Namen) • name eines topics in Sprachvarianten, Abkürzungen ... • occur für relevante Informationsobjekte • • • • assoc für Assoziierungslinks zwischen topics und roles assocrl für benutzungsspezifische Rollen facet für zusätzliche Attribut-Wert-Paare zur weiteren Charakterisierung fvalue Werte für parametrische Attribute von Informationsobjekten von facet • ICADD (International Committee for Accessible Document Design) z.B. ICADD-DTD für Braille-Schrift etc. • allgemeine Architekturen zur Unterstützung von ISO 12083 oder TEI Vielzahl von DTD’s • darstellungsbezogene wie HTML 4.x oder ICADD ohne strukturelle Einschränkungen • standardisierte wie z.B. ISO 12083 für wissenschaftliche Texte und TEI für geisteswissenschaftliche Texte • zentrale proprietäre von Organisationen • proprietäre benutzer-orientierte zur Konsistenz der Aufgaben Zusammenhang von DTD’s am besten durch DTD-Netze CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 24 Architekturen für • Ausstattung von DTD’s mit Funktionalität • zur Einführung von beliebige abstrakten meta∗ -Ebenen SGML - Extended Facilities: Architectural Form Definition Requirements (AFDR) z.B. Meta-DTD “person.dtd” <!AFDR "ISO/IEC 10744:1997"> <!ELEMENT person (surname, givenname, info*)> <!ATTLIST person sex (male|female) #IMPLIED> <!ELEMENT surname (#PCDATA)> <!ELEMENT givenname (#PCDATA)> <!ELEMENT info (#PCDATA)> <!ATTLIST #ALL spec CDATA #IMPLIED> #ALL wird immer vererbt darauf aufbauend CLIENT-DTD “kunde.dtd” • Bezug zur Meta-DTD StandardPerson • architecture support attributes (externe Entität, Element-form, Form-Attribut zum Namen (ArcFormA), renamer-Attribute zum Verbinden von Meta-Client-Namen StdPersAtts werden bei Element- und Attributlisten als Steuerattribute (control attributes) verwendet (StdPersAF zu person in kunde) (sex auf geschlecht) • Instanz dann: <!DOCTYPE kunde SYSTEM "kunde.dtd"> <kunde anrede="Herr" geschlecht="m"> <name> <nachname> Zitterbacke </nachname> <vorname> Alf </vorname> </name> <firma kommentar="sowieso pleite">Braun-Torf-Universal GmbH </firma> <funktion kommentar="gerade bef\"{o}rdert">Leiter DV </funktion> </kunde> CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 25 <?IS10744 ArcBase StandardPerson> <!NOTATION AFDRMeta PUBLIC "ISO/IEC 10744:1997// AFDR Meta-DTD Notation//EN"> <!ENTITY PersonDTD SYSTEM "person.dtd" CDATA AFDRMeta> <!NOTATION StandardPerson PUBLIC "-//LOCAL/NOTATION AFDR ARCBASE Person Architecture//EN" -- A base architecture used in conformance with the Architectural Form Definition Requirements of Internation Standard ISO/IEC 10744. --> <!ATTLIST #NOTATION StandardPerson ArcDTD CDATA "PersonDTD" ArcDocF NAME "person" ArcFormA NAME "StdPersAF" ArcNamrA NAME "StdPersAtts"> <!ELEMENT kunde (name, firma, funktion)> <!ATTLIST kunde anrede CDATA #IMPLIED geschlecht (m|w) #REQUIRED StdPersAF NAME #FIXED "person" StdPersAtts CDATA "spec anrede sex geschlecht MAPTOKEN male m female w"> <!ELEMENT name (nachname, vorname)> <!ELEMENT nachname (#PCDATA)> <!ATTLIST nachname StdPersAF NAME #FIXED "surname"> <!ELEMENT vorname (#PCDATA)> <!ATTLIST vorname StdPersAF NAME #FIXED "givenname"> <!ELEMENT firma (#PCDATA)> <!ATTLIST firma kommentar CDATA #IMPLIED StdPersAF NAME #FIXED "info" StdPersAF CDATA "spec kommentar"> <!ELEMENT funktion (#PCDATA)> <!ATTLIST funktion kommentar CDATA #IMPLIED StdPersAF NAME #FIXED "info"> CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB Architektur-Deklaration in XML • Client-DTD in XML header <?IS10744 arch name= public-id= dtd-system-id= doc-elem-form= form-att= renamer-att= "StandardPerson" "-//LOCAL//NOTATION AFDR ARCBASE Person Architecture//EN" "person.dtd" "person" "StdPersAF" "StdPersAtts" ?> Inhalt der Client-DTD <!ELEMENT kunde (name, <!ATTLIST kunde anrede CDATA geschlecht (m|w) StdPersAF NMTOKEN StdPersAtts CDATA firma, funktion)> #IMPLIED #REQUIRED #FIXED "person" "spec anrede sex geschlecht MAPTOKEN male m female w"> <!ELEMENT name (nachname, vorname)> <!ELEMENT nachname (#PCDATA)> <!ATTLIST nachname StdPersAF NMTOKEN #FIXED "surname"> <!ELEMENT vorname (#PCDATA)> <!ATTLIST vorname StdPersAF NMTOKEN #FIXED "givenname"> <!ELEMENT firma (#PCDATA)> <!ATTLIST firma kommentar CDATA #IMPLIED StdPersAF NMTOKEN #FIXED "info" StdPersAF CDATA "spec kommentar"> <!ELEMENT funktion (#PCDATA)> <!ATTLIST funktion kommentar CDATA #IMPLIED StdPersAF NMTOKEN #FIXED "info"> • Darstellung über markierte Teile <![ &XML; [ <?IS10744 arch name= public-id= dtd-system-id= doc-elem-form= form-att= "StandardPerson" "-//LOCAL//NOTATION AFDR ARCBASE Person Architecture//EN" "person.dtd" "person" "StdPersAF" 26 CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB "StdPersAtts" renamer-att= ?> ]]> <![ %SGML; [ <?IS10744 ArchBase StandardPerson> ... ]]> <!ELEMENT kunde ... > .... Aktivierung mit declaration subset <?XML version="1.0"?> <!DOCTYPE kunde SYSTEM "kunde.dtd" [ <!ENTITY % XML "INCLUDE"> <!ENTITY % SGML "IGNORE">]> <kunde> .... </kunde> 27 β CAU Kiel, IfI, ISE SS 2008 Datenbanken I 5. Komplex strukturierte DB 28 Verbindung von Element-Formen in Meta-DTD und ElementDeklarationen in Client-DTD Meta-DTD <!ELEMENT a (b, (c | d), f*)> kann verbunden werden mit Client-DTD durch: • Anreicherung <!ELEMENT <!ELEMENT a a (x+, (b & y), (c|d), f*) +(z)> (x+, (b, e), (a,x,b), f* > (SGML) • durch unsichere oder inkorrekte Erweiterung <!ELEMENT <!ELEMENT <!ELEMENT a a a (b, (c | d | x), f*)> (b, b, (c | d ), f*)> ( (b | e), (c | d ), f*)> • durch Einschränkung <!ELEMENT <!ELEMENT a a (b, (c | d ), f)> (b, c, f+ )> analoge Verbindungen für Attribut-Formen und Werten (z.B. IDREFS zu IDREF, CDATA zu NMTOKEN in Meta-DTD auch mehrere Attributlisten kombinierbar <!ELEMENT <!ATTLIST att1 att2 <!ATTLIST att3 att4 att5 a a (b,c)> (a1|a2|a3) "a1" CDATA #REQUIRED> a NMTOKEN #IMPLIED (order|disorder) "order" NMTOKEN "novamp" > wird in Client-DTD <!ATTLIST a att2 CDATA att3 NMTOKEN att5 NMTOKEN #REQUIRED #IMPLIED "vamp" > CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 29 Support-Attribute zur Festlegung der Beziehungen Meta-DTD zu Client-DTD 1. allgemeine Zuordnung der Meta-DTD: • ArcDTD: Deklaration der externen Entität in der Meta-DTD (XML: dtd-public-id, dtd-system-id), evt. auch URL für Parameter-Entität oder generelle Entität • ArcQuant: SGML-Kardinalitäten (Name-Länge, ...) werden für Client gefiltert (XML: quantity) ArcQuant CDATA "ATTCNT NAMELEN GRPCNT 100 64 100 • ArcDocF: Zuordnung des Dok-Elements der Client-DTD zu ElementForm der Meta-DTD (XML: doc-elem-form) Beispiel einer Meta-DTD <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT a1 a2 b c (b*, c*)> (b, b+, c, c+)> (#PCDATA)> (#PCDATA)> daraus abgeleitete Client-DTD nur mit b und c <!ELEMENT x1 <!ELEMENT x2 <!ELEMENT y <!ATTLIST y ArcForm <!ELEMENT z <!ATTLIST z ArcForm (y,y,z,z)> (y+, z+)> (#PCDATA)> NMTOKEN #FIXED (#PCDATA)> NMTOKEN #FIXED "b"> "c"> damit wird Dokument-Instanz möglich <!DOCTYPE x1 SYSTEM <x1> <y>y-daten</y> <y>y-daten</y> <z>z-daten</z> <z>z-daten</z> </x1> "x.dtd"> da für x1 keine Zuordnung deshalb Zuordnung einer entsprechenden architektonische Form mit der Zuordnung <!ATTLIST .... ArcDocF #NOTATION NAME Beispiel "a2" .... CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 30 wird dann daraus <!DOCTYPE a2 SYSTEM <a2> <b>y-daten</b> <b>y-daten</b> <c>z-daten</c> <c>z-daten</c> </a2> "a.dtd"> 2. Steuer-Attribute für Eigenschaften der Architekturen: • Kontrollattribute bereits in Client-DTD mit festem oder StandardWert belegt • Kontrollattribute erst in Instanz belegt Zuordnungen: • Element-Formen: Benennung eines Steuerattributes, das in der ClientDTD für diese Zuordnungsaufgabe genutzt werden kann (mit ArcFormA (XML: form-att)) Festlegung des Namens des Support-Attributes <!ATTLIST #NOTATION Beisp ... ArcFormA NMTOKEN ... > "BeispAF" Nutzung in einer Element-Deklaration <!ATTLIST BeispAF ... > y NMTOKEN #FIXED "b" • Attribut-Formen: Benennung eines Steuerattributes, das in AttributDeklarationen ein Steuerattribut bezeichnet ArcNamrA (XML: renamer-att) z.B. Meta-DTD hat Attribut-form <!ATTLIST mod info b CDATA CDATA #IMPLIED #REQUIRED ...> Einleitung der Attribut-Umbenennung in der Client-DTD: <!ATTLIST #NOTATION Beisp ... ArcNamrA NAME "BeispRA" ... > • automatisches Übertragen auf untergeordnete Strukturen kann verhindert werden mit ArcSuprA (XML: suppressor-att) 3. automatische Zuordnung für gleichbenannte Element-Formen (bei XML und SGML als Default-Option) ArcAuto bzw. nArcAuto (XML: auto): z.B. automatische Zuordnung von <!ELEMENT <!ATTLIST info typ a a (b,b) > CDATA #REQUIRED (A|B|C) "A" > CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 31 der Meta-DTD <!ELEMENT <!ATTLIST info typ a a (b+) > CDATA (A|B|C|D|E) #IMPLIED #IMPLIED > analog auch für ArcDataF (XML: data-form) (für externe Datenentitäten, deren Notationsname mit keinem der architektonischen Notationsnamen übereinstimmt) und ArcBridF (XML: bridge-form) für Elemente mit einer ID und keinem ArcForm-Attribut, denen Standardmäßig keine Form zugewiesen ist 4. für gezielte Aktivierung von einzelnen Bereichen der Meta-DTD in ClientDTD (für modularisierte Meta-DTD mit marked section) durch SupportAttribut ArcOpt (XML: options) damit in Meta-DTD auch übersichtliche Deklaration von Varianten <!ATTLIST #NOTATION ... ArcOpt CDATA WeitBeisp "block-1.1 block-1.3 block-2.2 block-3.3 block-3.4 block-4.2 block-4.7 block-5.2 block7.2" ... > Werte von ArcOpt sind Parameter-Entitäten, deren Werte auf INCLUDE gesetzt werden sollen in markierten Sektionen: Externe Speicherung der Kontrollattribute mit link process declaration (LPD) unterstützbar Name ist mißverständlich • explizite LPD’s (analog zu architektonischer Verarbeitung: Überführung einer Dokumenten-Instanz in eine Dokumenten-Instanz, die konform zu anderer DTD gebildet ist) <!DOCTYPE <!LINKTYPE kunde SYSTEM "kunde.dtd" > kunde-person kunde #IMPLIED SYSTEM "kunde-person.lpd"> <kunde> ... </kunde> <!LINKTYPE kunde-person <!ATTLIST firma info kunde CDATA #IMPLIED SYSTEM "kunde-person.lpd" [ #IMPLIED > ]> • implizite LPD’s (als Vereinfachung der expliziten (Konvention der Anreicherung einer Dokumenten-Instanz mit zusätzlichen Link-Attributen ohne sie zu verändern)) CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 32 • einfache LPD’s (wie bei impliziten; Dokument-Element mit zusätzlichen Link-Attributen) LPD’s nur in SGML damit auch Verbindung einer inhaltlichen DTD mit darstellungsorientierter DTD analog zu Tex-Umbenennung von Schlüsselwörtern Inhaltliche Einschränkung (Hinzufügen von Semantik) mit Struktur-Mustern (XML: XML-Schema) CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 33 XML Schema wie normales XML-Dokument bzw. XML-DTD, zu Beschreibung der Inhalte von Elementen und Attributen <elementType name="name"> <mixed/> </elementType> type für Klassen- bzw. Typspezifikation mixed für Character data und auch für Elemente <datatype name="zipCode"> <basetype name="string"/> <lexicalRepresentation> <lexical>99999</lexical> <lexical>99999-9999</lexical> </lexicalRepresentation> </datatype> mit Varianten für ZIP-Kode bzw. PLZ mit picture-Typ damit dann ZIP so definierbar: <elementType name="zip"> <datatypeRef name="zipCode"/> </elementType> vergleiche mit DTD (dort keine Constraints damit sogar komplexere Typen definierbar <elementType name="address"> <sequence> <elementTypeRef name="company" minOccur="0" maxOccur="1"> <elementTypeRef name="name" minOccur="1" maxOccur="1"/> <elementTypeRef name="street" minOccur="1" maxOccur="2"/> <elementTypeRef name="city" minOccur="1" maxOccur="1"/> <elementTypeRef name="state" minOccur="1" maxOccur="1"/> <elementTypeRef name="zip" minOccur="1" maxOccur="1"/> </sequence> </elementType> sequence wie , in DTD (für Reihenfolge) mit Referenzen auf existierende andere Typen Häufigkeit wie mit +, *, ? in DTD (nur feiner) anstelle von Paraterdefinitionen wie: <!ENTITY % address "company?, name, street+, city, state, zip"> <!ELEMENT billing.address (%address;)> <!ELEMENT shipping.address (%address;)> in XMLSchema über Architekturen: <archetype name="address" model="refinable"> <sequence> <elementTypeRef name="company" minOccur="0" maxOccur="1"/> <elementTypeRef name="name" minOccur="1" maxOccur="1"/> <elementTypeRef name="street" minOccur="1" maxOccur="2"/> <elementTypeRef name="city" minOccur="1" maxOccur="1"/> <elementTypeRef name="state" minOccur="1" maxOccur="1"/> <elementTypeRef name="zip" minOccur="1" maxOccur="1"/> </sequence> </archetype> <elementType name="billing.address"> <archetypeRef name="address"/> </elementType> <elementType name="shipping.address"> <archetypeRef name="address"/> </elementType> Vorteil: redefinierbar, explizite Hierarchie damit dann fast ER-Modellierung nachvollziehbar mit comp(R, E)-Komplexität Parser definiert über explizite Expansion als Beispiel mit komplexeren DTD: <!DOCTYPE purchase.order SYSTEM "po.dtd"> <purchase.order> <date>16 June 1967</date> <billing.address> <name>Beton-Torf-Universal GmbH</name> <street>German Titow Str. 17</street> <city>Klein-Schilda</city> <state>BB</state> <zip>03046</zip> </billing.address> <items> <item> <quantity>3</quantity> <product.number>248</product.number> <description>gelbe Fenster</description> <unitcost>99.95</unitcost> </item> <item> <quantity>1</quantity> <product.number>1632</product.number> <description>blaue M\"ulltonnen</description> <unitcost>4.95</unitcost> </item> </items> </purchase.order> <!DOCTYPE schema SYSTEM "o:/reference/w3c/schema/structures.dtd"> <schema> <archetype name="address" model="refinable"> <sequence> <elementTypeRef name="company" minOccur="0" maxOccur="1"/> <elementTypeRef name="name" minOccur="1" maxOccur="1"/> <elementTypeRef name="street" minOccur="1" maxOccur="2"/> <elementTypeRef name="city" minOccur="1" maxOccur="1"/> <elementTypeRef name="state" minOccur="1" maxOccur="1"/> <elementTypeRef name="zip" minOccur="1" maxOccur="1"/> </sequence> </archetype> <elementType name="billing.address"> <archetypeRef name="address"/> </elementType> <elementType name="shipping.address"> <archetypeRef name="address"/> </elementType> ..... </schema> Deklaration der anderen ‘wrapper’ im Schema <elementType name="items"> <elementTypeRef name="item" minOccur="1"/> </elementType> <elementType name="item"> <sequence> <elementTypeRef name="quantity" minOccur="1" maxOccur="1"/> <elementTypeRef name="product.number" minOccur="1" maxOccur="1"/> <elementTypeRef name="description" minOccur="1" maxOccur="1"/> <elementTypeRef name="unitcost" minOccur="1" maxOccur="1"/> </sequence> </elementType> <elementType name="purchase.order"> <sequence> <elementTypeRef name="date" minOccur="1" maxOccur="1"/> <elementTypeRef name="billing.address" minOccur="1" maxOccur="1"/> <elementTypeRef name="shipping.address" minOccur="0" maxOccur="1"/> <elementTypeRef name="items" minOccur="1" maxOccur="1"/> </sequence> </elementType> <elementType name="company"> <mixed/> </elementType> <elementType name="name"> <mixed/> </elementType> <elementType name="street"> <mixed/> </elementType> <elementType name="city"> <mixed/> </elementType> <elementType name="state"> <mixed/> </elementType> <datatype name="zipCode"> <basetype name="string"/> <lexicalRepresentation> <lexical>99999</lexical> <lexical>99999-9999</lexical> </lexicalRepresentation> </datatype> <elementType name="zip"> <datatypeRef name="zipCode"/> </elementType> <elementType name="product.number"> <mixed/> </elementType> <elementType name="description"> <mixed/> </elementType> <datatype name="quantityType"> <basetype name="integer"/> <minExclusive>0</minExclusive> </datatype> <elementType name="quantity"> <datatypeRef name="quantityType"/> </elementType> <datatype name="currency"> <basetype name="decimal"/> <precision>8</precision> <scale>2</scale> </datatype> <elementType name="unitcost"> <datatypeRef name="currency"/> </elementType> CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB <elementType name="date"> <datatypeRef name="dateTime"/> </elementType> damit können analog beliebige XML-Grammatiken definiert werden 37 CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 38 XForms als Anwendung von XML Schema für Beschreibung des Datenmodelles unabhängig von technischer Umgebung (Verallgemeinerung von HTML Form) • mit expliziten Daten-Modell • Benutzer-Interface • Datenaustausch mit DBMS-Server z.B. in obigem Beispiel Lieferadresse mit Eingabe <group name="purchase.order"> <group name="shipping.address"> <string name="name"/> <string name="street"/> <string name="city"/> <string name="state"/> <string name="zip"> <mask>ddddd</mask> <!-<mask>ddddd</mask> <!-<mask>ddddd-dddd</mask> <!-<mask>lldsdll</mask> <!-<mask>llddsdll</mask> <!-<mask>ldlsdld</mask> <!-</string> </group> </group> German PLZ --> US ZIP code --> US ZIP+4 code --> UK postal code --> UK postal code --> Canadian postal code --> Einbettung in Umgebung: <?xml version="1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML-XForms 1.0//EN" "http://www.w3.org/TR/xhtml-forms1/DTD/xhtml-xforms1.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Purchase Order</title> <xform xmlns="http://www.w3.org/2000/xforms" action="http://www.my.com/cgi-bin/receiver.pl" method="postXML" id="po_xform"> <model> <group name="purchase.order"> <group name="shipping.address"> <string name="name"/> <string name="street"/> <string name="city"/> <string name="state"/> <string name="zip"> <mask>ddddd</mask> </string> </group> </group> </model> <instance> <purchase.order> <shipping.address> <name>Beton-Torf-Universal GmbH</name> <street>German Titow Str. 17</street> <city>Klein-Schilda</city> <state>BB</state> <zip>03046</zip> </shipping.address> </purchase.order> </instance> </xform> </head> <body> <h1>Shipping Information</h1> <form name="po_xform"> Name: <input name="purchase.order.shipping.address.name"/><br/> Stra&szlig;e: <input name="purchaseOrder.shipTo.street"/><br/> Stadt: <input name="purchaseOrder.shipTo.city"/><br/> Land: <input name="purchaseOrder.shipTo.state"/><br/> PLZ: <input name="purchaseOrder.shipTo.zip"/><br/> <button onclick="submit(’po_xform’)">Submit</button> </form> </body> </html> Weitere Datentypen Boolean mit Wahrheitswerten TRUE,FALSE string String mit Masken mask (COBOL-like) number Zahlen (integer, decimal) mit (min,max) money Währungen mit currency ($ etc.) und decimals und (min,max) date Datum mit (min, max) in precision (year, month, day) time Tageszeit mit (min,max) und precision (hours, miniutes, seoconds) duration Dauer mit precision uri mit Verbindungsprotokoll schema binary für Binärdaten mit type sowie default-Attribute-Wert, fixierten (read-only), geforderten (required) Input-Werten, berechneten Werten Konstruktoren: Aufzählung (value-Folge), Vereinigung, Tupel, variablen Typen (case-Blöcke), Felder (group mit max/minOccur und Index quantity) verteilte Namen (RFC) Grammatik zur Konstruktion weiterer Typen CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB XML Namensraum zur Vermeidung von Namenskonflikten Lokalisierungsabstraktion (lokaler Name, globaler Name (evt. über Erweiterung)) (URI-Name, lokaler Name)-Paare in Sinne von < {http://www.w3.org/TR/xhtml1} head > spezielles Attribut und assoziierte Präfixe <... xmlns:foo="http://www.w3.org/TR/xhtml1"> ... <foo:head>...</foo:head> ... </...> als namespace: xmlns:prefix=‘‘URI’’ mit default namespace: ohne Präfix xmlns=‘‘URI’’ spezielles Attribut xmlns:NS prefix Namespace- Prefix frei gewählt i.a. vor der eigentlichen Verwendung in einem übergeordnetem Element oder DTD Wert: eindeutige URL (namespace-Name) gilt von dem Element, in dem er deklariert wird, für alle enthaltenen Elemente (bis auf Widerruf) streng hierarchisch Pfade mit entsprechendem Kontext über identifizierbare Namen Namen im Namensraum Identifikatoren im Namensraum 40 CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 41 XPath als Adressierungsschema (auch für Dokumentteile) für alle Dokumentteile (Wurzel, Elemente, Texte, Attribute, Namensraum-Knoten, Verarbeitungsinstruktionen, Kommentare) Pfade werden als Ausdruck evaluiert zu • Knoten • Boolescher Wert • Zahl • String auf der Grundlage ihres Kontexts • ihres Knotens • Positionspaar (Position, Größe) • Variablenbindungen • Namensraum-Deklaration der Umgebung als bedingte/iterative Baum-Tracing-Sprache (Achsen) • Kind-Knoten (erster, alle, x-ter) • Nachbar (linker, rechter) • Vaterknoten orthogonal dazu • Inhalt von Elementen oder Attributen • Element selbst in beliebiger Höhe/Tiefe und Zusammenstellung CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 42 XLink Verknüpfung mehrerer XML- Dokumente untereinander Attribut xml:link • inline-Links: Link innerhalb des gleichen Dokumentes • “out-of-line-” Links: Link in anderem Dokument verwaltet verbunden mit Aktionen bei Aktivierung des Verweise • Anzeige show mit neuem Fenster new, mit Erweiterung embed oder Überschreibung replace • Aufruf actuate erfolgt automatisch auto oder auf Benutzeraktion user • Weiterverfolgen von komplexen Links eingeschränkt auf steps=‘‘i’’ Schritte Unterscheidung in • einfache Links xml:link=‘‘simple’’ • komplexe erweiterte Links <?xml version="1.0"> <einfachesDokum> <title> XLinkDemo </title> <section id="Link-Ziel"> <para> Erster Paragraph in dieser Sektion </para> <para> Mehr Information zu XLink ist erreichbar unter <reference xml:link="simple" href="http://www.org/XLink"> W2C.</reference> </para> </section> <section id="Link-Source"> <para> Erster Paragraph in der zweiten Sektion. </para> <para> Man sollte <reference xml:link="simple" href="Link-Ziel"> zuerst </referenve> lesen. </para> </section> </einfachesDokum> Erweiterte Links zu mehreren Dokumenten gelinkte Ressource wird über einen “Locator” spezifiziert, der Inhalt des Linking Elements ist <!-- Extended Link, inline, 3fach --> <link xml:link="extended"> <loc xml:link="locator" href="http://www.w3.org"/> <loc xml:link="locator" href="http://www.leo.org"/> <loc xml:link="locator" href="http://www.sun.com/> </link> auch in Gruppen (Verwaltung in separatem Dokument) <!-- Extended Link Group --> <link xml:link="group" steps="2"> <doc xml:link="document" href="all_the_links"/> </link> CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 43 damit auch Deklaration in DTD etc. möglich <!ELEMENT FOOTNOTE (#PCDATA)> <!ATTLIST FOOTNOTE xmlns:xlink CDATA #FIXED "http://www.thalheim.edu/bsp/herm" xlink:type CDATA #FIXED "simple" xlink:href CDATA #REQUIRED > <!ELEMENT AUTHOR (#PCDATA)> <!ATTLIST AUTHOR xmlns:xlink CDATA #FIXED "http://www.thalheim.edu/cv/herm" xlink:type CDATA #FIXED "simple" xlink:href CDATA #REQUIRED xlink:role CDATA #IMPLIED> <!ELEMENT IMAGE EMPTY> <!ATTLIST IMAGE xmlns:xlink CDATA #FIXED "http://www.thalheim.edu/bild/alte" xlink:type CDATA #FIXED "simple" xlink:href CDATA #REQUIRED xlink:show CDATA #FIXED "onLoad" xlink:actuate CDATA #FIXED "embed" > damit sind dann auch komplexere Seiten aufbaubar <?xml version="1.0" standalone="no"?> <ERSteering xmlns:xlink="http://www.peterchen.edu/ERSteering"> <CHAIR xlink:type="simple" xlink:show="embed" xlink:href="BernhardThalheim.xml" /> <VICE-CHAIR xlink:type="simple" xlink:show="embed" xlink:href="TokWngLing.xml" /> <LIASON xlink:type="simple" xlink:show="embed" xlink:href="PeterChen.xml" /> <ERConfCHAIR xlink:type="simple" xlink:show="embed" xlink:href="DavidEmbley.xml" /> </ERSteering> wird expandiert zu <?xml version="1.0" standalone="no"?> <ERSteering xmlns:xlink="http://www.peterchen.edu/ERSteering"> <CHAIR xlink:type="simple" xlink:show="embed" xlink:href="BernhardThalheim.xml" /> <PERSON ID="p1035" SEX="M"> <NAME> <GIVEN>Bernhard</GIVEN><SURNAME>Thalheim</SURNAME></NAME> <BIRTH><DATE>...</DATE><PLACE>..., Sachsen</PLACE></BIRTH> </PERSON> <VICE-CHAIR xlink:type="simple" xlink:show="embed" xlink:href="TokWanLing.xml" /> <PERSON ID="p007" SEX="M"> <NAME> <GIVEN>Tok Wang</GIVEN><SURNAME>Ling</SURNAME></NAME> <BIRTH><DATE>...</DATE><PLACE>..., Singapore</PLACE></BIRTH> </PERSON> <LIASON xlink:type="simple" xlink:show="embed" xlink:href="PeterChen.xml" /> <PERSON ID="p4711" SEX="M"> <NAME> <GIVEN>Peter P.-S.</GIVEN><SURNAME>Chen</SURNAME></NAME> <BIRTH><DATE>...</DATE><PLACE>..., Taiwan</PLACE></BIRTH> </PERSON> <ERConfCHAIR xlink:type="simple" xlink:show="embed" CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB xlink:href="DavidEmbley.xml" /> <PERSON ID="p4711" SEX="M"> <NAME> <GIVEN>David</GIVEN><SURNAME>Embley</SURNAME></NAME> <BIRTH><DATE>...</DATE><PLACE>..., Taiwan</PLACE></BIRTH> <FAMILY ...><WIFE ... /><CHILD1 .... /> ... <CHILD14 .... /></FAMILY> </PERSON> 44 CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 45 damit auch mehrfache Links möglich <ERWebsite xmlns:xlink="http://www.peterchen.edu/ERCommunity" xlink:type="extended" xlink:title="ERWebsite"> <NAME xlink:type="resource" xlink:role="source"> ER Community Website </NAME> <HOMESITE xlink:type="locator" xlink:href="http://www.kathydavis.edu/ERHomesite" xlink:role="default"/> <MIRROR xlink:type="locator" xlink:title="ER Website - German Mirror" xlink:role="ge" xlink:href="http://www.informatik.tu-cottbus.de/ER96"/> <MIRROR xlink:type="locator" xlink:title="ER Website - Singapore Mirror" xlink:role="sg" xlink:href="http://www.cs.nsu.sg/ER98"/> <CONNECTION xlink:type="arc" xlink:from="source" xlink:to="mirror" xlink:show="replace" xlink:actuate="onRequest"/> </ERWebsite> mit DTD <!ELEMENT ERWebsite (NAME, HOMESITE, MIRROR*) > <!ATTLIST ERWebsite #FIXED "http://www.peterchen.edu/ERCommunity" xmlns:xlink CDATA xlink:type (extended) #FIXED "extended" xlink:title CDATA #IMPLIED xlink:role CDATA #IMPLIED > <!ELEMENT NAME (#PCDATA)> <!ATTLIST NAME xlink:type (resource) #FIXED "resource" xlink:role CDATA #IMPLIED xlink:title CDATA #IMPLIED> <!ELEMENT HOMESITE (#PCDATA)> <!ATTLIST HOMESITE xlink:type (locator) #FIXED "locator" xlink:href CDATA #REQUIRED xlink:role CDATA #IMPLIED xlink:title CDATA #IMPLIED> <!ELEMENT MIRROR (#PCDATA)> <!ATTLIST MIRROR xlink:type (locator) #FIXED "locator" xlink:href CDATA #REQUIRED xlink:role CDATA #IMPLIED xlink:title CDATA #IMPLIED > CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 46 XPointer Adressierung einer Reßource innerhalb eines XML- Dokuments mit XPath und Baum-Tracing-Sprache child descendant parent ancestor following-siblings preceeding-siblings following preceeding attribute namespace self descendant-or-self ancestor-or-self sowie Auswertungsfunktionen und Prädikate Kinder des Kontextknotens Kinder, Enkel etc. des Kontextknotens Eltern (oder leer falls Wurzel) alle Vorgänger bis zur Wurzel alle folgenden Geschwister all vorhergehenden Geschwister alle folgenden Knoten alle vorgehenden Knoten Attribute des Knotens Namespace-Deklaration des Knotens Knoten selbst oder oder an einen XLink angehängt (durch den Fragment Identifier # getrennt) Selektor selector(arg1, arg2, ...) anhand der Dokumentstruktur (Baum!) Beispiel einer URI mit (location, fragment) und Fragment (function(poiter expression)) http://www.w3c.org/bar.xml#xptr(art/sect[pos() &lt;= 5]) root().child(2) - 2. Sohn des Dokument-Elements child(2) - 2. Sohn des Dokument-Elements child(5, mylink, show, new) - 5. Element des Dokuments, dessen Tagname “mylink” und dessen “show”-Attribut “new”ist span(child(2, para).id(23).following(2,#pi), child(-1).string(1,‘W3C’’,1 - Dokumentausschnitt beginnend mit der 2. Processing Instruction des Elements mit der ID “23” des 2. <para>-Elements, bis zum String “W3C” im letzten Element des Dokuments CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 47 XDNL - XML Document Navigation Language Navigation: Szenario für Dokumentlesen je nach Umgebung in Abhängigkeit von der Benutzerinteraktion Szenario führt zu Blatt-Szenen, die abhängen von Benutzerinteraktion “Story” kann sich ändern in Abhängigkeit von aktueller Benutzung Stil: Arrangement bzw. Dekoration der Szenen XML-Dokument wird in Blöcke unterteilt XML-Dokument Blattknoten A ... Blattknoten Q Blockbeschreibung • Inhalt des Blattknoten (als Teil des Dokumentes) • Verweisverbindungen, Navigationstruktur analog zu pdf-file-display • Überblick über das Dokument • Browsing des Inhaltes • gewünschte Inhalte damit auch Auswahl des Inhaltes Reduktion des Datentransfers Anwendung unterschiedlicher Stile CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB Ein etwas längeres Beispiel <?xml version="1.0"?> <Address> <Title>MY Business Address Book</Title> <Company> <CompanyName>Foo Japan</CompanyName> <Person> <LastName>Ito</LastName><FirstName>Taro</FirstName> <Email>[email protected]</Email> <Phone>+81-3-0000-0000</Phone> <Fax>+81-3-0000-1111</Fax> </Person> <Person> <LastName>Kato</LastName><FirstName>Yoshiko</FirstName> <Email>[email protected]</Email> <Phone>+81-3-0000-0000</Phone> <Fax>+81-3-0000-1111</Fax> </Person> ... <Person> <LastName>Wada</LastName><FirstName>Jiro</FirstName> <Email>[email protected]</Email> <Phone>+81-3-0000-0123</Phone> <Fax>+81-3-0000-1234</Fax> </Person> </Company> <Company> <CompanyName>Foo Foo</CompanyName> <Person> <LastName>Manabe</LastName><FirstName>Kazuo</FirstName> <Email>[email protected]</Email> <Phone>+81-3-0000-2222</Phone> <Fax>+81-3-0000-3333</Fax> </Person> <Person> <LastName>Yamamoto</LastName><FirstName>Hanako</FirstName> <Email>[email protected]</Email> <Phone>+81-3-0000-2222</Phone> <Fax>+81-3-0000-3333</Fax> </Person> ... <Person> <LastName>Yamada</LastName><FirstName>Taro</FirstName> <Email>[email protected]</Email> <Phone>+81-3-0000-2222</Phone> <Fax>+81-3-0000-3333</Fax> </Person> <Person> <LastName>Tanaka</LastName><FirstName>Jiro</FirstName> <Email>[email protected]</Email> <Phone>+81-3-0000-2222</Phone> <Fax>+81-3-0000-3333</Fax> </Person> 48 <Person> <LastName>Suzuki</LastName><FirstName>Miho</FirstName> <Email>[email protected]</Email> <Phone>+81-3-0000-2222</Phone> <Fax>+81-3-0000-3333</Fax> </Person> </Company> </Address> XDNL Blattdokumentes <?xml version="1.0"?> <!DOCTYPE xdnl:documents SYSTEM "http://www.w3.org/TR/xdnl/xdnl.dtd"> <xdnl:documents> <!-- Company List --> <xdnl:leaf-document select="Address" type="CompanyList"> <xdnl:copy-of select="//Title"/> <xdnl:for-each chunk="series" counter-size="10" select="Company"> <xdnl:link href="#xdnl:{$class}-Company{@page}"> <xdnl:copy-of select="CompanyName"/> </xdnl:link> </xdnl:for-each> <xdnl:element name="Instruction"> <!-- These links will not be created unless there exist another 10 companies --> <xdnl:link href="#xdnl:{$class}-CompanyList{@page-1}"> Previous 10 Companies</xdnl:link> <xdnl:link href="#xdnl:{$class}-CompanyList{@page+1}"> Next 10 Companies</xdnl:link> </xdnl:element> </xdnl:leaf-document> <!-- Name List of Each Company --> <xdnl:leaf-document select="Address/Company" type="Company"> <xdnl:copy-of select="CompanyName"/> <xdnl:for-each chunk="series" counter-size="10" select="Person"> <xdnl:link href="#xdnl:{$class}-EachPerson{@page}"> <xdnl:copy-of select="LastName"/><xdnl:copy-of select="FirstName"/> </xdnl:link> </xdnl:for-each> <xdnl:element name="Instruction"> <xdnl:link href="#xdnl:{$class}-Company{@page-1}">Previous</xdnl:link> <xdnl:link href="#xdnl:{$class}-Company{@page+1}">Next</xdnl:link> </xdnl:element> </xdnl:leaf-document> <!-- Each Person’s Information --> <xdnl:leaf-document select="Address/Company/Person" type="EachPerson"> <xdnl:copy-of select="*"/> <xdnl:element name="Instruction"> <xdnl:link chunk="head" chunk-size="{$Screen.cols/3}" href="#xdnl:{$class}-EachPerson{@page-1}">Previous Person</xdnl:link> <xdnl:link chunk="head" chunk-size="{$Screen.cols/3}" href="#xdnl:{$class}-Page{@page+1}">Next Person</xdnl:link> <xdnl:link chunk="head" chunk-size="{$Screen.cols/3}" href="#xdnl:{$class}-Index1">Back to Index</xdnl:link> </xdnl:element> </xdnl:leaf-document> </xdnl:documents> kann benutzt werden um weitere Blattdokumente zu generieren Telefonliste der 1. Firma <?xml version="1.0"?> <!-- Company List --> <leaf-document id="xdnl:phone-CompanyList1"> <Address> <Title>MY Business Address Book</Title> <xdnl:link href="phone-Company1">Foo Japan</xdnl:link> <xdnl:link href="phone-Company2">Foo Foo</xdnl:link> ... <xdnl:link href=":phone-Company10">Foo Bar Co.</xdnl:link> <Instruction> <xdnl:link href="phone-CompanyList1-1">Next 10 Companies</xdnl:link> </Instruction> </Address> </leaf-document> Telefonliste der Firma 1 in anderer Version <?xml version="1.0"?> <leaf-document id="xdnl:phone-CompanyList1-1"> <Address> <Title>MY Business Address Book</Title> <xdnl:link href="phone-Company11">Foo Foo Bar Ltd.</xdnl:link> <xdnl:link href="phone-Company12">Bar Ltd.</xdnl:link> ... <xdnl:link href="phone-Company20">Bar Bar Co.</xdnl:link> <Instruction> <xdnl:link href="phone-CompanyList1">Prev 10 Companies</xdnl:link> </Instruction> </Address> </leaf-document> Telefon der Firma 1 <?xml version="1.0"?> <!-- Name List of Each Company --> <leaf-document id="xdnl:phone-Company1"> <Address> <Company> <CompanyName>Foo Japan</CompanyName> <xdnl:link href="phone-EachPerson1"> <LastName>Ito</LastName><FirstName>Taro</FirstName> </xdnl:link> <xdnl:link href="phone-EachPerson2"> <LastName>Kato</LastName><FirstName>Yoshiko</FirstName> </xdnl:link> ... <xdnl:link href="phone-EachPerson8"> <LastName>Wada</LastName><FirstName>Jiro</FirstName> </xdnl:link> <Instruction> <xdnl:link href="phone-Company2">Next</xdnl:link> </Instruction> </Company> </Address> </leaf-document> Telefonliste von Personen <!-- Each Person’s Information --> <leaf-document id="xdnl:phone-EachPerson1"> <Address> <Company> <Person> <LastName>Ito</LastName><FirstName>Taro</FirstName> <Email>[email protected]</Email> <Phone>+81-3-0000-0000</Phone> <Fax>+81-3-0000-1111</Fax> <Instruction> <xdnl:link href="phone-EachPerson2">Next</xdnl:link> </Instruction> </Person> </Company> </Address> </leaf-document> Eine entsprechende XSL erlaubt Generierung entsprechender HTML-Dokumente <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xdnl="http://www.w3.org/2000/xdnl"> <xsl:output method="html" /> <!-- Root --> <xsl:template match="/"> <HTML> <HEAD> <TITLE>MY Business Address Book</TITLE> </HEAD> <BODY> <xsl:apply-templates/> </BODY> </HTML> </xsl:template> <!-- Default Template --> <xsl:template match="*"> <xsl:apply-templates/> <BR/> </xsl:template> <xsl:template match="leaf-document"> <xsl:element name="DIV"> <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute> <xsl:apply-templates/> </xsl:element> </xsl:template> <xsl:template match="LastName"> <xsl:apply-templates/>, </xsl:template> <xsl:template match="Email"> <A> <xsl:attribute name="href">mailto:<xsl:value-of select="."/></xsl:attribute> <xsl:apply-templates/> </A> <BR/> </xsl:template> <xsl:template match="Phone"> <A> <xsl:attribute name="href">tel:<xsl:value-of select="."/></xsl:attribute> <xsl:apply-templates/> </A> <BR/> </xsl:template> <xsl:template match="Instruction"> <DIV> <xsl:apply-templates/> </DIV> </xsl:template> <xsl:template match="xdnl:link"> <A> <xsl:attribute name="href"> <xsl:value-of select="@href"/><xsl:text>.html</xsl:text> </xsl:attribute> <xsl:apply-templates/> </A> </xsl:template> </xsl:stylesheet> z.B. <HTML> <HEAD> <TITLE>MY Business Address Book</TITLE> </HEAD> <BODY> <!-- Company List --> <DIV id="xdnl:phone-CompanyList1">MY Business Address Book<BR /> <A href="phone-Company1.html">Foo Japan</A> <A href="phone-Company2.html">Foo Foo</A> ... <A href="phone-Company10.html">Foo Bar Co.</A> <DIV> <A href="phone-CompanyList1-1.html">Next 10 Companies</A></DIV> <BR /> </DIV> </BODY> </HTML> oder <HTML> <HEAD><TITLE>MY Business Address Book</TITLE></HEAD> <BODY> <!-- Each Person’s Information --> <DIV id="xdnl:phone-EachPerson1">Ito, Taro<BR /> <A href="mailto:[email protected]">[email protected]</A><BR /> <A href="tel:+81-3-0000-0000">+81-3-0000-0000</A><BR />+81-3-0000-1111<BR /> <DIV><A href="phone-EachPerson2.html">Next</A></DIV> <BR /><BR /><BR /> </DIV> </BODY> </HTML> CAU Kiel, IfI, ISE 5.1.3 β SS 2008 Datenbanken I 5. Komplex strukturierte DB 53 Erweiterungen von XML/SGML • HTML-MATH • Cascading Style Sheets CSS • Java Universal Markup Language (JUMBO) • CSL - Chemical markup language (auf Jumbo-Basis) • Web Interface Definition Language (WIDL) mit Service-Definition (binding ...) binding über I/O-Variable mit Erfolgs- und Fehlerbedingung für Output-Variable REGION für Teil des HTML-Dokumentes Erweiterungen von SGML mit komplexeren Ausdrucksmöglichkeiten für DTD ( XML ⊂ SGML ) • Web-SGML ( XML ⊂ Web-SGML, Web-SGML ¬ ⊂ SGML, SGML ¬ ⊂ Web-SGML ) • revidiertes SGML ( Web-SGML ⊂ revSGML, SGML ⊂ revSGML ) • SGML extended facilities ( revSGML ⊂ SGML-X ) Varietät von Implementationen günstig z.Z. XML storage, compiliert auf Perl Datenstrukturen (mit PerlXML-Parser), verwaltet durch Perl-Module, versandt als HTML-Seiten bzw. SMTP/NNTP-Nachrichten CAU Kiel, IfI, ISE 5.1.4 β SS 2008 Datenbanken I 5. Komplex strukturierte DB 54 XML-QL als Anfragesprache in Verallgemeinerung von SQL mit partiellem Lernen aus den Fehlern von SQL Aufsetzen auf verabschiedeten Standardteilen • Filtern und Extraktion von Teilen aus XML-Dokumenten • Transformation von Resultaten entspricht dem Cottbuser Vorschlag für Informationsdienste: Inhaltsbeschreibung von Sichten generate < mapping > : < variables > from < HERM subschema > where < selection condition > order by < condition >. ⇒ < structure > Präsentationsbeschreibung in Abhängigkeit vom Nutzer, Kanal, techn. Umgebung und Stilvorschriften: represent < unit > uses < style guide > | < abstraction > | < presentation function > | < scaling rules >. evt. auch mit Darstellungsalternativen: alternative representation for < unit > uses < style guide > | < abstraction > | < presentation function > | < scaling rules >. Funktionsspezifikation: (Suche, Navigation, Support, ...) add to < unit > browsing definition < condition > add to < unit > { index | navigation | search | selection } function < specification > add to < unit > analysis function < specification > add to < unit > analysis scenario < specification > add to < unit > refresh scenario < specification >. CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 55 Originalvorschlag gegeben sei DTD mit z.B. <!ELEMENT book (author+, title, publisher)> <!ATTLIST book year CDATA> <!ELEMENT article (author+, title, year?, (shortversion|longversion))> <!ATTLIST article type CDATA> <!ELEMENT publisher (name, address)> <!ELEMENT author (firstname?, lastname)> Matching auf der Grundlage von Pattern WHERE <book> <publisher><name>Addison-Wesley</></> <title> $t</> <author> $a</> </> IN "www.a.b.c/bib.xml" CONSTRUCT <result> <author> $a</> <title> $t</> </> (shortcut < / name > einfach als < / > Konstruktion auch in genesteter Form Damit könnte man aus XML-Daten <bib> <book year="1995"> <!-- A good introductory text --> <title> An Introduction to Database Systems </title> <author> <lastname> Date </lastname> </author> <publisher> <name> Addison-Wesley </name > </publisher> </book> <book year="1998"> <title> Foundation for Object/Relational Databases: The Third Manifesto </title> <author> <lastname> Date </lastname> </author> <author> <lastname> Darwen </lastname> </author> <publisher> <name> Addison-Wesley </name > </publisher> </book> </bib> folgendes Resultat erhalten: <result> <author> <lastname> Date </lastname> </author> <title> An Introduction to Database Systems </title> </result> <result> <author> <lastname> Date </lastname> </author> <title> Foundation for Object/Relational Databases: The Third Manifesto </title> </result> <result> <author> <lastname> Darwen </lastname> </author> <title> Foundation for Object/Relational Databases: The Third Manifesto </title> </result> besser mit direkter Gruppierung und Bindung des Inhaltes content as WHERE <book> <title> $t </> <publisher><name>Addison-Wesley </> </> </> CONTENT_AS $p IN "www.a.b.c/bib.xml" CONSTRUCT <result><title> $t </> WHERE <author> $a</> IN $p CONSTRUCT <author> $a</> </> dann Resultat: <result> <title> An Introduction to Database Systems </title> <author> <lastname> Date </lastname> </author> </result> <result> <title> Foundation for Object/Relational Databases: The Third Manifesto </tit <author> <lastname> Date </lastname> </author> <author> <lastname> Darwen </lastname> </author> </result> CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB Weiterhin auch mit üblichen SQL-Konstrukten WHERE <article> <author> <firstname> $f </> // firstname $f <lastname> $l </> // lastname $l </> </> CONTENT_AS $a IN "www.a.b.c/bib.xml" <book year=$y> <author> <firstname> $f </> // join on same firstname $f <lastname> $l </> // join on same lastname $l </> </> IN "www.a.b.c/bib.xml", y > 1995 CONSTRUCT <article> $a </> auch mit Variablen für ‘tags’ WHERE <$p> <title> $t </title> <year>1995</> <$e> Smith </> </> IN "www.a.b.c/bib.xml", $e IN {author, editor} CONSTRUCT <$p> <title> $t </title> <$e> Smith </> </> p für irgendeine Wurzel, e mit Einschränkung sowie Pfadvariable Implementationen: z.B. LORE 57 CAU Kiel, IfI, ISE 5.1.5 β SS 2008 Datenbanken I 5. Komplex strukturierte DB 58 Übersetzung von HERM in XML-Bäume HERM ist besser geeignet als einfache ER-Modelle • Typen bereits genestete Struktur • Typen höherer Ordnung • unäre Kardinalitätsbeschränkungen mit Participation-Semantik HERM ist besser geeignet als UML • Typen haben klar definierte Semantik • Schematakomponenten sind integriert • durch Codesign auch Pragmatik und Entwicklungsmethodik XML ist Einschränkung von HERM • XML Schema und XForms geeignet für hierarchische Extrakte von HERM • HERM-Spezialisierung entspricht Schema-Typen-Spezialisierung • einelementige Kardinalitäten ansonsten clustering mit pivoting • Varianten von I-Objekten über XDNL-Zugang • XML - objekt-orientiertes hierarchisches Datenmodell • Mehrfach-Szenarien werden mit XDNL-Varianten verbunden damit ist Übertragung von HERM-Schemata in XML Schemata determiniert CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 59 Übersetzung • Objektifizierung mit Master-Slave-Mirror für Auflösung mit ID’s alle Typen, auf die verwiesen wird unter Beachtung der Exklusionsabhängigkeiten • starke Aggregationen sind exklusiv (Komponente gehört zu genau einem Supertyp) • schwache (nicht-exklusive) Aggregationen werden in (evt. auch künstliche) MirrorBeziehung abgebildet evt. mit Varianten je nach Interaktion un Szenarien • schrittweise Übersetzung von HERM-Typen von 0. Ordnung bis zu i. Ordnung Entity-Typen werden direkt übertragen Attributtypen sind auch in HERM exklusiv, gehören zu ER-Typen Cluster-Typen werden in Varianten übertragen Relationship-Typen werden ggf. auch kolladiert ((1, 1)(1, 1)-Typen) bzw. objektifiziert Hierarchien müssen nicht aufgelöst werden, sondern werden direkt als Subtypen realisiert • Sichten werden als Anfragen in XML-QL formuliert, falls nicht bereits in Schema-Definition eingegangen • Integritätsbedingungen der Datenbank für XML-Interaktion müssen spezifisch behandelt werden • Translationsmechanismus wird analog für die Datenbank mit HERMReengineering-Zugang erweitert damit ist dann Direktanbindung der Datenbank möglich CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 60 5.1.6 Die Anfragesprachen Lorel, XML-QL und XQL Lorel Die Lightweight Object REpository Language (LOREL) ist eine datenbankorientierte Anfragesprache. Sie wurde an der Stanford University von S.Abiteoul, D.Quass, J.McHugh, J.Widom und J.Wiener entwickelt undimplementiert. Der Prototyp ist unter http://www-db.stanford.edu/lore zu finden. Lorel ist eine benutzerfreundliche Sprache im SQL/OQL Stil. Entwickelt wurde die Sprache zum Umgang mit großen Datenbeständen, sie soll Daten aus heterogenen Informationsquellen integrieren sowie Daten in allgemeine Datenaustauschformate transformieren können. XML-QL Auch XML-QL ist eine datenbankorientierte Anfragesprache, die demzufolge auch die selben Aufgaben hat wie Lorel. XML-QL wurde an den AT & T Labs von Alin Deutsch, Mary Fernandez, Daniela Florescu, Alon Levy und Dan Suciu als Teil des Strudel-Projektes entwickelt. Der Prototyp ist unter http://www.research.att.com/sw/tools/xmlql zu finden. XML-QL besitzt eine explizite CONSTRUCTKlausel, die zur Erstellung eines neuen Dokumentes aus dem Ergebnis der Anfrage dient. XQL XML Query Language ist eine dokumentorientierte Anfragesprache. Sie wurde von Jonathan Robie (Texcel Inc.), Joe Lapp (webMethods Inc.) und David Schach (Microsoft) entwickelt. Die Hauptaufgaben der Sprache ist hauptsächlich die Suche innerhalb von sehr großen Dokumenten (Volltext Suche) und demzufolge muß XQL auch einen sehr effizienten Zugriffsmechanismus auf die Quellen besitzen. Da wir auf semistruktierte Daten zugreifen, soll XQL Volltext- und strukturierte Anfragen integrieren können. Mit Hilfe von XML-Behältern kann XQL auch Anfragen über mehrere Dokumente stellen, indem diese zu einem Dokument zusammengefügt werden. XQL ist keine vollständige Abfragesprache und bietet nur reduzierte Ausdrucksmöglichkeiten, kann aber in einer Vielzahl von Fällen eingesetzt werden und ist leicht zu erlernen. XQL ist eine natürliche Erweiterung zur XSL pattern language. Sie wurde erweitert um eine Boolesche Logik, um Filter sowie der Indizierung von Knotensammlung. Genutzt wird XQL hauptsächlich zur Selektion und Filterung von Elementen und Text aus XML-Dokumenten. Es ist eine sehr einfache und kompakt gehaltene Sprache und kann so als Teil einer URL eingesetzt werden. Die Syntax Die Syntax der Sprache soll hier nur vereinfacht in einer BNF-ähnlichen Notation dargestellt werden. Dabei sind Terminale in Hochkommas eingeschlossen. Geschweifte Klammern bedeuten eine Liste von 0 oder mehreren Elementen, getrennt durch Kommas. Eckige Klammern bedeuten das optionale Auftreten, und Alternativen werden durch ein \j\ getrennt. Eine Abfrage besteht aus 3 Teilen: • pattern-clause Die Muster-Klausel überprüft Übereinstimmungen von verschachtelten Elementen und bindet Variablen an Elemente. • filter-clause Die Filter-Klausel testet die gebundenen Variablen. • constructor-clause Die Erbauer-Klausel spezifiziert das Ergebnis, als Terme von gebundenen Variablen. Lorel ’select’ {select_expr} [’from’] {from_expr}] [’where’ {where_expr}] CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 61 Lorel-Ausdrücke werden in SQL typischen Select-, From-, Where- (SFW) Blöcken geschrieben. Die Sprache ist orthogonal, so kann jeder Block wieder eine Query enthalten. XML-QL Query:= ’where’ {Predicate} ’construct’ {’{’Query’}’} Bei XML-QL wird das Resultat in der construct-Klausel spezifiziert. Mit Hilfe von tag-names und den Inhalt der Anfrage, kann ein neues XML Dokument konstruiert werden, welches dann als Ergebnis der Anfrage zurückgegeben wird. XQL Query::=[’./’|’/’|’//’|’.//’] Element [’[’Predicate ’]’][Path] Path ::=[’/’|’//’] Element [’[’Predicate’]’][Path] XQL unterstützt nur patterns und filter, keine constructors. Das ist, wie sich in den folgenden Beispielen noch zeigen wird, ein großer Nachteil von XQL, da viele Queries allein dadurch nicht ausdrückbar sein werden. Wie an der Syntax schon zu sehen ist, wird mit XQL durch einen XML-Baum navigiert, wobei Prädikate (filter) auf Elemente und Text entlang des Pfades angewandt werden. Das Resultat einer XQL Anfrage ist wieder ein XML Dokument. Lorel und XML-QL erweisen sich als die mächtigsten der 3 Sprachen. Ihre Ausdrucksmöglichkeiten könnte man mit hochentwickelten SQL Standards wie SQL92 vergleichen. Sie wurden unabhängig voneinander entwickelt und weisen doch viele Gemeinsamkeiten auf. Das mag sicher daran liegen, daß beide Sprachen aus der Datenbankgemeinschaft kommen und von vornherein versucht wurde, ihnen Datenbankfähigkeiten zukommen zu lassen (datenbankorientiert). Deshalb besitzt die Syntax der Sprachen auch die gleiche Struktur. Lorel ist die mächtigere der beiden Sprachen ist. XQL ist dagegen doch stark in ihren Ausdrucksmöglichkeiten eingeschränkt. Der Grund hierfür liegt in den Ursprüngen der Sprache. Mit XQL wollten die Entwickler eine Möglichkeit schaffen, Elemente aus XML-Dokumenten zu selektieren und auch eine Volltextsuche auf sehr großen Dokumenten durchzuführen und das möglichst effektiv. Deshalb nennt man XQL auch eine dokumentorientierte Sprache. Sie ist keine vollständige Anfragesprache, das soll sie auch nicht sein. Sie ist vielmehr der nützlichste Teil einer Anfragesprache. Deshalb sollte XQL aber nicht unterbewertet werden, es gibt auch Anfragen, die mit XQL aber nicht mit Lorel und XML-QL ausgedrückt werden können. XQL ist eine einfach zu erlernende, allgemein einsetzbare und sehr kompakte Sprache, dadurch könnte eine Query als Teil einer URL mit übergeben werden. Mittlerweile gibt es einige Erweiterungen, um XQL ausdrucksstärker zu machen und die großen Defizite der Sprache zu beseitigen. CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 62 5.2 User-defined types und objektrelationale Datenbanken 5.2.1 Objekt-Orientierung für Datenbanken Obwohl wir die Entwicklungsmethodik nicht als voll ausgebaute objekt-orientierte Entwicklungsmethodik bezeichnen können - was auch z.Z. kaum eine Entwicklungsmethodik behaupten kann, weil die dazu erforderliche Theorie zu einigen Problemen nicht im Entferntesten ausgearbeitet ist - , können wir doch unsere Entwicklungsmethodik als ein Beispiel einer schrittweise aufgebauten und methodologisch ausgereiften Methodik auffassen. Dabei ist es gelungen, die Vorteile objekt-orientierter Entwicklung mit den Vorteilen klassischer struktur-orientierter Entwicklungsmethodik zu verknüpfen. Vorteile objekt-orientierten Herangehens sind insbesondere die folgenden: Schnellere Entwicklung Wiederverwendung Modulare Architektur Beherrschung der Komplexität Bessere Darstellung des Anwendungsgebietes Client/Server-Anwendungen Vollständige Dokumentation des Entwicklungsprozesses Bibliotheken von Datenbankanwendungen. Durch einen objekt-orientierten Entwurf soll auch eine Wiederverwendung der bereits erstellten Entwürfe erleichtert werden. Diese Entwürfe werden in einer Bibliothek zusammengestellt. In einer Bibliothek können analoge Lösungen ausgewählt und für die Anwendung aufbereitet werden. Damit ergibt sich eine neuartige Entwurfsmethodik, die die Potenzen objekt-orientierter Entwicklung besser aussschöpfen. Diese Entwurfsmethodik kann durch die folgenden Schritte gekennzeichnet werden: 1. Identifizierung der Kenntnisse über den Anwendungsbereich 2. Spezifikation der Kenntnisse als abstrakte Klassen oder Familien abstrakter Klassen im Rahmen von Bereichsbibliotheken 3. Anforderungsanalyse der Aufgabenstellung, Identifikation abstrakter Konzepte, Reformulierung der Anforderungen auf der Grundlage des zweiten Schrittes und entsprechende Erweiterung 4. Problemzerlegung durch Verfeinerung der ersten drei Schritte 5. Spezifikation durch vollständige Erfassung der Datenstrukturen, der Funktionen and der Semantik, sowie deren Zusammenhänge auf Spezifikationsebene 6. Entwurf der Anwendung durch Verfeinerung der Spezifikation verbunden mit der Suche nach Ähnlichkeiten, dem Auffinden mehrerer Abstraktionen zur Vereinheitlichung, Umstrukturierung unter Berücksichtigung des Inhaltes der Bereichsbibliothek und anderer Bibliotheken 7. Konstruktion von Implementierungskonzepten (von unten nach oben), Konstruktion von Teilklassen der abstrakten Klassen zur Repräsentation der Strukturen, Funktionen und der Semantik unter Zuhilfenahme von Implementationskonzepten 8. Verifikation, Test, Dokumentation, Zuverlässigkeitsanalyse Die Implementation besteht aus: CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 63 • einem Nutzerinterface mit einer Erklärungskomponente zur Unterstützung der Datenbankentwerfer, • einer durch die Komponente Interpreter ausgeführten abstrakten OODB-Maschine, • einer Übersetzer-Komponente, die vollständige Schemata in ausführbare Programme der abstrakten Maschine transformiert, und • einer Entwurfsobjektbibliothek zur effizienten Abspeicherung, Suche und Analogieberechnung in der Menge der abstrakten Entwurfsobjekte, • einer Komponente zur Unterstützung des Nutzers während des Entwurfsprozesses mit einer Komponente zur Verwaltung, Verfeinerung und der Integration der Nutzerentwürfe, • einer Komponente zur effizienten Unterstützung des Auswahl- und Verfeinerungsprozesses mit einem Lernprogramm, einer Strategiekomponente zum Tweaking und einer Wissensakquisitionskomponente, die auch zur Erweiterung der Objektbibliothek herangezogen wird und • einem Programm Prüfer, das die Vollständigkeit eines Schemas überprüft. Das Vorgehen berücksichtigt dabei die bereits vielfach gemachte Erfahrung, daß eine Vielzahl von Projekten in spezifischen Anwendungsgebieten sich meist nur durch kleinere Details voneinander unterscheiden und zum anderen aber durch einen generischen, wiederverwendbaren Entwurf ein großer Teil an Entwurfsaufwand vermieden werden kann. Das ist insbesondere dann der Fall, wenn auf anwendungsspezifisches Wissen zurc̈kgegriffen werden kann. Dieses Vorgehen entspricht dem intuitiven Ansatz, den erfahrene Problemanalytiker verwenden. Sie schöpfen aus ihrem Erfahrungsschatz und passen die konkrete Anwendung in ihre bisherigen Lösungen ein. Dadurch arbeiten sie wesentlich effizienter als z.B. auch gut ausgebildete Neulinge. Die Architektur eines diesen Zugang berücksichtigenden Systems ist in Abbildung 1 dargestellt. Abstrakte Maschine Nutzerinterface Dokumentation des Entwurfes Erklärungsunterstützung Interpreter 6 ? Nutzerunterstützung Prüfer Verfeinerungskomponente Objektbibliothek Nutzerentwurfsverwaltung Suche - Tweakingkomponente Abspeicherung Integrationskomponente Wissensakquisitionskomponente Analogieberechnung Lernkomponente Abbildung 1: Komponenten des Systems, das entwickelt werden sollte CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 64 Dieser Zugang basiert auf der Annahme, daß sich ein generischer, objektorientierter Entwurfsprozeß nicht mehr mit klassischen Herangehensweisen erreichen läßt. Objekte bzw. Klassen in einer generischen Entwurfsbibliothek werden nach anderen Gesichtspunkten erstellt. Sie sind unter dem Gesichtspunkt der Wiederverwendbarkeit und der Generizität entworfen und werden durch Verfeinerung an die Anwendung angepaßt. Dadurch wird nicht die Adequatheit des Entwurfes zum zentralen Anwendungskriterium der Strategie, sondern die Wiederverwendbarkeit und Generizität. Anwendungsabstraktion. Wir beschäftigen uns nun mit dem objektorientierten Datenbankentwurf als zentraler Komponente bei der Entwicklung von Informationssystemen. Das zugrundegelegte Szenario beginnt mit einem anfänglichen objektorientierten Schema, das in der Regel partiell ist, d.h. Typ- und Klassendefinitionen fehlen oder sind unvollständig. Sodann wird dieses Schema durch schrittweise Verfeinerung in ein geschlossenes Datenbankschema überführt. Verfeinerungsschritte sind dabei die Instanziierung, operationale Verfeinerung, Erweiterung, Spezialisierung und Abspaltung. Instanziierung meint die nachträgliche Definition von Typen und Klassen, für die zunächst nur ein Name festgelegt wurde. Erweiterung bezieht sich auf die Hinzunahme neuer Klassen bzw. neuer Methoden in einer Klasse. Operationale Verfeinerung ergänzt unvollständig definierte Methoden, z.B. durch Aufrufe von Methoden auf anderen Klassen, und reduziert etwaigen Nichtdeterminismus. Spezialisierung meint die Einführung von Subklassen und Abspaltung ersetzt eine Klasse durch mehrere, die über Referenzen miteinander verbunden sind. Dabei werden Methoden ebenfalls abgespalten und durch Aufrufe ersetzt. Die formale Basis dieses Vorgehens bildet ein mathematisch fundiertes objektorientiertes Datenmodell mit einem abstrakten Objektbegriff, der im Gegensatz zu vielen bestehenden Ansätzen ein Objekt nicht an eine einzige festgelegte Struktur koppelt. Es kann außerdem gezeigt werden, daß alle beschriebenen Verfeinerungsschritte tatsächlich der formalen Definition von struktureller bzw. operationaler Verfeinerung genügen. 5.2.2 Typensysteme Wir verwenden hier ein objektorientiertes Datenbankmodell (OODM), das im Gegensatz zu den in der Literatur üblichen Modellen über eine wohlfundierte theoretische Basis verfügt. In aller Kürze läßt sich das Modell wie folgt definieren: Typdefinitionen im objektorientierten Datenmodell: Typen dienen der Gruppierung von Werten, sind also zunächst Mengen vonWerten. Das OODM unterscheidet grundsätzlich zwischen Basistypen und konstruierten Typen. Basistypen sind BOOL, N AT , IN T ,F LOAT , ST RIN G, ID und ⊥, wobei ID einen Typ abstrakter Objektidentifikatoren und ⊥ den trivialen Typ mit genau einem Wert bezeichnet. Konstruierte Typen werden durch (geschachteltes) Anwenden der folgenden Typkonstruktoren gebildet: ( a1 : T1 , . . ., an : Tn ) Der Typ wird aus n Typen T1 , . . . , Tn zusammengesetzt (RECORD). Die Feldnamenai dienen der Selektion der einzelnen Komponenten und können weggelassen werden, sofern hierdurch keine Mißverständnisse auftreten. “a1 ” + . . . + “an ” Der Typ legt die zulässigen Werte auf “a1 ” oder ... oder “an ” fest (Aufzählungstyp). (a1 : T1 ) ∪ . . . ∪ (an : Tn ) Der Typ enthält alle Werte der Typen T1 . . . Tn (Vereinigungstyp). Die Selektoren ai dienen dazu, mehrfaches Auftreten des gleichen Typs zuzulassen. Wie im ersten Fall können sie aber weggelassen werden, solange keine Mißverständnisse hieraus resultieren. [T ] Werte dieses Typs sind endliche Listen mit Elementen vom Typ T . {T } Werte dieses Typs sind endliche Mengen mit Elementen vom Typ T. CAU Kiel, IfI, ISE T Where P β SS 2008 Datenbanken I 5. Komplex strukturierte DB 65 Werte dieses Typs sind Werte des Typs T , die die Formel P erfüllen. Dabei enthält diese Formel genau eine freie Variable self, die sich auf eben diesen Wert bezieht. Wir können diesen Typen noch allgemeine Operationen wie z.B. +, ∗ aufNAT, INT, ∧, ∨ auf BOOL, concat auf STRING sowie map, filter, pump auf Mengen- und Listentypen zuordnen, mit denen Terme auf dieübliche Art und Weise gebildet werden können. Operationen auf Typen dienen nur diesem Zweck und sind nicht mit den zustandsverändernden Methoden auf Klassen zu verwechseln. Klassendefinitionen im objektorientierten Datenmodell: Im OODM wird zwischen Werten und Objekten unterschieden. Ein Objekt besteht aus • einem (abstrakten) Identifikator id, • einer Menge von Werten vi von möglicherweise verschiedenen Typen T1 , . . . , Tn , • einerMenge von Referenzen refj (j = 1, . . . , m) zu Objekten o1 , . . . , om und • einer Menge von Methoden (= Operationen) auf dem Objekt. Im OODM sind Identifikatoren Werte vom Typ ID. Identifikatoren verschiedener Objekte sind verschieden. Im Gegensatz zu Werten anderer Typen werden Identifikatoren jedoch ausschließlich durch das DBMS vergeben und bleiben für den Benutzer stets unsichtbar. In einigen anderen OODB-Systemen dagegen sind Identifikatoren sichtbar, was äquivalent zur Vergabe eines einheitlichen künstlichen Schlüssels und damit konzetionell inakzeptabel wäre. Ferner bleibt der Identifikator eines Objektes über die gesamte Lebensdauer des Objekts unverändert, während sich Werte, Referenzen und Methoden verändern können. Insbesondere ist die obige Menge {T1 , . . . , Tn } von Typen nicht a priori festgelegt, sondern Objekte können Typen hinzubekommen oder verlieren. Klassen dienen nur der Gruppierung von Objekten, sind also, wenn man sich auf die Identifikatoren als Stellvertreter zurückzieht, Mengen von Objekten. Die Klassendefinition im OODM umfaßt nun strukturelle Aspekte von Objekten, d.h. zugeordnete Typen und Referenzen zu Objekten in anderen Klassen, sowie Methoden, die auf alle Objekte in der Klasse Anwendung finden können. Typen und Referenzen lassen sich wiederum zu sog. Strukturausdrücken zusammenfassen. Eine Klasse besteht aus einem Klassennamen C, einer Menge {C1 , . . . , Cn } von Klassennamen, den sog. Superklassen, einem Strukturausdruck S und einer Menge {f1 , . . . , fm } von Methoden. Dabei entsteht ein Strukturausdruck aus einem parametrisierten Typ ohne Vorkommen von ID (einem sog. Wertetyp), in dem Parameter αi durch Paare ri : Ci mit einem Referenznamen ri und einem Klassennamen Ci ersetzt wurden. Ersetzen wir hier in wiederum alle Referenzen ri : Ci durch den Typ ID, so heißt der entstehende parametrisierte Typ der Repräsentationstyp der Klasse C und wird mit TC bezeichnet. In dieser Definition wird nicht verlangt, daß alle Parameter ersetzt werden; es kann sogar vorkommen, daß überhaupt kein Parameter durch eine Referenz ersetzt wird. Ein Schema im OODM ist eine Menge von Typ- und Klassendefinitionen. Wir nennen ein Schema genau dann geschlossen, wenn keine Parameter mehr vorkommen und alle Methoden deterministisch sind. Eine Instanz D eines geschlossenen Schemas S ordnet jeder Klasse C einen Wert D(C) vom Typ { ( ident : ID , value : TC ) } zu, so daß • Identifikatoren in D(C) eindeutig sind, d.h. (i, v1 ) ∈ D(C) ∧ (i, v2 ) ∈ D(C) ⇒ v1 = v2 gilt , • die referentielle Integrität bezüglich aller Referenzen r : C ′ erfüllt ist, d.h. (i, v) ∈ D(C) ∧ or (v, j) ⇒ ∃v ′ :: TC ′ .(j, v ′ ) ∈ D(C ′ ) gilt , CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 66 wobei das Prädikat or (v, j) genau dann erfüllt ist, wenn der Identifikator j im Wert v an der Stelle vorkommt, die durch die Referenz r markiert wird,und • die Inklusionsintegrität bezüglich aller Superklassen Ci von C erfüllt ist, d.h. es muß gelten (i, v) ∈ D(C) ⇒ ∃v ′ :: TCi .(i, v ′ ) ∈ D(Ci ) . Die in der Instanzendefinition enthaltenen Integritätsbedingungen müssen in Transaktionen selbstverständlich berücksichtigt werden (Konsistenzforderung). Ist nun ein beliebiges Schema S gegeben und ist inst eine Abbildung, die jedem Parameter P in S einen Typ zuordnet, so bezeichnen wir eine Instanz des geschlossenen Schemas S ′ , das durch Ersetzung von P durch inst(P ) entsteht, als eine Instanz von S unter der Instanziierunginst. Anfängliche Schemata sind in der Regel offen. Semantisch steht ein solches Schema für die Menge aller möglichen Instanziierungen. Dies realisiert das Prinzip der Klassenabstraktion. Graphische Schemadarstellung: Zusätzlich zu der textuellen Repräsentation sehen wir eine mehrschichtige graphische Repräsentation vor. Gerade die einfache graphische Unterstützung für den Datenbankentwurf mit dem Entity-Relationship-Modell hat zu dessen Erfolg beigetragen. Das Problem bei der graphischen Repräsentation objektorientierter Schemata liegt nicht darin, einem Schema eine Graphik zuzuordnen, die die (statische) Schemainformation widerspiegelt. Unter Verwendung verschiedener graphischer Symbole für Typen, Typkonstruktoren und Klassen lassen sich solche Graphiken einfach finden. Das Problem ist vielmehr, auch solche Graphiken zuzulassen, die nur eine vergröberte Darstellung der Schemainformation enthalten, in dem einzelne Komponenten des Strukturausdrucks einer Klasse, der gesamte Strukturausdruck oder ganze Klassen weggelassen werden. Zusätzlich muß es möglich sein, derartige Graphiken aufeinanderabzubilden. Subklassen und Subtypen: Die Klassendefinition beinhaltet die Angabe von Superklassen. Sind diese bereits definiert, so besagt die Forderung der Inklusionsintegrität, daß in jeder Instanz die Mengen der Objektidentifikatoren der beiden Klassen in einer Teilmengenbeziehung zueinander stehen müssen. Eine Forderung an die Werte der zugehörigen Repräsentationstypen beinhaltet die bisherige Definition allerdings noch nicht. Zur Verschärfung der Instanzdefinition führen wir zunächst eine Subtypbeziehung ein, die wir mit ≼ bezeichnen und die folgendermaßen definiert ist. 1. Jeder Typ ist Subtyp von sich selbst und von ⊥. 2. N AT ≼ IN T ≼ F LOAT . 3. (a1 : T1 , . . . , am : Tm ) ≼ (b1 : T1′ , . . . , bn : Tn′ ) gilt genau dann, wenn n ≤ m, aσ(j) = bj und Tσ(j) ≼ Tj′ für ein injektives σ : {1, . . . , n} → {1, . . . , m} gelten. 4. (a1 : T1 ) ∪ . . . ∪ (am : Tm ) ≼ (b1 : T1′ ) ∪ . . . ∪ (bn : Tn′ ) gilt genau dann, wenn m ≤ n, ′ aj = bσ(j) und Tj ≼ Tσ(j) für ein injektives σ : {1, . . . , m} → {1, . . . , n} gelten. 5. “a1 ” + . . . + “an ” ≼ “b1 ” + . . . + “bm ”gilt genau dann, wenn {a1 , . . . , an } ⊆ {b1 , . . . , bm } gilt. 6. {T } ≼ {T ′ } gilt genau dann, wenn T ≼ T ′ gilt. Analog gilt [T ] ≼ [T ′ ] genau dann, wenn T ≼ T ′ gilt. Ferner ist T Where P ≼ T . In allen obigen Fällen definiert eine Subtypbeziehung T ≼ T ′ eine eindeutige Abbildung T → T ′ für die zugrundeliegenden Mengen von Werten. Wir bezeichnen diese Abbildung als Subtypfunktion. Im OODM wird nicht gefordert, daß die Subklassenbeziehung (IsA) mit einer Subtypbeziehung für die Repräsentationstypen einhergeht. Stattdessen müssen nur in dem Fall, daß der Repräsentationstyp der Subklasse C von C ′ tatsächlich ein Subtyp ist, die zugehörigen Werte mittels der Subtypfunktion f aufeinander abbildbar sein, d.h. es muß (i, v) ∈ D(C) ⇒ (i, f (v)) ∈ D(C ′ ) CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 67 für alle Instanzen D gelten. Dies verschärft die bisherige Definition der Inklusionsintegrität. Objektidentität als zentrale Forderung an objektorientierte Datenbanken wird durch Identifikatoren (Werte vom Typ ID) modelliert. Da diese abstrakt und nicht sichtbar sind, stellt sich die Frage, ob Objekte in der Datenbank immer eindeutig identifiziert werden können, ohne die hierfür nicht brauchbaren Objektidentifikatoren zu verwenden, d.h. zu jedem Objekt in der Datenbank muß eine Anfrage existieren, die genau dieses Objekt als Antwort liefert. Dafür wurde der Begriff der schwachen Werteidentifizierbarkeit eingeführt und theoretisch untersucht. Methoden im objektorientierten Datenmodell: Bisher haben wir nur statische Aspekte beschrieben. Dynamik wird durch die den Klassen zugeordneten Methoden ausgedrückt. Wir unterscheiden zwischen verborgenen Methoden, gekennzeichnet durch das Schlüsselwort hidden, und Methoden, die vom Benutzer der Datenbank aufgerufen werden können. Letztere sollen als Transaktionen fungieren. Wir wollen damit unterstreichen, daß diese der Transaktionssemantik in Datenbanken (ACID-Prinzip) genügen, insbesondere müssen nur diese die Konsistenzforderung erfüllen. Die Transaktionsverarbeitung ist dann Aufgabe des für die Realisierung verwendeten Datenbanksystems. Diese Unterscheidung verbietet nicht den Aufruf einer verborgenen Methode durch andere Methoden. Methoden bestehen aus einem Kopf, in dem die Ein- und Ausgabeparameter mit ihren Typen genannt werden, und einem Rumpf. Im OODM werden Methodenrümpfe durch typisierte guarded commands beschrieben, deren Semantik axiomatisch durch das Dijkstra’sche Prädikattransformerkalkül definiert werden kann. Hier verwenden wir eine etwas eingänglichere Form zur Methodenbeschreibung. Ein Methodenrumpf wird hierbei aus den folgenden Konstrukten gebildet. 1) Variablendeklarationen: Let ⟨Var⟩ ::⟨Typname⟩ , 2) Wertzuweisungen: ⟨Var⟩ := ⟨Term⟩ , wobei die Variable und der Term vom gleichen Typ sein müssen, 3) Fallunterscheidungen: IF ⟨Bedingung⟩ THEN. . . ELSE . . . ENDIF , 4) Schleifen: WHILE ⟨ Bedingung ⟩ DO. . . ENDDO oder FOR ⟨Var⟩ WITH ⟨Bedingung⟩ DO. . . ENDFOR , 5) skip ohne Effekt, fail, das backtracking erzwingt und damit partiell undefinierte Methodenrümpfe erlaubt, 6) Aufrufe: ⟨Klassenname⟩ :-⟨Methodenname⟩ (⟨aktuelleParameter⟩), wobei der Klassenname weggelassen werden kann, wenn die aufgerufene Methode auf der gleichen Klasse definiert ist, 7) nichtdeterministische Wertselektionen: New.⟨Selektor⟩(⟨Var⟩) und New Id (out :⟨Var⟩). Die verschiedenen nicht-deterministischen Wertselektionen bedürfen noch einer kurzen Erläuterung. Im ersten Fall wird ein Selektor aufdem Repräsentationstyp verwendet. Dies ist eine nicht-deterministische Typoperation, die einem Wert eines konstruierten Typs eine bestimmte Komponente zuordnet. Der Typ dieses selektierten Werts ist ableitbar. Die Selektion ist lokal auf die jeweilige Klasse bezogen. New Id dagegen selektiert einen Identifikator (vom Typ ID), der global in der Instanz nicht vorkommt. Wir können dies auch als eine Methode auf einer Klasse O BJ auffassen, die Superklasse von allen Klassen ist. Der Strukturausdruck von O BJ wäre dann ⊥. Die Erarbeitung der Methoden kann bereits Teil der Verfeinerung sein. Fügen wir wie in diesem Fall zu einer gegebenen Klasse einfach Methoden hinzu, so bezeichnen wir diesen Verfeinerungsschritt als operationale Erweiterung. Sie gibt im Entwurfsprozeß häufig Hinweise auf Vervollständigungen des Strukturausdrucks der Klasse. Umgekehrt ist klar, daß Methoden ohne zugehörige Klasse nicht existieren. Objektorientierung beseitigt also nicht etwa den Unterschied zwischen Funktions- und Datenentwurf, sondern ermöglicht deren Integration mit einem eindeutigen Primat des Datenentwurfs. CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 68 Ein besonderes Augenmerk bei Datenbanken gilt generischen Veränderungsmethoden zum Einfügen, Ändern und Löschen von Objekten in einer Klasse. Diese können dann und nur dann existieren, wenn die Klasse werterepräsentierbar ist. Dies ist wiederum äquivalent dazu, daß Werte des Repräsentationstyps einer Klasse in jeder Instanz eindeutig sind, d.h.es muß (i1 , v) ∈ D(C) ∧ (i2 , v) ∈ D(C) ⇒ i1 = i2 in jeder Instanz D gelten. Wir bemerken noch, daß Werterepräsentierbarkeit die schwache Werteidentifizierbarkeit einschließt. Werterepräsentierbarkeit beseitigt allerdings nicht den Unterschied zwischen Werten und Objekten, da Objekte nach wie vor nicht an einen einzigen Typ gekoppelt werden können. Operationale Spezialisierung: Der Begriff der Inklusionsintegrität berücksichtigt keine Methoden. Zur Ausdehnung auf Methoden wird häufig der Vererbungsbegriff aus der objektorientierten Programmierung herangezogen. Für objektorientierte Datenbanken ist der Vererbungsbegriff allerdings überladen, so daß das OODM auf die Verwendung dieses Begriffs verzichtet. Der programmiersprachliche Vererbungsbegriff dient dazu, Methoden eines Objekts auf Superklassen zugänglich zu machen. Eine einfache Übertragung auf Datenbanken verbietet sich, da Werte eines Objekts in verschiedenen Klassen und weitgehend unabhängig voneinander gehalten werden. Alle Methoden eines Objekts sind sofort zugänglich, wenn das Objekt identifiziert ist. Ferner erzwingen die impliziten Integritätsbedingungen in der Instanzendefinition die Propagierung von Veränderungen entlang der Referenzen und der Subklassenbeziehungen. Im OODM wird daher lediglich gefordert, daß Methoden auf Subklassen, die Methoden auf einer Superklasse überschreiben sollen, operationale Spezialisierungen sein müssen. 5.2.3 Anpassungs- und Verfeinerungsmechanismen Der Verfeinerungsbegriff verwendet Historien, das sind Folgen D0 , D1 , . . . von Instanzen, wobei D0 (C) für alle Klassen C leer sei und der Übergang von Di−1 zu Di durch eine Transaktion auf einer Klasse C ∈ Serfolgt. Für Schemata S und T betrachten wir nun • eine Abbildung finst von den Instanzen des Schemas T zu denen von S, • eine partielle Abbildung fclass von den Klassen in T zu denen in S und • eine Abbildung fmeth von Methoden in T zu einer(möglicherweise leeren) Menge von Methoden in S, wobei für jede Methode M auf einer Klasse C in T die Methoden M ′ ∈ fmeth (M ) zur Klasse fclass (C) in S gehören. T ist genau dann eine Verfeinerung von S, wenn für jedesPaar (Di−1 , Di ) in einer Folge von Instanzen des SchemasT mit zugehöriger Transaktion M und jeder Methode M ′ inf meth (M ), die auf die Instanz finst (Di−1 ) angewendet werden kann, in einer neuen Instanz finst (Di )) resultiert. Eine Formalisierung des Verfeinerungsbegriffs mittels des Dijkstra’schen Prädikattransformerkalküls findet sich in der Literatur zur Theorie der Programmiersprachen. Im folgenden werden einige grundlegende Standardverfeinerungsschritte vorgestellt, die sich an strukturellen Aspekten von Klassen orientieren. Es wird diskutiert, wann diese Verfeinerungen verwendet werden können, wann ihre Verwendung sinnvoll ist und welche Auswirkungen dies auf die Methoden hat. Wir unterscheiden dabei die folgenden Verfeinerungstechniken: Verfeinerung durch Instantiierung: Ziel des Verfeinerungsprozesses ist es, ein geschlossenes OODMSchema zu erhalten. Da Schemata vor allem in frühen Stadien undefinierte Typen, Klassen und Methoden enthalten, ist die Instanziierung ein erster wichtiger Verfeinerungsschritt. Wir verstehen darunter die Definition von Typen und Klassen, die im anfänglichen Schema bzw. nach den bisher erfolgten Verfeinerungsschritten nur benannt, aber nicht festgelegt waren. Instanziierungen können jederzeit erfolgen. Sie sind unabhängig von der Reihenfolge und sie sind unvermeidbar. Allerdings ist nicht ausgeschlossen, daß durch die Instanziierung neue Parameter CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 69 eingeführt werden. Es ist Aufgabe des Entwufs sicherzustellen, daß die Einführung neuer Parameter nicht ins Unendliche fortgeführt wird, während eine formale Geschlossenheitsprüfung — abgesehen von der Überprüfung der Methoden auf deterministisches Verhalten — automatisch erfolgen kann. Methoden auf parametrisierten Klassen sind einfach parametrisch polymorph. Insbesondere entsteht kein Fehler, wenn sie bei Instanziierungsverfeinerungen nicht verändert werden. Andererseits ermöglicht die Instanziierung, die Methoden zu überprüfen und gegebenenfalls zu verändern. So können in der Methode ermittle Restfond für Kostenstelle die Verarbeitungen für die Speicherung des Institut und des Lehrstuhls ergänzt und konkretisiert werden. Auf weitere Details dieser operationalen Verfeinerungen gehen wir hier nicht ein. Ob zunächst nur strukturelle Instanziierungen vorgenommen werden, ohne die Methoden zu verändern, oder alle Auswirkungen auf Methoden sofort umgesetzt werden ist eine freie Entwurfsentscheidung. Als grobes Kriterium kann die Stabilität des bisherigen Entwurfs herangezogen werden. Wenn zu erwarten ist, daß etliche weitere Strukturänderungen (durch Verfeinerungen) erfolgen, so sollten die Methodenverfeinerungen vorläufig zurückgestellt werden. Die Verfeinerungsstrategie läßt derartige verschiedene Entwurfsstrategien bewußt zu. Primäres Ziel ist es, die Korrektheit der Entwürfe sicherzustellen. Verfeinerung durch Abspaltung: Bei der Verfeinerung durch Abspaltung wird ein zusammengesetzter Typ im Strukturausdruck einer Klasse zum Strukturausdruck einer neuen eigenständigen Klasse gemacht. Sein Vorkommen im “alten” Strukturausdruck wird dabei zu einer Referenz auf die neue Klasse. Ob ein Schema durch Abspaltung zu verfeinern ist hängt davon ab, ob die zugrundeliegenden Informationen als Objekte oder als Werte modelliert werden sollen. Im ersten Fall gibt es Objekte der realen Welt, die (teilweise) durch Objekte in der neuen Klasse beschrieben werden können und dementsprechend redundanzfrei in der Datenbank gespeichert werden sollen. Eine Verfeinerung durch Abspaltung führt außer zu Methoden auf der neuen Klasse (Verfeinerung durch operationale Erweiterung) zu Veränderungen in bereits vorhandenen Methoden. Auf diese Weise wird die in der Instanzendefinition geforderte referentielle Integrität sichergestellt Verfeinerung durch Spezialisierung: Bei der Verfeinerung durch Spezialisierung werden entweder Subklassen von vorhandenen Klassen gebildet oder es werden Klassen gebildet, deren Repräsentationstyp ein Subtyp des Repräsentationstyps einer vorhandenen Klasse ist. Im letzteren Fall ist es eine freie Entwurfsentscheidung, ob die neue Klasse als zusätzliche Subklasse eingeführt wird oder ob sie die alte Klasse ersetzt. Ob eine Spezialisierung sinnvoll ist, kann nur aus dem Anwendungszusammenhang beantwortet werden: • Gibt es “optionale Werte”, d.h. Werte, die bei einer Teilmenge von Objekten der Klasse fehlen? • Gibt es Referenzen, die nur auf einer Teilmenge einer Klasse vorhanden sind? • Gibt es Methoden, die sich auf einer Teilmenge einer Klasse spezifisch verhalten? In einer IsA-Beziehung kann ein Objekt der Superklasse auch in mehreren Subklassen (oder in keiner) enthalten sein. Außerdem muß die IsA-Beziehung nicht, mit einer Subtypbeziehung der Repräsentationstypen der Klassen einhergehen. Zusammen mit obigen Aussagen ergibt sich,daß Objekte nicht an Typen gekoppelt sind, sondern mehrere Typen (und damit mehrere Werte) gleichzeitig haben können. Dies erlaubt es, im OODM auf die Behandlung künstlicher Probleme wie dem der “Objektmigration” zu verzichten, da diese durch ableitbare generische Veränderungsoperationen bereits mit erfaßt werden. Als nächster Schritt wären die bereits vorhandenen Methoden zu überprüfen. CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 70 Mit einer Spezialisierung der Struktur geht eine Spezialisierung der Methoden einher. Denkbar (wenn auch hier nicht fachlich sinnvoll) ist natürlich auch ein Spezialisieren der Methode, d.h. zum Beispiel ein Formulieren zusätzlicher Prüfungen auf derSubklasse. Verfeinerung durch strukturelle Erweiterung: Außer zu neuen Werten können fachlich neue Erkenntnisse natürlich auch direkt zu neuen Klassen führen. Ein Kriterium zur Einführung neuer Klassen ist z.B. eine Unterbrechung in der Sachbearbeitung, die sich in den Methoden widerspiegelt. Derartige Erweiterungsverfeinerungen sind genau so wie Instanziierungen jederzeit möglich. Andere Modelle verwenden einen weitaus weniger abstrakten Objektbegriff, bei denen ein Objekt nur einer Klasse angehören kann oder mehreren Klassen, die paarweise in IsA-Beziehungen zueinander stehen. Dies schränkt von vornherein die Möglichkeiten der konzeptionellen Modellierung ein und verursacht zusätzliche Probleme, z.B. das der “Objektmigration”, die mit unserem Ansatz vermieden werden. Sinn des objektorientierten Zugangs ist es aber gerade, die vom relationalen Datenmodell her bekannten Probleme, die durch eine rein wertebasierte Modellierung entstehen, zu lösen. Diese Verfeinerung durch Vervollständigung wirkt sich nicht auf die bisher definierten Klassen aus, wohl aber können Verfeinerungen von Methoden auf diesen jetzt vollzogen werden. Dies erfolgt durch Aufruf der entsprechenden Methode. Das bis jetzt entwickelte Schema ist damit noch keineswegs abgeschlossen. Weitere fachliche Erkenntnisse oder Neubewertungen bereits modellierter Tatsachen führen zur wiederholten Anwendung der genannten Verfeinerungsschritte. 5.2.4 Fallen und Mißverständnisse Die hier vorgestellte Modellierungmethodik ist objekt-orientiert. Es erscheint insbesondere für die Modellierung ein objekt-orientierter Zugang viele Probleme zu lösen. Jedoch sollte man nicht glauben, daß mit einem objekt-orientierten Zugang auch alle klassischen Probleme gelöst seien, und vor allem nicht glauben, daß die Objekt-Orientierung das eigene Denken und Analysieren ersetzen kann. Mit dem objekt-orientierten Paradigma ist eine sehr mächtige Herangehensweise entwickelt worden. Aber nicht mehr. Basiskonzepte, die konsistent zu verwenden, sind die folgenden: Objekte wie bereits erläutert; Messages zwischen den Objekten (Retrieval, Aktionen, Update, Veränderung von Beziehungen); Abstraktion von Eigenschaften, Strukturen, Methoden etc.; Verkapselung mit einem Interface; Instantiierung wie bereits erläutert; Vererbung im Rahmen struktureller Vererbungshierarchien wie der Spezialisierungshierarchie und der Generalisierungshierarchie; Spezialisierung, Generalisierung Spezialisierung durch Hinzufügen, Überschreiben, Blockieren, ...; Polymorphismus auf Typenniveau, auf Implementationsniveau, über Protokolle; Typenkontrolle und Bindung für Methoden mit verschiedenen Implementationsstrategien; Komposition, Aggregation von Typen und Klassen; Teile-Ganze-Beziehungen und deren Einbeziehung bei der Bildung von Containern und entspr. Beziehungen. CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 71 Dabei existieren eine ganze Reihe von Mißverständnissen, Fallen und konzeptionell falschen Vorstellungen, die man bei der Entwicklung berücksichtigen sollte. Insbesondere sind die folgenden 82 “pitfalls” zu nennen. Diese Liste ist weder vollständig noch demotivierend. Im Gegenteil, jeder, der Fehler - auch solche dieser Liste - vermeiden kann, sollte diese Fehler auch bewußt vermeiden. Dadurch wird die Anwendungsentwicklung eher mit hoher Qualität geführt werden können. Konzeptionelle Mißverständnisse sind meist Mißverständnisse, die durch ein Unverständnis oder einen - evt. auch intuitiven - Mißbrauch der Konzepte entstehen. Man sollte die Form nicht mit Konzepten verwechseln. Objekt-Orientierung umfaßt auch Klassen und Objekte, aber nur als jeweils ein Konzept unter vielen. Weiterhin sollten die Implikationen einer objekt-orientierten Entwicklung verstanden werden. Durch eine objekt-orientierte Methodik wird ein anderer Stil gepflegt als bisher. Außerdem bedingt eine objekt-orientierte Methodik nicht, daß alle klassischen, wohlerprobten Methoden über Bord geworfen werden müssen. Oft wird aufgrund der höheren Produktivität ein objekt-orientierter Zugang gewählt, was zu entsprechenden Enttäuschungen führt. Alles hat seinen Preis. Objekt-Orientierung aus falschen Gründen. Es gibt eine Vielzahl von Gründen, warum objektorientierte Entwicklung auch sinnvoll erscheinen kann: Jemand hat etwas darüber gehört. Man scheint ohne Testen auszukommen. Man scheint schneller voranzukommen. Bisherige Entwicklungsprobleme gibt es nicht mehr. Graphische Benutzerschnittstellen sind besser. Man möchte Systeme einfach verbinden können. Richtiger ist den Zugang aufgrund seiner Konzepte und der damit verbundenen Qualität zu wählen. Objekt-Orientierung hat keinen Preis. Mit Objekt-Orientierung scheint ein ‘plug-and-play’Zugang in greifbare Nähe gerückt zu sein. Man scheint schnell und einfach jeden Entwickler auch für eine objekt-orientierte Entwicklung heranziehen zu können. Im Gegenteil, zur Objekt-Orientierung gehört auch eine entsprechende Ausbildung. Diese benötigt Zeit und erfordert einen Reifungsprozeß. Man benötigt auch die richtigen Werkzeuge und auch eine solide Theorie im Hintergrund. Objekte sollen alle Probleme lösen. Der Modellierungsprozeß ist ein umfangreicher Prozeß, der viele Entwicklungsstadien erfordert und sehr komplex ist. Man entwirft nicht nur, sondern muß auch eine Reihe von Problemen im Rahmen der gegebenen Grenzen lösen. Einige dieser Probleme lassen sich einfacher lösen, einige werden auch schwieriger. Objekt-Orientierung ist ausgereift. Obwohl über Objekt-Orientierung für Informationssysteme seit über einem Jahrzehnt gesprochen wird, ist diese Entwicklungsmethodik immer noch nicht ausgereift. Weder die Anwendungsgebiete sind klar eingegrenzt, noch eine Vielzahl von Experten ausgebildet, die auch eine längere Erfahrung einbringen können, noch ist die Problemlösung deterministisch, noch ist die ‘menschliche’ Komponente der Modellierung verstanden, noch ist die entsprechende Theorie entwickelt. Deshalb ist Objekt-Orientierung über die guten Seiten entsprechend zu benutzen, ohne die Nachteile außer Acht zu lassen. Verwechseln von Schlagworten mit Konzepten. Schlagworte wie Polymorphismus, Wiederverwendung, Identität, dynamisches Binden, sind meist schnell auswendig zu lernen. Die Inhalte sind dagegen schon aufgrund nicht ausreichender theoretischer Durchdringung weniger schnell zu lernen und adäquat anzuwenden. Man kann dagegen durch eine entsprechende Ausbildung und durch das Erfassen von Erfahrungen, die Experten machen mußten, auch das Verständnis verbessern. Verwechseln von Werkzeugen mit Prinzipien. Oft meint man allein durch die Benutzung objekt-orientierter Werkzeuge auch objekt-orientiert zu sein. Erfahrung und Ausbildung bleiben aus diesem Grund nach wie vor erstrangig. Verwechseln von Darstellung mit Methodik. Produkte geben oft an, objekt-orientierte Herangehensweisen zu unterstützen, weil die eine oder andere Funktionalität wie Fenster, Ta- CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 72 sten, graphische Repräsentation, Ereignisse, Wiederverwendung, Verteilung, Nachrichten die Objekt-Orientierung unterstützen. Man muß dagegen die verschiedenen Konzepte der Objekt-Orientierung im Zusammenhang und im Zusammenspiel beherrschen. Verwechseln von Training mit Fähigkeiten. Das Besuchen eines oder mehrerer Kurse kann zur Entwicklung vom Verständnis beitragen. Fähigkeiten entwickeln sich dagegen erst beim Gebrauch und durch Erfahrung. S. Covey (Seven Habits of Highly Effective People): Gesetz der Schnitter (Man kann auch nicht Getreide über Nacht säen und am nächsten Morgen ernten.). Fähigkeiten kommen mit der Zeit und mit entsprechender Anstrengung. Deshalb kann man nicht, objekt-orientierte Entwicklungsmethodiken übernacht einsetzen. Verwechseln von Prototypen mit ausgereiften Produkten. Man kann durch die größere Entwicklungsgeschwindigkeit verführt, die insbesondere mit dem Prototyping verbunden ist, das Endprodukt aus den Augen verlieren. Produkte, die mit dem Prototyping entstehen sollen die Machbarkeit aufzeigen und sind deshalb nur die Vorstufe zum erfolgreichen Endprodukt. Machbarkeitsstudien sind deshalb weniger für eine Präsentation von Ergebnissen geeignet. Strategische Mißverständnisse sind oft durch die Zusammenarbeit mit einer Leitung entstanden, die den vielen Versprechungen von (unseriösen) Anbietern aufsitzt. Deshalb ist auch das Management von den Potenzen und den Problem einer objekt-orientierten Entwicklung zu unterrichten. Leitung nicht vollständig informiert über Konzepte. Da sich eine Leitung mit einer Vielzahl von Problemen auseinandersetzen muß, ist oft nicht die Gründlichkeit beim Verständnis der Konzepte vorhanden, so daß damit die Urteilsfähigkeit insbesondere über die Potenzen und Schwierigkeiten eingeschränkt ist. Damit ist auch die Leitung mit den wichtigsten Problemen objekt-orientierter Entwicklung zu konfrontieren. Unterschätzung der Trägheit. Jede neue Technologie benötigt auch ein umfassendes Verständnis ihrer Grundkonzepte. Oft entscheidet aber darüber auch die Arbeitsumgebung oder die Gewohnheiten. Erfolgserlebnisse sind dagegen ein guter Antrieb, um sich entsprechende Konzepte schnell zu eigen zu machen. Überschätzung der Technologie. Man erwartet vom neuen Herangehen oft zu viel und ist dann ebenso tief enttäuscht. Gerade die Proponenten objekt-orientierter Datenbanken wird oft zuviel versprochen. Deshalb ist eine gewisse Skepzis angebracht. Religiöse Propaganda. Die Vorteile objekt-orientierter Entwicklung wie z.B. Wiederverwendung kommen erst bei entsprechender erfahrener Benutzung zum Tragen. Dagegen wird oft versprochen, die Produktivität vom ersten Tag an zu heben. Analog geht es mit anderen enthusiastischen oder fanatischen Versprechen. Eine Technologie ist stets nur so nützlich wie sie ihr Anwender macht. Nichtberücksichtigung der Architektur. Eine Anwendung ist oft durch eine größere Anzahl von verschiedenartigen Anwendungsfällen charakterisiert, so daß eine Grobarchitektur auch sinnvoll erscheint. Damit wird auch eine Modularisierung erleichtert. Einem Entwickler ist deshalb oft auch die Rolle des Chefarchitekten mit allen Konsequenzen zuzuweisen. Abhängigmachen von eigenen Versionen. Nach Vervollständigung eines Entwurfes wird oft auch eine Reihe von Entwurfsfehlern sichtbar, die man glaubt im Schellverfahren überwinden zu können. Damit wird auch die Modellierung selten besser. Hinzu kommt oft CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 73 auch die Forderung nach einer schnellen Erweiterung um zusätzliche Typen oder zusätzliche Funktionalität. Oft ist dazu auch die Leitung am schnellen Vertrieb der erweiterten Version interessiert. Versionen erfordern eine sehr gute Dokumentation der Entwurfsentscheidungen und der Alternativen. Damit wird auch die Komplexität einer neuen Version eher verständlich. Verkaufen der Entwicklung für Objekt-Orientierung. Es wird die Anwendung von ObjektOrientierung mit einer kurzen Entwicklungszeit versprochen. Objekte werden als die Universalwaffe in den Mittelpunkt gestellt. Klassenlose Objekte werden ohne hinreichende Strukturierung verwendet. Im Mittelpunkt einer Entwicklung sollte dagegen stets der Anwender stehen. Mißverständnisse beim Herangehen werden oft durch einfaches Übertragen bisheriger Praktiken gemacht. Objekt-Orientierung erfordert dagegen eine größere Entwicklungsdisziplin. Einsatz von Objekten ohne wohldefinierte Ziele. Man setzt Objekt-Orientierung ohne eine entsprechende Motivation, ohne eine Methodik und ohne klare Ziele ein. Damit kann auch nicht der gewünschte Effekt. Ziele wechseln oft sehr schnell. Deshalb ist ihre Auswirkung auf den Entwurf zu dokumentieren. Erzwingen von Objektbenutzung. Wird durch eine intensive Propaganda eine objekt-orientierte Entwicklung erzwungen ohne ausreichend darauf vorbereitet zu sein, dann sollte vor einer objekt-orientierten Entwicklung eine gründliche Ausbildung angestrebt werden. Ohne Berücksichtigung guter Software-Praktiken. Ohne wohldefinierte Methodik. Zu viel, zu schnell, zu bald. Annahme einer linearen Entwicklung. Spezifikationen ohne allgemeine Übereinstimmung gewechselt. Neue Charakteristika einfach eingearbeitet. Verwechseln von Prototyping mit Fertigstellung. Kosten falsch berechnet. Ohne Identifikation und Verwaltung von Risiken. Leben und Verbreiten von Illusionen. Benutzung der falschen Metriken. Einsatz falscher Entwickler. Mißverständnisse im Entwurf und bei der Analyse Unterschätzen von Analyse und Entwurf. Unterschätzen der Schwierigkeit von Analyse und Entwurf. Alter Wein in neuen Schläuchen (oder umgekehrt). Ohne Berücksichtigung der eigenen Schwächen. Elfenbein-Turm-Lösungen. Falsche Anzahl von Teammitgliedern. Lösungen werden zu komplex gemacht. Entwurf durch Aufzählung. Reentwurf - zu oft und unter falschen Voraussetzungen. Reentwurf - zu selten. Berücksichtigung des falschen Kundenkreises. Aufdrücken von neuen Paradigmen. CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB Mißverständnisse durch die Umgebung und Werkzeuge Falsche Werkzeuge für die Anwendung. Einsatz ohne vorherigen Reentwurf der Umgebung. Glauben an falsche Versprechen der Verkäufer. Benutzung von C++. Keine Benutzung von C++. Benutzung von Werkzeuge ohne diese zu lernen. Implementations-Mißverständnisse Zu schnelles Implementieren. Verkapselung verhütet nicht Entwurf. Hoffen durch schnellen Erfolg beim Prototyping. Zu viele Versprechen ohne sie zu halten. Detail für spätere Implementation gelassen. ‘Code-and-go’-Implementation. Kernentscheidungen nicht dokumentiert. Mißbrauch von Konzepten. Klassen- und Objekt-Mißverständnisse Verwechseln der Hierarchien (is-a, has-a, is-using). Verwechseln von Interface-Vererbung und Implementations-Vererbung. Schlechte Benutzung von Vererbung. Kernklassen überladen oder übersplittet. Kernklassensemantik verletzt. Abstrakte Objektklassen ohne Bedeutung. Aufgeschwemmte Objekte. Durchsichtige Objekte. Objekte mit der Universalität von Schweizer Armeemessern. Hyperspaghettiklassen und -objekte. Kodierungs-Mißverständnisse Kopieren von Objekten. Identifikatoren und Identifizierung. Objekte entschlüpfen. Speichervergeudung. Fälle sind nicht gleich polymorphe Funktionen. Mißverständnisse bei der Qualitätssicherung Vergessen der kombinatorischen Explosion. Auskommen ohne Komponententests. Testen nach Abschluß. Unterschätzen des Testens und Kontrolle der Anforderungen und Kosten. Mißverständnisse bei der Wiederverwendung 74 CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 75 Unterschätzung der Wiederverwendbarkeit. Unrealistische Erwartungen. Zu enge Ausrichtung auf Kode-Wiederverwendung. Keine Beachtung der Wiederwendung. Verallgemeinerung zu spät. Zu komplexe Verknüpfungen. Zyklische Abhängigkeiten. 5.2.5 Objektrelationale Datenbanksysteme Obwohl mit den relationalen Datenbanken ausgereifte, leistungsfähige und theoretisch untermauerte Systeme vorliegen, ist der alleinige Einsatz des relationalen Datenbankkonzeptes in vielen Anwendungsfällen nicht befriedigend, da die Existenz von nur einfachen Datentypen Modellierungen komplexer Aufgabenstellungen nicht unterstützt. Objektorientierte Datenbanken sind zwar genau hierzu zu in der Lage, können aber nicht ohne weiteres Datenbestände aus den älteren relationalen Systemen übernehmen. Außerdem stellen objektorientierte Datenbanken keinen vollständigen Ersatz für relationale Datenbanken dar, da sie in den klassischen Anwendung für relationale Systeme, also Verwaltung großer, einfach strukturierte Datenbestände, gegenüber diesen Systemen konzeptionell im Nachteil sind. Objektrelationale Datenbanksysteme wurden entwickelt um die Vorteile des objektorientierten und des relationalen Konzeptes zu vereinen und dabei deren jeweilige Nachteile auszuschalten. Nachteile relationaler Datenbanksysteme. Die grundlegende Einschränkung relationaler Datenbanken ist Tatsache, daß diese von Hause aus nur einfache Datentypen anbieten und darüber hinaus nicht die Neudefinition von benutzerdefinierten Datentypen gestatten. Allein die Fähigkeit zum Umgang mit komplexen Datentypen würde den Datenbankentwurf in viele Fällen vereinfachen. Für komplexe Aufgabenstellung hat sich die objektorientierte Modellierung durchgesetzt. Objektorientierte Konzepte werden aber von relationalen Datenbanken in keiner Weise unterstützt, wodurch der Datenbankentwurf in solch einem Fall extrem umständlich wird. Ist ein solches komplexes, objektorientiertes Modell einmal in das Relationenschema umgesetzt worden, so können selten alle Attribute eines Objektes aus dem Ausgangmodell in einer Tabelle untergebracht werden. Vielmehr ist es notwendig ein Objekt auf mehrere Tabellen aufzuteilen. Sollen in solch einem Fall durch eine Anfrage alle Attribute dieses Objektes ermittelt werden, so sind hierzu explizite Join-Operationen notwendig. Für komplexe Aufgabenstellungen bei denen objektorientierte Modellierung angebracht ist wird also nicht nur der Datenbankentwurf komplizierter, sondern in vielen Fällen müssen auch die späteren Anfragen an die Datenbank umständlicher formuliert werden. Relationale Datenbanken kennen keine Objektidentität. Dieses Merkmal objektorientierter Datenbanken und Programmiersprachen erlaubt die Identifizierung eines Objektes selbst dann, wenn all seine Attribute in ihrem ursprünglichen Wert verändert worden sind. Wird ein Objekt in einem Tupel einer relationalen Tabelle gespeichert, so verliert es seine Identität, also die Möglichkeit es von außen eindeutig zu identifizieren sobald sein Primärschlüssel geändert wird. Von einer rein relationalen Datenbank wird auch Persistenz durch Erreichbarkeit nicht unterstützt. Bei diesem Persistenzkonzept werden alle Objekte in die Datenbank aufgenommen, die von einem bereits gespeicherten Objekt referenziert werden. Da auf diese Weise das Persistenzmerkmal von Objekt zu Objekt weitergegeben wird, ist z.B. das Abspeichern oder Löschen einer kompletten Listen mit nur einer Operation auf dem Listenkopf möglich. Bei relationalen Datenbanken muß man hierzu explizit jedes Element Speichern oder Löschen. Ein weiteres Manko ist die geringe Mächtigkeit von SQL, der Datenbankprogrammiersprache relationaler Systeme. Anspruchsvolle Berechnungen lassen sich besser oder ausschließlich in einer externe Programmiersprache verwirklichen. Auch ist es nicht möglich benutzerdefinierte Prozeduren oder Funktionen in SQL zu erstellen. Muß im Anwendungsfall auf eine externe Programmiersprache CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 76 ausgewichen werden, so kommt es beim Datenaustausch zwischen Datenbank und externer Programmiersprache zum sogenannten Impedance Mismatch. Dieser Begriff beschreibt den Umstand das die Typsysteme von Datenbank und Programmiersprache sich unterscheiden. So muß das externes Programm dafür sorgen, daß die von der Datenbank gelieferten Daten in das Typsystem der Programmiersprache umgesetzt werden. Umgekehrt müssen die, in die Datenbank zu transferierenden, Daten zuvor in einen Datenbankkonformen Typen konvertiert werden. Dieser zusätzliche Programmieraufwand ist nicht nur zeitraubend, sondern zudem eine unerwünschte mögliche Fehlerquelle. Abschließend nochmals eine Auflistungen der größten Schwächen relationaler Systeme: • keine komplexen Typen • keine Objektorientierung • keine Objektidentität, Primärschlüssel müssen durch Programmierer geeignet gewählt werden • keine Persistenz durch Erreichbarkeit • SQL als Programmiersprache nicht mächtig genug, keine benutzerdefinierbaren Prozeduren • Impedance Mismatch: Typen von SQL und externen Programmiersprachen passen nicht zueinander und müssen ineinander konvertiert werden Nachteile objektorientierter Datenbanksysteme. Trotz der im letzten Abschnitt beschriebenen Nachteile stellen relationale Datenbanksysteme derzeit die weit verbreitetste Technologie dar. Für die Datenbestände, die hier gepflegt werden, ist es für den Fall, daß die relationale Technologie nicht mehr als ausreichend erachtet wird, wünschenswert, daß sie mit möglichst geringem Aufwand auf das neue Datenbanksystem zu portieren sind. Aufgrund der grundlegenden Unterschiede zwischen relationalen und objektorientierten Systemen ist die Migration von Erstem zu Zweitem keineswegs ohne weiteres zu erledigen. Bei Anwendungsfällen, in denen sich die relationale Datenbanktechnologie bewährt hat, also vor allem beim Verwalten großer, einfach aufgebauter Daten, ist zwar prinzipiell der Einsatz von objektorientierten Systemen möglich, allerdings nicht sonderlich empfehlenswert. In diesen Fällen sind objektorientierte Datenbanksysteme in der Regel erhebliche langsamer. Ein Grund hiefür ist die gesteigerte Komplexität objektorientierter Datenbankprogrammiersprachen, die eine datenbankinterne Optimierungen von Lese- und Schreibzugriffen erschwert. Ein weiterer Nachteil, der mit der Komplexität und Leistungsfähigkeit objektorientierter Datenbankprogrammiersprachen zusammenhängt, ist die erhöhte Fehleranfälligkeit die diese Komplexität mit sich bringt. Je einfacher und überschaubarer eine Programmiersprache desto geringer ist auch die Wahrscheinlichkeit von Programmierfehlern, welche den Datenbestand einer Datenbank eventuell verfälschen könnten. Den objektorientierten Datenbanken fehlt das theoretische Fundament ihrer relationalen Verwandten, welche mathematisch mit Hilfe der Relationenalgebra eindeutig beschrieben werden können. Auch sind relationale Datenbankprodukte in der Regel ausgereifter, schließlich existieren diese Produkte seit Beginn der achtziger Jahre, während objektorientierte Datenbanken erst in den Neunzigern, einhergehend mit der Etablierung objektorientierter Entwurfs und Programmiermethoden, entstanden sind. Ein Rollenkonzept ist bei objektorientierten Datenbanken zwar vorhanden, allerdings in bestimmten Fällen recht aufwendig nur durch Mehrfacherbung zu realisieren. Allgemein kann gesagt werden, daß je mehr Rollen ein Objekt annehmen kann, desto umständlicher ist das objektorientierte Rollenkonzept. In Kapitel 2 wurde als grundlegende Anforderung an Datenbanksysteme die Datenunabhängigkeit genannt. Objektorientierte Datenbanksysteme besitzen allerdings weder ein Sichtenkonzept, welches logische Datenunabhängigkeit ermöglichen würde, noch implementieren sie externe Datenunabhängigkeit. Es wird die konzeptuelle Ebene, die Objektstrukturen, nahezu eins zu eins auf die verwendeten Massenspeichermedien ausgelagert. Das Fehlen von Datenunabhängikeit äußert sich bei nachträglichen Änderungen an konzeptueller oder physischer Ebene, und führt in diesen Fällen zu CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 77 einem Mehraufwand, beispielsweise zum Anpassen bereits bestehender Applikationen an neue Datentypen, der bei bestehender Datenunabhängigkeit nicht erbracht werden muß. Zusammenfassen weist ein objektorientiertes Datenbanksystem also folgende Schwachpunkt auf: • Migration relationaler Datenbestände in objektorientierte Datenbanken nicht ohne weiteres möglich • Performanznachteil bei großen, einfach strukturierten Datenbeständen • Höhere Anfälligkeit für Programmierfehler, da Datenbanksprache komplexer • keine theoretische Untermauerung, nicht so ausgereift wie relationale Systeme • Rollenkonzept in bestimmten Fällen umständlich • Keine Datenunabhängigkeit, da kein Drei-Ebenen Konzept Resultierende Anforderungen für objektrelationale Datenbanksysteme. Relationale Datenbanksysteme stellen heute eine etablierten Technologie dar, die in vielen Bereichen der Datenverarbeitung erfolgreich eingesetzt wird. Ein Großteil aller Geschäfts- und Prozeßdaten ist in relationalen Datenbanken abgelegt. Die von den Systemen angebotenen Datentypen und Anfragesprachen sind für die typischen Standard-Datenbankanwendungen ausreichend. Nicht-StandardDatenbankanwendungen stellen neue Anforderungen an Datenbanksysteme wie den Umgang mit komplex strukturierten Multimedia Daten. In einem Städteinformationssystem müssen beispielsweise Anfahrtspläne, Photographien und mit Bildern angereicherte Dokumente ebenso wie Audiodaten und Videos verwaltet werden. Aufgrund der anwendungsspezifischen Anforderungen an neue Datentypen, wäre eine herstellerseitige Ergänzung der vordefinierten Datentypen um neue Typen unzureichend. Es sollte vielmehr jedem Entwickler möglich sein, das Datenbanksystem seinen Bedürfnissen entsprechend mit neuen Datentypen und Funktionen zu erweitern. Somit werden die Anforderungen an ein neues Datenbankkonzept offenbar: Es sollte, um problemlose Übernahme vorhandener Datenbestände zu ermöglichen, auf der konventionellen relationalen Technologie aufsetzen und diese durch objektorientierte Erweiterungen ergänzen. Hierfür wäre eine objektorientierte Erweiterung des SQL-Standards wünschenswert, der erlaubt das Datenbanksystem mit neuen Typen, Funktionen und Regeln zu erweitern, ohne allerdings die Komplexität der Sprache ausufern zulassen. Genau dieser Gedanke wird von objektrelationalen Datenbanksystemen verfolgt. Ausgangspunkte für die aktuellen objektrelationalen Datenbankprodukte sind die etablierten relationalen Systemen, die die Hersteller nun um objektorientierte Konzepte erweitern, um die erwähnten Einschränkungen relationaler Systeme auszuschalten. Da mit SQL:1999 erst seit kurzem ein wohldefinierter Standard für objektrelationale Funktionalität besteht, ist die Implementierung objektrelationeller Merkmale in den verschiedenen Produkten auch unterschiedlich weit fortgeschritten. Merkmale objektrelationaler Datenbanksysteme. Das objektrelationale Konzept ist relativ neu, es ist durch Integration bekannter Ansätze und durch logische Weiterentwicklung entstanden. Seit vielen Jahren hat man immer wieder versucht das relationale Datenbankmodell zu erweitern, weil die Umstellung relationaler Datenbestände auf das strikte objektorientierte Konzept sehr umständlich bleibt. Bevor man aber auf das objektrelationale Modell gekommen ist, sind schon viele Neuerungen und Forschungen gemacht worden. Daraus sind neue Konzepte entstanden. Alle Konzepte sind unter dem Begriff “Postrelationales Datenbanksystem” zu verstehen. Der Name Postrelational soll an die unternommene Erweiterung des relationalen Modells erinnern. Zu den am häufigsten realisierten Konzepten zählen: • Erweiterte, vordefinierte und benutzerdefinierte Datentypen • Funktionen und Methoden • Typkonstruktkoren CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 78 • Objektidentität • Referenzen Die Basis für diese Systeme ist jeweils das Relationenmodell. Unterscheiden kann man Systeme dieser Entwicklungsrichtung wieder nach: • Relationalen Datenbanksystemen mit strukturellen Erweiterungen • Relationalen Datenbanksystemen mit Verhaltensmäßigen Erweiterungen • Relationalen Datenbanksystemen mit einem ADT-Konzept, wobei die ADTs gleichermaßen Struktur und Verhalten definieren • Relationalen Datenbanksystemen, die innerhalb des Relationenmodells relativ weitgehend ein objektorientiertes Datenbankmodell verwirklichen Wann ist ein System objektrelational? Das Unterscheidungsmerkmal zwischen relationalen und objektrelationalen Datenbanken ist die Unterstützung komplexer Datentypen. In der Praxis müßte man aber dadurch viele postrelationale Systeme, die die Objektorientierung nicht verwirklichen als objektrelational bezeichnen. Zwischen objektrelationalen und objektorientierten Datenbanken trennt man nach der Existenz von Abfragesprachen. Objektrelational fordert in erster Linie, daß das relationale Modell vollständig unterstützt wird. Begriffe wie Entitätstypen, Attribute, Tupel, Primärschlüssel und Fremdschlüssel, Projektion, Selektion und Verbindung von Tabellen gehören hier nach wie vor zum Grundvokabular. Das objektrelationale Model versucht darüber hinaus ein Datenbankmodell zu erschaffen das mit “einige OO-Konzepten in der Form einer Tabelle” charakterisiert werden kann. Persistente Daten werden schon längst mit einer Tabelle verarbeitet, hinzugekommen ist nun die Fähigkeit, das Felder der Tabelle strukturierte Daten bzw. abstrakte Datentypen einnehmen können sollen. Außerdem sollen aus dem objektorientierten Konzept Merkmale wie Vererbungsprinzipen und Methodenüberschreibung (Overriding) integriert sein. Erweiterung relationaler Datenbanksysteme um abstrakte Datentypen. Damit relationale Datenbanksysteme mit abstrakten Datentypen umgehen können benötigen sie die folgenden Erweiterungen: • komplexe, benutzerdefinierbare Datentypen • Funktionen, Methoden • Typenkonstruktoren Unter komplexen Datentypen versteht man Typen wie Struktur und Menge. Benutzerdefinierbare Datentypen resultieren aus der Kombination der internen Datentypen der Datenbank. Funktionen konnten bisher in Standard-SQL nicht erzeugt werden. Dieses, in herkömmlichen Programmiersprachen schon lange bekannte Konzept zur Programmstrukturierung und Wiederverwendung von Quellcode, kann somit auch in Datenbanken Verwendung finden. Angewandt wird es z. B. für benutzerdefinierbare Operationen in Anfragen. Hauptelement der Erweiterung um abstrakte Datentypen ist die Einführung von Methoden. Dabei handelt es sich um mit bestimmet Datentypen assoziierte Funktionen. In der Praxis werden Methoden verwand um zu Typen dazugehörigen Zugriffs- und Verarbeitungsfunktionen zu definieren. Neben den klassischen einfachen Typen wie ‘Integer’ mit den Funktionen ‘Addition’ und ‘Subtraktion’ kann man nun auch neue Datentypen wie ‘Bild’ mit den Funktionen ‘Bildanzeigen’ definieren. Jeder benutzerdefinierte Typ besitzt einen Konstruktor gleichen Namens, mit dem Objekte bzw. Instanzen dieses Typs erzeugt werden können. Durch Aufruf eines Konstruktors wird jedoch nicht nur eine Instanz eines Typen erzeugt, sondern der Konstruktor kann darüber hinaus als benutzerdefinierbare Methode angesehen werden, die bei jeder Erzeugung einer Instanz des Typen aufgerufen wird. CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 79 Aufgrund dieser Eigenschaft werden Konstruktoren z. B. für die Zuweisung von Initialwerten verwendet. Mit den hier erläuterten Merkmalen erweiterter relationaler Datenbanken ist es also möglich abstrakt Datentypen zu implementieren. Die Unterstützung abstrakter Datentypen ist attraktiv, weil Methoden als Operationen assoziiert mit diesen neuen Datentypen benutzt werden können um Datenmengen z. B. zu indexieren, zu speichern und Anfragen, die auf diese Datentypen basieren, zu realisieren. Objektorientierte Erweiterungen. Wie bereits erwähnt ist das wichtigste Merkmal von objektrelationalen Datenbanken die Vererbung. Hierbei handelt es sich um ein grundlegendes objektorientierten Konzeptes, welches vor allem dann von Vorteil ist, wenn aus Entity-Relationship-Modellen, Datenbankschemata entwickelt werden sollen. Mit herkömmlichen relationalen Datenbanken kann so etwas nämlich nicht direkt implementiert werden. Die abgeleiteten Typen erben alle Eigenschaften von übergeordneten Typ, können aber auch erweiterte spezifische Attribute zugewiesen bekommen, die nur für den Untertyp gelten. Diese Form von Vererbung, also das Vererben von Attributen von Basisklassen an Unterklassen, wird auch Strukturvererbung genannt. Eine Unterklasse erbt aber auch alle Methoden von der darüber liegenden Klasse. Soll eine Methode in einer Unterklasse aber nachträglich gegenüber einer geerbten Methode aus einer Basisklasse verändert werden, so wird dieser Vorgang als Overriding oder Überschreiben bezeichnet. Im objektorientierten Konzept existiert lediglich Vererbung auf der Ebene von Typen, die dort Klassen genannt werden. Eine auf Basis dieser Vererbung erzeugte Hierarchie wird Typenhierarchie genannt. Objektrelationale Systeme kennen weitergehend auch Vererbung auf Tabellenebene, bei der eine Tabelle erstellt werden kann, indem sie Attribute einer bereits bestehenden Tabelle übernimmt. Eine solche Tabellenhierarchie wird auch als Relationenhierarchie bezeichnet. Eine weiteres nützliches Merkmal, daß die objektrelationalen von den objektorientierten Datenbanken übernommen haben ist die Objektidentität. Zu jedem Objekt wird automatisch ein systemweit eindeutiger Identifikator erzeugt (OID), der z.B. zur Modellierung von Beziehungen durch Referenzen herangezogen werden kann. Dieser Identifikator bleibt während der Lebenszeit des Objekts unverändert. Mit dem OID können Referenzen erzeugt werden. Eine Referenz gleicht dem Speichern eines Fremdschlüssels in einer Tabelle und dient dazu auf ein Objekt oder auf ein Tupel in einer Tabelle zu zeigen. Beziehungen können durch Referenzen aber “natürlicher” dargestellt werden, als durch künstlich eingeführte Fremdschlüsselattribute. Sobald Referenzen vorhanden sind kann zwischen verschiedenen Objekten bzw. Tupeln direkt navigiert werden. Somit werden komplexe Abfragen, die im relationalen Modell Joins über mehrere Tabellen erfordern, u.U. erheblich vereinfacht, wenn die Beziehung durch Referenzen modelliert wird (weniger Tabellen in der from-Klausel, besser lesbare Anfragebedingungen). Objektrelationale Erweiterungen zu SQL. Der lange Zeit unter dem Namen SQL3 entwickelte Standard für objektrelationale Datenbanksprachen ist 1999 unter dem Namen SQL:1999 verabschiedet worden. Es fehlt diesem noch die Möglichkeit zur Mehrfacherbung, welche erst mit SQL:2003 angestrebt wird. Der Aufbau des SQL:1999-Standards besteht wie folgt aus 9 Teilen: 1. Framework: Dieser Teil beschreibt den Aufbau des Standards 2. Foundation: Die Foundation ist der eigentliche Kern des Standards 3. SQL / CLI: Das Call Level Interface des SQL:1999 Standards 4. SQL / PSM: Dies sind die sog. Persistent Storage Modules 5. SQL / Bindings 6. SQL / Transaction 7. SQL / Temporal CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 80 8. SQL / MED: Das Management externer Daten 9. SQL / OLB: Das Object Language Binding, was auch dem SQLJ entspricht Wir wollen hier nicht die vollständige Liste aller SQL:1999- und SQL:2003-Erweiterungen angeben. Stattdessen verweisen wir auf die Vorlesung Datenbanksysteme III. Die folgende Liste ist nicht vollständig, zeigt aber das wesentliche auf: Ausgezeichnete Typen: CREATE TYPE <Distinct-Typname> AS <Quelltyp> FINAL; Konstruierte Typen: Kollektionen: <Elementtyp> ARRAY [<Max-Kardinalitaet>] Zeilentypen: ROW(<Feldname> <Datentyp>, ...,<Feldname> <Datentyp>) Strukturierte Typen: Wurzeltypen: CREATE TYPE <Typname> AS ( <Attributdefinitionsliste> ) [[NOT] INSTANTIABLE] NOT FINAL [OID-Typspezifikation] [<Methodendeklarationsliste>] Subtypen: CREATE TYPE <Subtypname> UNDER <Supertypname> AS ( <Attributdefinitionsliste> ) [[NOT] INSTANTIABLE] NOT FINAL [<Methodendeklarationsliste>] Methoden: Deklaration: [INSTANCE|CONSTRUCTOR|STATIC] METHOD <Methodenname>(<Parameterdefinition>) RETURNS <R\"uckgabetyp> [SELF AS RESULT] Implementierung: CREATE [INSTANCE|CONSTRUCTOR|STATIC] METHOD <Methodenname>(<Parameterdefinition>) RETURNS <R\"uckgabetyp> FOR <Typname> <Methodenrumpf> Tabellen: CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB CREATE TABLE <Tabellenname> OF <Typname> ( <OID-Generierung> [,<Spaltenoptionsliste>] [,<Tabellenbedingungsliste> ) CREATE TABLE <Tabellenname> OF <Typname> UNDER <Supertabellenname> ( <OID-Generierung> [,<Spaltenoptionsliste>] [,<Tabellenbedingungsliste> ) Prozedurales SQL: Zusammengesetzte Anweisungen BEGIN [ [ NOT ] ATOMIC ] [ <Deklaration1>; ... ] [ <SQL-Anweisung1>; ... ] [ EXCEPTION <Ausnahmebehandlung>; ] END; Variablendeklaration: DECLARE <Variablen-Namen-Liste> <Typ> [ Initialisierungswert ]; Zuweisung: SET <Ziel> = <Quelle>; IF-Anweisung: IF <Bedingung1> THEN <Anweisungs-Liste1> [ ELSEIF <Bedingung2> THEN <Anweisungs-Liste2> ... ] [ ELSE <Anweisungs-ListeN> ] END IF; While-Schleife: WHILE <Bedingung> DO <Anweisungs-Liste> END WHILE; Prozeduren: CREATE PROCEDURE <Prozedur-Name> ( [ <Parameter-Liste> ] ) BEGIN ... END; Funktionen: 81 CAU Kiel, IfI, ISE β Basisdatentypen in SQL99+ Basisdatentyp SMALLINT INTEGER DECIMAL(p,q) NUMERIC(p,q) FLOAT(p) , REAL DOUBLE CHAR(q) VARCHAR(q) BIT(q) BIT VARYING(q) DATE TIME TIMESTAMP INTERVAL XML SS 2008 Datenbanken I Bedeutung ganze Zahl Festkommazahl mit Genauigkeit p und q Fließkommazahl mit Genauigkeit p Zeichenkette mit fester bzw. variabler Länge bis zu q Bitfolge mit fester bzw. variabler Länge bis zu q Datum Zeit Zeitstempel Zeitintervall XML-Wert 5. Komplex strukturierte DB Beispielwerte 1704, 4070 1003.44, 160139.9 1.5E-4, 10E20 ’Das ist eine Zeichenkette’, ’SQL:1999’ B’01101’, X’9E’ DATE ’1997-06-19’, DATE TIME ’20:30:45’ TIMESTAMP ’2002-08-23 INTERVAL ’11:15’ HOUR TO <Titel>SQL:2003 CREATE FUNCTION <Funktions-Name> ( [<Parameter-Liste>] ) RETURNS <R\"uckgabetyp> BEGIN ... RETURN <Wert>; END; Trigger: CREATE TRIGGER <Name> ( BEFORE | AFTER | INSTEAD OF ) ( DELETE | INSERT | UPDATE [ OF <Spalte>, ...]) [ OR (DELETE | INSERT | UPDATE [OF ...])] ... ON ( <Tabelle> | <Sicht> ) [ REFERENCING OLD AS <alt> NEW AS <neu>] [ FOR EACH ( ROW | STATEMENT ) ] [ WHEN ( <Bedingung> ) ] <Trigger-Kode in prozeduralem SQL>; 5.3 Ausblick 82 CAU Kiel, IfI, ISE β SS 2008 Datenbanken I 5. Komplex strukturierte DB 83 Literaturhinweis Bernhard Thalheim: Entity-Relationship Modeling, Foundations of Database Technology. Springer, 2000. ISBN 3-540-65470-4 An die Teilnehmer der Veranstaltung wird der Verkauf des Buches zu einem ermäßigten Preis (80% bzw. weniger) durch das Sekretariat TIS organisiert. Bitte sprechen Sie persönlich bei Frau Kruse vor. Die folgenden Bücher sind als Ergänzung des Stoffes dieses Kapitels geeignet: Alfons Kemper, André Eickler: Datenbanksysteme - Eine Einführung, 5. Auflage. Oldenbourg 2003 Die Skripte zur Vorlesung sind abgelegt unter: http://www.is.informatik.uni-kiel.de/∼thalheim/vorlesungen/kemper/kapitel1.pdf — kapitel 13.pdf Meike Klettke, Holger Meyer: XML & Datenbanken. dpunkt Verlag, 2003 Diese Buch ist die beste und profundeste Einführung in die Datenbankgrundlagen von XMLDatenbanksystemen. Folien zum Buch findet man unter http://www.xml-und-datenbanken.de/ Zusammengefaßte Arbeiten des Lehrstuhles zu Thema Objektorientierung: http://www.is.informatik.uni-kiel.de/∼thalheim/OOreport.ps.gz Weitere Literaturquellen zu diesem Kapitel der Vorlesung sind: • Jeffrey D. Ullman, Jennifer Widom: A First Course in Database Systems. Prentice-Hall 1997