Beruflich Dokumente
Kultur Dokumente
durch
Michael Fuchs
Inhaltsverzeichnis
1 EINLEITUNG..................................................................................................................... 5
1.1 VORBEMERKUNG.................................................................................................................5
4.4 DATENBANK-TABELLEN.....................................................................................................18
6.3.1 Funktionen, die in den Körpern der drei Schleifen aufgerufen werden.........49
6.3.2 Hilfsfunktionen, die für die Schleifenterminierung benötigt werden..............50
6.3.3 Die elementaren Funktionen...........................................................................51
6.3.4 Der Gesamt-Algorithmus................................................................................52
6.4 BEWEIS MIT INDUKTION ZUR RICHTIGKEIT DES SATZES......................................................53
7 EXPERIMENTE................................................................................................................ 57
ANHANG A............................................................................................................................ 69
ANHANG B............................................................................................................................ 71
ANHANG C............................................................................................................................ 76
ANHANG D............................................................................................................................ 81
ABBILDUNGSVERZEICHNIS................................................................................................... 85
TABELLENVERZEICHNIS...................................................................................................... 86
LITERATURVERZEICHNIS..................................................................................................... 87
Seite 4t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
1 Einleitung
1.1 Vorbemerkung
Man findet in der heutigen Zeit in fast allen Lebensbereichen multimediale Informationen,
die durch fortschreitende Rechnertechnologie, sinkende Beschaffungskosten und Vereinfachung
der Hard- und Softwarebedinung zu erklären ist. Einen wesentlichen Anteil trägt natürlich auch
das Internet, das ohne multimediale Informationen gar nicht mehr denkbar ist.
Neben Video und Audio kommen wir mit dem Internet auf ein wichtiges Medium, den
Text. Eine Seite im Internet ist als besonderer Text abgespeichert. Man nennt diese Textform
HTML und steht für "Hyper Text Markup Language" . HTML ist aber kein einfacher Text,
sondern eine Sprache (wie das Wort "Language" schon ausdrückt) mit syntaktischen und
semantischen Regeln und ist ein Dialekt aus der Familie SGML (Standard Generalized Markup
Language).
Mit SGML hat man die Möglichkeit, Teile des Textes mit sogenannten Markups
hervorzuheben und auch Zusatzinformationen oder Optionen (Attribute) über den Inhalt zu
bestimmen. Diese hervorgehobenen Textteile kann man dann gesondert behandeln. Beispiele
für diese 'Sonderbehandlung' sind : Sprünge ausführen, Informationen über den Inhalt oder
Inhalte selbst abfragen, Schrift des Inhalts ändern usw. Diese Hervorhebungen kann man
jedoch nur optimal nutzen, wenn auch mehrere SGML-Texte zusammen abgespeichert sind
und es Möglichkeiten gibt, um diese markierten Textteile auch von mehreren Dokumenten
abzufragen. So etwas ist mit Textverarbeitungssystemen, im herkömmlichen Sinne, nur schwer
bis überhaupt nicht möglich.
Seite 5t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Um Daten abzuspeichern und sie dann später abzufragen, hat sich die
Datenbanktechnologie bewährt. Hierbei hat sich das relationale Datenbankschema in den
letzten Jahren als populärstes Schema hervorgetan. Für dieses Datenbankschema gab es eine
Reihe von Optimierungen, die eine sehr schnelle Abfrage von Daten ermöglicht.
Das Problem bei der Verwaltung von multimedialen Informationen mit einer relationalen
Datenbank ist aber schon an dem Beipiel 'großer Text' zu illustrieren. Die relationale
Datenbank hat nur einfache Datentypen. Unter anderem können Texte, nur bis zu einer
gewissen Größe, in der Datenbank gespeichert werden. SGML-Textteile können aber beliebig
groß sein und somit ist das relationale Datenbankschema, in seinem Ursprung, nicht Ideal für
die Verwaltung von multimedialen Informationen. Wenn man diese Dokumentteile (und dessen
Behandlung) jetzt nicht nur als Felder in einer Datenbank, sondern mehr als Objekte, ansieht,
dann bietet sich das objektorientierte DBMS (DatenBank Management System) an. Eine
solche Verwirklichung besteht in dem System HyperStorM (Hypermedia Document Storage
and Modelling) ([BANY95]) welches auf dem objektorientierten Datenbanksystem 'VODAK'
([IPSI95]) entwickelt wurde.
Die im Laufe der Jahre gewonnenen Erkenntnisse zur Optimierung von 'Queries' in
relationalen Datenbanken wurde genutzt, um ein neues Datenbankschema zu entwickeln,
welches auch den Objektgedanken integriert. Man nennt es das objektrelationale DBMS. Mit
diesem DBMS kann man alle Vorteile einer relationalen Datenbank nutzen und zusätzlich
Objektkonzepte behandeln. Somit können wir in einem solchen System, multimediale Objekte
speichern und darauf zugreifen. Eine genauere Diskussion über das Auswählen des geeigneten
Datenbankschemas liefert [Sto96].
In dieser Arbeit sollen nun die Ideen und Erfahrungen von HyperStorM übernommen und
auf ein solches objektrelationales DBMS projeziert werden. Das hierbei gewählte
objektrelationale System ist IUS (Informix Universal Server). Mit einer Menge von
'build in'-Funktionen und einigen Innovationen wurden dann Evaluierungen vorgenommen.
Diese Experimente stützen sich wiederum teilweise auf die Erfahrungen, die in HyperStorM
beobachtet wurden.
Seite 6t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Kapitel 2 soll einen Überblick über das objektrelationale Datenbankschema geben und
geht dabei insbesondere auf das gewählt System IUS ein. Im Kapitel 3 werden dann Grund-
sätze von SGML erläutert und Verwaltungsmechanismen beschrieben. Die Architektur
einzelner Komponenten (wie zum Beispiel der SGML-Parser, die Datenbank, usw.) sowie des
Gesamtsystems wird in Kapitel 4 aufgezeigt. Danach folgt die Beschreibung der
Implementierten Funktionen im Kapitel 5. Motivation, Beschreibung und Verifikation des
Algorithmus getAllContaining, der das Fragmentieren von Dokumenten mit komplexer DTD
erleichtern soll, sind im Kapitel 6 zu finden. Der evaluierende Teil der Arbeit in Form von fünf
Experimenten befindet sich im Kapitel 7. Zum Ende, in Kapitel 8, gibt es, nach einer
Zusammenfassung noch ein paar abschließende Bemerkungen und eine Aussicht. Im Anhang
befinden sich ausführliche Beispiele für eine DTD, Super-DTD-Instanz und SQL-Skripten.
Seite 7t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
2. Relationale Datenbank mit einfachen Datentypen und SQL (Standard Query Language)
Vorteil von der Kategorie 1 ist die Einfachheit im Behandeln der Objekte, es gibt jedoch
keinerlei Datenbankfunktionalitäten. Kategorie 2 ist die weit verbreitetste Datenbankform. Mit
einem solchen Datenbanksystem operiert man auf einfachen Datentypen. Die Behandlung von
Daten durch Queries wurde im Lauf der Jahre optimiert. Alle Anwendungsfälle, die keine
komplexeren Datentypen benötigen, werden optimal mit der relationalen Datenbank
unterstützt. Komplexe Datentypen können, wenn überhaupt, nur umständlich mit relationalen
Datenbanksystemen verwaltet werden. Um komplexe Datentypen zu behandeln, wurde das
objektorientierte Datenbanksystem entwickelt. In Kategorie 3 ist die Modellierung eines
Seite 8t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Objektes sehr flexibel und einfach, der Zugriff dagegen ist sehr komplex. Um von der
Einfachheit und Mächtigkeit des relationalen Zugriffs zu profitieren, wurde die realtionale
Datenbanktechnik für Modellierung und Zugriff auf komplexe Datentypen erweitert. Diese
neuen Systeme gehören zu Kategorie 4. Auf einem solchen objektrelationalen System wurde
diese Arbeit implementiert und evaluiert. Das gewählte objektrelationale System trägt den
Namen IUS (Informix Universal Server). Andere Beispiele für die Ausnutzung der
verschiedenen Kategorien kann man im Kapitel 14 in [Sto96] finden.
Seite 9t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
In diesem Beispiel wird die DataBlade-Funktion getAll aufgerufen und das Ergebnis wird
in die vorher ausgewählte Ausgabe übergeben. Die Eingabe-Parameter sind vom Typ
char(128). Man kann also 128 Zeichen lange Strings als Parameter übergeben. Als Rückgabe
bekommt man ein clob.
select etName
from nonFlatElemTable
where isContainedIn(own_id , 10)
Seite 10t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
In diesem Kapitel werden einige Grundkenntnisse über die Struktur in Unterkapitel 3.1
vermittel. In 3.2 geht es um die Verwaltung von SGML-Dokumenten, auch anhand eines
Beispiels, sowie speziell gewählte Verwaltungsmechanismen. Es handelt sich hierbei um das
Konfigurieren von Dokumenten.
Seite 11t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
<article status="final"> article hat ein Attribut namens 'status' mit dem Wert 'final'
<title>From Structured Document to Novel Query Facilities</title>
<author>D. David</author>
<author>R. John Das ist ein Author ohne Endtag !
... ...
<abstract>
Structured documents (e.g., SGML) can benefit a lot from
database support and more specifically from object-oriented
database(OODB) management systems
</abstract>
<section>
<sectitle>Introduction</sectitle>
......
Seite 12t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
DTD:
<!DOCTYPE article [
<!ELEMENT article (title,author+,affil,abstract,section+,acknowl)>
<!ATTLIST article status (final|draft) draft>
<!ELEMENT title (#PCDATA)> Parsed Character Data;
<!ELEMENT author (#PCDATA)> Ist der eigentliche Inhalt eines
<!ELEMENT abstract (#PCDATA)> terminalen Elementes.
<!ELEMENT section ((title, body+) | (title, body*,subsectn+))>
<!ELEMENT sectitle (#PCDATA)>
<!ELEMENT subsectn (title, body+)>
<!ELEMENT body (figure | paragr)>
<!ELEMENT figure (picture, caption?)>
<!ATTLIST figure lable ID #IMPLIED
<!ELEMENT picture EMPTY>
<!ATTLIST picture sizex NMTOKEN "16cm"
sizey NMTOKEN #IMPLIED
file ENTITY #IMPLIED
<!ELEMENT caption (#PCDATA)>
<!ENTITY fig SYSTEM "/u/chris/SGML/image1" NDATA>
<!ELEMENT paragr (#PCDATA)>
<!ATTLIST figure reflable IDREF #REQUIRED>
<!ELEMENT acknowl (#PCDATA)>
]>
Abbildung 3.1-2: Eine Beispiel-DTD vom Dokumenttyp 'article'
Seite 13t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Bei der Verwaltung von SGML-Dokumenten hat man die Möglichkeit, jedes
strukturierte Dokument-Element als eigenes Datenbankobjekt zu speichern. Dies wird auch in
der Abbildung 3.2-4 deutlich. Hier ist das Beispiel-Dokument als Baum dargestellt. In dem
Baum entspricht jeder Knoten einem eigenen Datenbank-Objekt. Die flachen Datenbank-
Objekte bilden die Blätter dieses Baumes und sind in der Baumdarstellung mit einem Rahmen
versehen.
author
Weiterhin gibt es auch die Möglichkeit, die Speicherung der Dokument-Elemente in einer
anderen Weise zu organisieren. Extremfall wäre die Speicherung des SGML-Textes, ohne
Strukturierung und als Ganzes. Eine Mischung aus diesen zwei Extremen wurde für diese
Arbeit gewählt.Bei dieser Variante (hybride Speicherung [BAK95]) ist es nun möglich,
bestimmte Dokument-Elemente zusammenzufassen und als komplett markierte Textteile in
flache Datenbank-Objekte zu speichern. In Abbildung 3.2-4 ist wieder das Beispieldokument
in Baum-Darstellung. In diesem Falle sind aber die Dokument-Elemente vom Typ 'sectitle',
'body', 'paragraph' zu einem flachen Datenbank-Objekt zusammengefaßt. Diese verschiedenen
Seite 14t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
David
ctitle>Introduction</sectitle> John <sectitle>SGML preliminaries</sectitle>...
.....
<body><paragr>In this section, we present the main features of SGML. (A general presentation is clearly be
ody><paragr>This paper is organized as follows.Section 2 introduces the SGML standard. The mapping from SGML to the O2 DBMS is defined in Section 3. Section 4 presents the extension ...
...
ody>
</body>
From Stuctured Structured documents
Documtent...Facilit .....management system
Seite 15t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Der SGML-Parser SP ist in mehrere Komponenten aufgeteilt, wobei hier nur die
Komponenten genannt sind, die direkt mit der SGML-Datenbankverwaltung zu tun haben. Die
in der Abbildung links befindliche Komponente ist eine C++-Klasse (elementOutput), die aus
einer DTD eine SuperDTD-Instanz erstellt. Genaueres über diese Generierung befindet sich im
Kapitel 4.6.2. Die rechte Komponente hingegen ist eine Klasse (ModFuncs), die Funktionen
der ESQL-Schnittstelle aufruft. Diese Funktionen sind im wesentlichen zum Erstellen der
Dokument-Elemente und der Index-Strukturen. In dieser Komponente wird auch die
Konfigurations-Datei ausgelesen und ebenso werden die Index-Informationen aus der
SuperDTD-Instanz geholt.
Die ESQL/C-Schnittstelle ist eine Sammlung von Funktionen, die in der Sprache C
implementiert sind und eine extended SQL-Schnittstelle verwenden. Diese ESQL/C-Sprache
Seite 16t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
wird dann mit einem 'Precompiler' zu einem C-Quellcode und hinterher zu einem ausführbaren
Objekt compiliert.
execute function
oder SQL-Abfragen
SGML-Parser
SP-Komponente
SP-Komponente Schnittstelle DataBlade API
zum
zum
Einfügen
Erstellen der
in die
SDTD-Instanz
Datenbank
Index-Strukturen
C++ ESQL/C -
Dokumente
SuperDTD-
Instanzen
Abbildung 4.1-5: Architektur des Gesamtsystems
SQL C Beschreibung
char mi_char entspricht dem char in C
int mi_integer entspricht dem int in C
boolean mi_boolean entspricht dem int in C, mit true oder false als 1 oder 0
varchar mi_lvarchar* Zeiger auf ein String mit variabler Zeichenanzahl(max.
32KB)
clob MI_LO_HANDLE* Handle auf ein Dateiartigen Text (max. 4 GB)
collection MI_COLLECTION * Handle auf eine geordnete/ungeordnete Liste oder
Menge
Tabelle 4.2-1: Datentypen von den verschiedenen Schnittstellen
Seite 17t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
4.4 Datenbank-Tabellen
Im flogenden Unterkapitel werden zehn Tabellen aufgelistet. Diese Tabellen werden zur
Speicherung von Dokumenten und Metainformationen benutzt.
DocumentTable : In dieser Tabelle wird der 'Kopf' der Datei gespeichert. Der Kopf
besteht aus name, dem Namen des Dokumentes (mit Pfad, wenn dieser beim Einfügen mit
angegeben wurde) und aus Referenzen dtdref bzw. root zur DTD und zum Wurzel-Element
des Dokuments. own_id ist die oid des Datenbankobjekts.
Seite 18t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
repräsentiert. pcdataindexed gibt an, ob für diesen Elementtyp ein PCDATA-Index angelegt
ist.
Die folgenden drei Tabellen vom Typ docElem, nonFlatElem und flatElem stehen in
Beziehung zu einander. Wie in Abbildung 4.4-6 zu erkennen ist, sind die Typen nonFlatElem
und flatElem, Erben vom Typ docElem. In den entsprechenden Tabellen werden jedoch nur
die Felder beschrieben, die diese Typen nicht gemeinsam haben.
docElem
flatElem nonFlatElem
DocElemTable : In diese Tabelle werden die Felder doc, up, succ, pred, aller
Dokument-Elemente gespeichert. doc ist eine Referenz auf das Dokument-Objekt, das in der
DocumentTable gespeichert ist. up hat als Inhalt die oid des logischen Vater-Elements und in
succ bzw. pred sind die oids des logischen Vorgängers bzw. Nachfolgers gespeichert.
Seite 19t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Seite 20t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
In Abbildung 4.4-7 wird ein Zusammenspiel der oben beschriebenen sechs Tabellen
skizziert, die direkt mit der Dokumentspeicherung zu tun haben. In der DocumentTable wird
der Name und eine Referenz auf die entprechende DTD gespeichert. Diese DTD wird in der
DTDtable repräsentiert. In dieser DTDtable wird der Dokumenttyp-Name gespeichert, sowie
die Menge der entsprechenden Elementtypes und die Konfiguration. Normalerweise werden
die Elemente eines Dokuments in vier Tabellen aufgeteilt. (DocElemTable, NonFlatElemTable,
AttrRecTable und FlatElemTable).
FlatElemTable DocElemTable DocumentTable
flat own_id doc up succ pred own_id name dtdref root
"Text zu Elem1" 0 1 - - - 1 "Dok1" 2 0
"Text zu Elem4" 1 1 0 - - 2 "Dok2" 1 2
"Text zu Elem6" 2 2 - - - 3 "Dok3" 1 9
"Text zu Elem8" 3 2 2 5 -
"Text zu Elem10" 4 2 3 - -
5 2 2 7 3 attrRecTable
6 2 5 - - element name value
NonFlatElemTable 7 2 2 - 5 2 Attr2 AW2
down etName 8 2 7 - - 3 Attr3 AW3
1 "E0" 9 3 - - -
3 "E2" 10 3 9 - - DocumentTable
4 "E3" own_id name etypes config
6 "E5" 1 "DTD1" {...} "...."
8 "E7" 2 "DTD2" {...} "...."
10 "E9" 3 "DTD3" {...} "...."
Abbildung 4.4-7: Zusammenspiel der Tabellen, die zur Speicherung der Dokumente beteiligt sind.
Seite 21t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Der Name des SP-Programmes ist „nsgmls“. Die Optionen, die dabei in der
Komandozeile eingegeben werden sind "-x" "-y" und "-X". Die C++-Dateien
elementOutput.cxx (SuperDTD-Instanz-Erstellen) und ModFuncs.cxx (DB-Einfügen) sind
speziell für die diese Zwecke entwickelt worden. ModFuncs.cxx wird dabei von dem Parser
benutzt und ruft die Schnittstellenfunktionen von der ESQL/C-Datei functions.ec auf.
Seite 22t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Funktion : Beim Einfügen muß man die Datenbank angeben. DB-name ist der
Name der gewälten Datenbank.
Ein Dokument mit dem Namen hamlet.sgm und der Konfiguration cfg
wird mit diesem Befehl in die Datenbank ius_sgml eingefügt.
Seite 23t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
create.sql erstellt alle Datentypen, die in der Datenbank verwendet werden sowie alle
Tabellen.
inits.sql initialisiert die Tabellen mit Null-Werten und richtet auch die notwendigen
Elementtypen sowie die DTD-Referenzobjekte ein.
delete.sql löscht alle Datentypen, Tabellen und deren Inhalte. Dieses Skript ist
hauptsächlich zur Behandlung von Updates, die auch Tabellendesign oder Datentypen
betreffen.
Zum Erstellen des SGML-DataBlades wird die 'library' sgml_server.so kompiliert und
mit dem SQL-Skript func.sql werden die Funktionen in die Datenbank eingefügt. Die Skripte
create.sql und inits.sql sind im Anhang C und D aufgelistet.
Seite 24t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
SGML- SGML-
DTD SP SDTD-Instanz
Benutzer
SDTD-Instanz
als Dokument SP modifizierte
in DB SGML-
SDTD-Instanz
SGML- SGML-
Dokument Dokument
SP in DB
Konfigurations- SGML-
Datei DTD
Als Vorbereitung wird aus der SGML-DTD des Dokumentes eine SuperDTD-Instanz
generiert. Dieses Dokument enthält im wesentlichen alle Informationen aus der DTD, plus
zusätzliche Informationen, die die Erstellung der Indizes betrifft. Diese Generierung wird mit
Default-Werten durch den SGML-Parser durchgeführt. Um die drei Indexstrukturen zu
bestimmen, werden entsprechende Einträge durch den Benutzer in die Super-DTD-Instanz
eingetragen. Im wesentlichen handelt es sich um Attribute der entsprechenden Super-DTD-
Instanz-Elemente .
Im Dokumentelement vom Typ <ELEM> gibt es das Attribut ELEMINDEX, das als
Attributwert 'Y' oder 'N' annehmen kann. Ist der Attributwert 'Y', dann wird ein Index für
PCDATA angelegt, daß heißt, ein Indexeintrag enthält die Elementtyp-Id, den entsprechenden
Dokument-Elements und die Positionen, bei denen der Inhalt auftritt. Falls der Attributeintrag
'N' entspricht, wird kein Index erstellt. Ein weiteres Attribut trägt den Namen
Seite 25t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
STRUCTINDEXED und enthält alle Elementtyp-Namen, für die ein strukturierter Index
angelegt werden soll. ELEMNAME ist der Name des externen Elementtyps und in
STRUCTINDEXED befinden sich alle Namen der internen Elementtypen. Ein Indexeintrag
enthält die Elementtyp-Id des externen und des internen Elementtyps, sowie den Inhalt des
internen Dokument-Elements und eine Menge aller Positionen, bei denen der Inhalt auftritt.
Beispiel :
SuperDTD-Instanz-Zeile :
<ELEM elemName="NAME"..ELEMINDEX='Y'
STUKTINDEX='VORNAME,...' ...>
</ELEM>
Dokument-Zeilen :
<NAME>
<VORNAME>Michael </VORNAME>
<NACHNAME>Fuchs</NACHNAME>
</NAME>
PCDATAIndex-Instanz :
Um den eindeutigen Elementtyp zu bestimmen, wird die oid des Elementtyps im Index
verwendet. In diesem Beispiel handelt es sich um die oid des Elementtyps NAME. Der Inhalt
"Michael Fuchs" kommt im strukturierten Element mit der Position 10|-1 vor und in dem
flachen Dokument-Element, mit der oid 15, zweimal vor.
structIndex-Instanz :
Das Gleiche, was für die PCDATAIndex-Instanz gilt, gilt auch für die
structIndex-Instanz. Der Inhalt eines Elementes ist aber nur die erste Bedingung für den Index.
Seite 26t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Das Element, das "Michael" beihalten soll und vom Elementtyp VORNAME ist, muß auch
noch in einem Element vom Typ NAME enthalten sein.
Ein weiterer Elementtyp in der SuperDTD-Instanz ist <ATTRIBUTE>. Hier ist das
Attribut ATTRINDEX für den Attribut-Index verantwortlich. Hat es den Attributwert 'Y',
dann wird eine Index-Instanz angelegt, die die oid, sowie den Attribut-Name und den Attribut-
Wert des entsprechenden Elementtyps enthält und ebenso die Positionen, bei denen dieses
Attribute-Paar auftritt. Ist der Attributwert 'N', wird kein Index angelegt.
Beispiel :
SuperDTD-Instanz-Zeilen :
<ELEM elemName="NAME"..>
</ATTRIBUTE>
</ELEM>
Dokument-Zeile :
<NAME NACHNAME="Fuchs">
....
</NAME>
AttribIndex-Instanz :
Seite 27t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
select getDocNamebyOid(doc)
from FlatElemTable
where isInside(own_id,"Michael Fuchs")
Seite 28t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
5 IUS- Schnittstellen-Funktionen
Das Kapitel fünf beschäftigt sich mit den Funktionen, die als Schnittstelle für das
objektrelationale Datenbanksystem fungieren. Die Auflistung ist in drei Teile untergliedert. Der
erste Teil (5.1) befaßt sich mit den Funktionen, die zum SP gehören. Sie sind in der Sprache
C++ verfaßt und rufen im wesentlichen ESQL/C Funktionen auf. Diese ESQL/C-Funktionen
werden im zweiten Teil (5.2) aufgelistet. Im dritten Teil (5.3) gibt es eine Darstellung aller
Funktionen, die in API/C implementiert und teilweise als DataBlade-Funktionen in die
Datenbank integriert wurden.
void daiInterClose()
Funktion Aufrufen der zum Schließen der Verbindung zur Datenbank
close_connection
Rückgabewert Keiner
void daiInterBeginTagClose()
Funktion Eine Spezialbehandlung für 'Starttags' mit fehlendem 'Endtag'. Das 'Endtag'
wird zugefügt. Dies entspricht dem Prinzip des Vorrausparsens.
Rückgabewert Keiner
Seite 30t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Seite 31t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
int close_connection()
Funktion Schließt die aktuelle Verbindung zur Datenbank.
Rückgabewert Keiner
Seite 32t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Seite 33t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Seite 34t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Seite 35t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Bemerkung Die Position in dem obigen Beispiel wird als String übergeben und entspricht
dem Paar von zwei Integer-Werten, 10 und 100. Die Transformation von
String zu 'Integer|Integer' wird jeweils in der Funktion übernommen. Der
erste Integer-Wert entspricht der oid und der zweite entspricht dem Offset in
dem flachen Element. Wenn das Element nicht flach ist, ist der Offset : -1.
Seite 36t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Seite 37t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Seite 38t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
5.3.2 Ausgabe-Funktionen
Seite 39t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Seite 40t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Seite 42t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Seite 43t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Seite 44t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Seite 45t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Eine Inclusion ist ein Elementtyp, der in der Definition eines Elementtyps eine besondere
Rolle spielt. Ein Beispiel ist die Fußnote: +(FN). Wenn eine Elementtyp-Definition diese
Inclusion beinhaltet, dann können alle Elemente, die in diesem Element enthalten sind auch eine
Fußnote (Element vom Typ 'FN') enthalten.
<!ELEMENT B (C)*>
Der Elementtyp FN ist eine Inclusion in der Definition vom Elementtyp A, daß heißt, FN
darf in jedem Dokument-Element vom Typ A enthalten sein (muß aber nicht). Aus der Sicht
von A gesehen, verhält sich das genauso bei C. Die Fußnote FN darf aber auch in C enthalten
sein, da C der direkte Nachfolger von A ist. Weiterhin darf FN auch in D und E enthalten sein,
denn sie sind indirekte Nachfolger von A. Exclusions werden genauso definiert wie Inclusions,
mit dem Unterschied, daß ein Exclusion-Typ nicht enthalten sein darf und das gilt auch für alle
direkt oder indirekt enthaltenen Elementtypen.
(Genaue Definitionen in [Her94])
Diese Inclusions erschweren nun die Berechnung der flachen Fragmente, weil es nicht so
einfach vorhersagbar ist, welche Elemente in Welchen vorhanden sein dürfen. Der folgende
Algorithmus getAllContaining soll zur Lösung dieses Problems beitragen. Da man von dem
'worst case' ausgehen muß, kann man die Exclusions vernachlässigen, denn sie beeinflussen
nicht das absolute 'enthalten_in'-Modell.
Der Algorithmus baut im wesentlichen einen DTD-Baum auf, berücksichtigt dabei alle
Inclusions und berechnet danach den transitiven Abschluß. Als Ergebnis erhält man, für jeden
Elementtyp die Menge aller direkt oder indirekt enthaltenen Elementtypen. Beim Konfigurieren
muß man also bei jedem Elementtyp, der flach eingefügt werden soll, auch alle Elementtypen
flach einfügen, die in der Ergebnis-Menge enthalten sind.
Wenn in diesem Algorithmus auch noch Exclusions genauso berücksichtigt werden, dann
ist es leicht möglich, eine Fragment-DTD zu erzeugen, um nur einzelne Dokument-Elemente
zu parsen. Das Ergebnis wäre dann nicht 'alle enthaltenen Elementtypen' sondern 'alle zu
berücksichtigenden Elementtypen' als Menge. Man müßte dann nur noch die Element- und
Attribut-Definitionen dieser Elementtypen als eine DTD zusammenfassen. Diese Funktion
wurde implementiert und dessen Beschreibung kann man in Kapitel 5.3.4 finden.
Seite 47t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Vorgaben :
- alle sS haben als anfänglichen Inhalt das contentModel des jeweiligen Elementtyps
- alle iS haben als anfänglichen Inhalt die inclusion Types des jeweiligen Elementtyps
- nach Abbildung des Container-Arrays auf einen ADT sind die Söhne in sS
und die Wurzel ist EC[0] (erfolgreiches Parsen der DTD zum DTD-Baum vorausgesetzt)
- um zu vermeiden, daß indirekte Zyklen entstehen, muß man vor dem Bearbeiten eines
Sohnes, diesen mit dem gesamten Stack vergleichen. Nur wenn dieser Sohn nicht auftritt,
darf er behandelt werden !
Seite 48t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
6.3.1 Funktionen, die in den Körpern der drei Schleifen aufgerufen werden
Tabelle 6.3-4: Darstellung der Funktionen down, succ, up links grafisch, rechts als Pseudo-Code
Seite 49t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
no_down(akt) testet sS von akt und liefert true, falls diese leer ist.
getAllContaining(array_of_container from_DTD)
akt:=root ; push(root,stack) bis der Stack
leer ist
3 Loop1 while akt=root or not(up_is_root(akt))
2
Loop2 while akt=root or not(no_succ(akt)) Breitensuche
3 bis rechter Sohn
1 Loop3 while akt=root or not(no_down(akt))
2 3) akt:=down(akt) Tiefensuche
2) akt:=succ(akt) bis Blatt
1) akt:=up(akt)
If not(no_succ(akt)) -> akt:=succ(akt)
Idee :
Der Baum wird durch Tiefensuche abgearbeitet, und dabei werden die Inclusion-Regeln
beachtet. Ergebnisse werden beim backtracking (Postorder) vom rechten Sohn und bei dem
Besuch der Bruder-Knoten von den anderen Söhnen geliefert. (up-b und succ-b ).
Bei der Tiefensuche : alle included Types werden auch zu Söhnen gemacht. Alle Söhne
bekommen dann durch down bzw succ die included Types des Vaters weitergeleitet :
Seite 50t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
a b i
i
c d e i
i i i
Abbildung 6.3-10: Sonderfall, beim Weiterleiten der included Types des Vaters an seine Söhne
Es dürfen also nur die included Types weitergeleitet werden, die nicht zyklisch sind
(d.h. I I.iS) . Das wird jeweils in down und succ durch die Mengen-Differenz vermieden :
son_i.iS := (son_i.iS father.iS) / {son_i}. Die Initialisierung aller Söhne vor der Behandlung
(in down und succ) garantiert, daß die Sub-Bäume der Element-Types wieder in aller Reinheit
betrachtet werden können.
zu down :
Initialisiert die Mengen des ersten Sohnes
(iS:=includedTypeDef, sS:=contentModel,cS:={})
setzt die includedTypes vom aktuellen Knoten als Söhne, denn included Types sind auch
gleichzeitig Söhne
setzt die includedTypes vom aktuellen Knoten in die includedTypes-Menge des ersten
Sohnes (ganz links) außer Sohn 1 selbst (falls er ein includedType des Vaters ist ->
Vermeidung von Zyklen), denn alle included Types des Vaters sind auch included Types aller
Nachkommen.
Seite 51t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
zu succ :
Initialisiert die Mengen des (i+1)-ten Sohnes
(iS:=includedTypeDef, sS:=contentModel,cS:={})
der i-te Sohn liefert die Ergebnismenge(=alle seine Nachkommen) an den aktuellen Vater,
denn alle seine Nachkommen sind auch Nachkommen des Vaters
setzt alle includedTypes des aktuellen Vaters in die includedType-Menge seines jüngeren
Bruders (Sohn i+1), außer den Bruder selbst (falls er ein includedType des Vaters ist ->
Vermeidung von Zyklen), denn alle included Types des Vaters sind auch included Types
aller Nachkommen.
zu up :
der aktuelle Sohn liefert die Ergebnismenge(=alle seine Nachkommen) an den aktuellen
Vater, denn alle seine Nachkommen sind auch Nachkommen des Vaters
backtracking
zu getAllContaining :
Die Sonderabfragen beim Spezialfall, daß die Wurzel weniger als zwei Nachkommen hat,
kann man in der Implementierung als vorausgesetzt annehmen. Für den Algorithmus soll es
genügen, daß alle 3 Funktionen (down, succ, up) den Sonderfall akt=LostNode behandeln :
top(stack)=up(LostNode) LostNode=down(LostNode) LostNode=succ(LostNode),
wobei LostNode wie ein Null-Blatt zu sehen ist.
durch down ist die Ergebnismenge der vorletzten Generation (Väter mit nur Blättern als
Söhne) als richtig gewährleistet
ansonsten geben alle Generationen durch succ und up jeweils ihre Ergebnismenge an ihren
Vater weiter (backtracking)
Seite 52t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Da Zyklen von getAllContaining durch Prüfung vermieden werden und der DTD-Baum mit
gesetzten included Types als Vorbedingung auch keine Zyklen enthalten dürfen, entsteht ein
ADT-Baum, der einem durch die gesetzten incType-Bäume erweiterten DTD-Baum
entspricht
Loop 3 terminiert, da an jedem Ast ein Blatt existiert (Abbruchbedingung für Loop 3)
Loop 2 terminiert, da Loop 2 und jeder Knoten nur eine endliche Anzahl von Söhnen hat
(diese Annzahl wird nur von down verändert, also nur beim ersten Sohn)
Loop 1 terminiert, da Loop 3+2 terminieren und der Baum endlich ist (keine Zyklen) und
als endlicher Keller nur mit down gefüllt ist .
Satz (Proposition) :
Der Algorithmus getAllContaining arbeitet korrekt mit den vorgegebenen Bedingungen.
Induktionsanfang(Basis) :
n ist die Anzahl der in der DTD vorkommenden included Types
wenn der Elementtyp durch down oder succ erreicht wird, wird I zum Sohn gemacht bei
jedem down bzw. succ wird I jeweils an die Söhne weitergeleitet mit Ausnahme von I
selbst (keine Zyklen) ! Diese Schritte werden dann mit den jeweiligen Söhnen
fortgesetzt, bis zu den Blättern (deep search first) und dann mit up wieder zurück.
(backtracking). Die Ergebnisauswertung ist dann wie oben beschrieben.
Seite 53t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Induktionsschritt :
Abbildung 6.4-11:
Der Baum vor und nach dem Induktionsschritt
Folgende Fälle sind dabei für included Type (n+1) oder I(n+1) zu beachten :
I. I(n+1) ist Sohn eines Elementtyps, der selbst kein included Type ist.
I(n+1) ist flach, denn wenn I(n+1) strukturiert ist, wird (bis auf die Sonderbehandlung bei der
incuded Type - Mengenverarbeitung) in jedem Knoten wie ein Sohn behandelt.
Ohne die Allgemeinheit zu verletzen, nehmen wir an, daß I(n+1) der Letzte included Type in
der included Type Menge ist, (also auch der der ganz rechte Sohn des aktuellen Vaters)
und alle included Types vorher wurden schon korrekt verarbeitet .
Durch die Inititialisierungen in down und succ werden außerdem versteckte Zyklen
außeinandergebrochen (das gilt nicht für direkte und indirekte Zyklen)
Wenn I(n+1) in der DTD gesetzt war, dann ist bei down(start) folgendes passiert:
- init setzt den ersten Sohn auf die Anfangswerte
- dann wird I(n+1) als Sohn von start gesetzt (down-a)
– und in die Menge iS des ersten Sohnes gebracht (down-b)
Der Fall erster Sohn=I(n+1) kann nicht auftreten, da sonst start ein Blatt wäre
- diese Schritte (in down) werden solange wiederholt, bis ein Blatt erreicht wird. (dort :
Seite 54t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
Beim am weitesten linken und unteren Blatt des Teilbaumes von start (start2), wird
mit succ der Bruder dieses Blattes erreicht, mit dem dann fortgefahren wird,
wie mit start und die Weiterleitungen des Vaters übernimmt jetzt succ
(succ-b und succ-c)! (also ist I(n+1) wieder immer ganz rechts)
- Wenn der aktuelle Knoten ein Blatt ist, geht es jeweils mit succ sofort weiter. Die
Ergebnisse hat dann der aktuelle Vater bereits durch down-b bekommen, denn ein Blatt
hat keine Nachfolger
- Wenn der aktuelle Knoten strukturiert ist, dann enthält der Knoten ja bereits alle
sS-Mengen seines Unterbaumes jeweils durch succ-b und up-b. Diese gibt er alle
seinem Vater weiter.
- bis dann jeweils I(n+1) als ganz rechter Sohn erreicht wird
Das ist das erste Mal, daß I(n+1) behandelt wird. Jedesmal, wenn I(n+1) behandelt wird,
gibt es eine Ausnahmebehandlung
keine Weitergabe des Vaters von {akt} an akt.iS (sonst Zyklus)
Wenn I(n+1) dann behandelt wurde, ist er auch gleichzeitig der letzte Sohn eines
Knotens !
Mit up wird dann wieder der Vater ermittelt und eine Ebene zurückgegangen und auch
das Ergebnis des ganz rechten Sohnes (in diesem Falle I(n+1) ) zurückgeliefert.
Dort wird wieder weiterverfahren wie mit start2 (also ist I(n+1) in allen Knoten des
DTD-Baumes ganz rechts, außer in sich selbst)
Schließlich gelangt man zum ganz rechten Knoten von start und liefert mit up-b das
letzte Ergebnis.
Seite 55t
ABBILDUNGS- UND TABELLEN-VERZEICHNIS
zu Fall 2)
In
In In+1
In In+1
In+1
Abbildung 6.4-12: Die Auswirkungen im DTD-Baum , wenn I(n+1) Sohn eines included Types ist.
um bei Fall 2 eine normale Behandlung wie bei Fall 1 zu erhalten werden in down und
succ die Initialisierungen vorgenommen, d.h. jedesmal, wenn ein Sohn behandelt wird
(durch down oder succ), werden die für die Steuerung notwendigen Mengen iS und sS
auf den Startwert zurückgesetzt. Dadurch werden versteckte Zyklen zumindest
unterbrochen (das Erkennen ist nicht das Aufgabe dieses Algorithmus)
Die einzigen Zyklen, die dann noch bleiben sind die direkten oder indirekten Zyklen, die
als Vorbedingung ja nicht vorhanden sein dürfen (im Algorithmus wären sie zu
erkennen, wenn ein Sohn im stack schon vorkommt)
Wenn die versteckten Zyklen nicht mehr entstehen können, dann kann man wie bei Fall
1 vorgehen, also : I(n) = start , denn dann wird der Baum von I(n) nur noch wie ein ganz
normaler Teilbaum betrachtet und das jedesmal, als wenn das erste mal wäre ...
Da also auch n+1 gilt, arbeitet der Algorithmus mit den vorgegebenen
Bedingungen korrekt.
Seite 56t
KAPITEL 7 EXPERIMENTE
7 Experimente
Jedes dieser Dramen ist vom Dokumenttyp 'PLAY', was auch gleichzeitig der Name des
Root-Elements ist. Weiterhin ist jedes Drama in fünf Akte (Elementtype 'ACT') aufgeteilt und
im Schnitt beinhaltet jeder Akt vier Szenen (Elementtype 'SCENE'). Insgesamt wird jede Zeile
(Elementtyp 'LINE') als eigenes Dokument-Element notiert. Durchschnittlich gibt es in einem
Drama ca. 4000 Dokument-Elemente vom Typ 'LINE'.
KAPITEL 7 EXPERIMENTE
0,22 KB -> es gibt 4000 bis 5000 Zeilen á 0,22 KB im Durchschnitt, als Unterteilung
PLAY
PLAYTITLE
FM
PERSONAE
SCNDESCR
PLAYSUBT
INDUCT
INDUCTTITLE
SUBHEAD
ACT
ACTTITLE
SCENE
SCENETITLE
SPEECH
SPEAKER
STAGEDIR
LINE
Die Werte sind nur als -Werte zu sehen. Die genauen Zahlen sind für die Experimente
nicht interessant. In allen Experimenten wurde von keinen zusätzlichen Indexstrukturen wie
PCDATAIndex, attribIndex oder structIndex gebrauch gemacht. Es wurden natürlich
Datenbankspezifische Indizes aufgebaut.
Alle Experiment wurden mehrmals und auf verschiedenen Rechnern durchgeführt. Das
ganze auch in verschiedenen Reihenfolgen. Daraus ergab sich, daß die Ergebnisse unabhängig
von der Anzahl der Datensätze, der Reihenfolge der Operationen und der Leistung der
Workstation war.
Die Experimente (I+II) sind Bestandteil dieses Kapitels. Die Beschreibung aller
Experimente ist in drei Schritte gegliedert. Es wurden in beiden Experimenten die gleichen
Funktionen benutzt, aber mit verschiedenen Vorraussetzungen. Die Funktionen sind im
Einzelnen getAll, getElemText (Element-Ausgabe) und das Einfügen.
In diesen Zeilen und in der Zeile der Ausgabe gibt es zwei Spalten pro Konfiguration.
Die linke Spalte zeigt dabei die Zeit an, die mit String-Suchalgorithmen und spezielles Wissen
über die datenbankinterne Repräsentation, in flachen Fragmenten, ausnutzt. Wenn dabei auf ein
flaches Fragment gestoßen wurde, aktivierte es die Funktion getAllinFlat, um den flachen Teil
mit String-C-Funktionen zu durchsuchen. Es handelt sich hierbei um das Experiment (II). Die
rechte Spalte dagegen, liefert die Zeiten von Experiment (I), das beim Suchen in Preorder-
Reihenfolge die Navigations-Funktionen down und succ verwendet (up wird durch einen 'stack'
ersetzt).
Das Einfügen geschieht über den SGML-Parser. Dieser hat seine eigenen Navigations-
funktionen. Somit gibt es hier keine, zwei zu unterscheidende, Navigationsmöglichkeiten.
Das erklärt die einzelne Spalte.
Da die Algorithmen speziell mit einem ganzen Dokument zu tun haben, schneidet in der
Wertung von Experiment (II) die Konfiguration 'alles flach' am besten ab. Der eine, flache Teil
wird mit einer Datenbankoperation geladen und dann im Speicher mit effizienten C-Funktionen
KAPITEL 7 EXPERIMENTE
Betrachtet man jedoch das Resultat von Experiment (I), also die rechten Spalten, dann
kann man einen deutlichen Zeitanstieg bei der Konfiguration 'alles flach' feststellen. Es wurde
bei diesen Operationen zwar mit Cache gearbeitet, aber die Navigationen down und succ im
flachen Teil stellten sich als nicht sehr effizient heraus. Das ist auch die Motivation für das
Experiment (III), das im Folgenden beschrieben wird.
Fazit : für Dokumentbezogene Queries, die massiv das interne Wissen ausnutzen, ist die
Konfiguration 'alles flach' die für die Performanz am besten geeignete Konfiguration. Das gilt
jedoch nicht für Einzel-Operationen wie die Navigations-Funktionen.
Die Ziele wurden nach verschiedenen Gesichtspunkten ausgewählt, die auch auf die
Schwächen (worst case) des Navigierens in flachen Fragmenten eingingen. Im wesentlichen
handelte es sich hierbei um folgende Dokument-Elemente im Dokument :
Konfigurationen (in Sekunden) in den darauffolgenden Spalten angegeben werden. Die Zahlen
in dieser ersten Spalte geben dabei die Häufigkeit der dahinter beschriebenen Aktionen an.
Alle Funktionsaufrufe wurden zehn mal durchgeführt, bis auf 'up', denn hier hatte der
'worst case' große Einwirkung auf das Zeitverhalten.
mittel
alles flach grob aufgeteilt aufgeteilt
(1 x 300 KB) (5 x 60 KB) (22 x 15 KB)
10 x Ausgabe : SCENE 7,0 sec 4,0 sec 14,0 sec
10 x Ausgabe : LINE 7,0 sec 3,0 sec 3,0 sec
3 x up(up(up(up(LLP)))) 21,0 sec 5,0 sec 6,0 sec
10 x succ(succ(succ(succ(FSFA)))) 12,0 sec 5,0 sec 15,0 sec
10 x pred(pred(pred(pred(LSFA)))) 9,0 sec 4,0 sec 15,0 sec
10 x pred(pred(pred(pred(LLP)))) 9,0 sec 4,0 sec 3,0 sec
10 x succ(succ(succ(succ(4.LL)))) 8,0 sec 4,0 sec 3,0 sec
Tabelle 7.3-6: Ergebniszeiten von speziellen Funktions-Sequenzen
Ziel des Experiments (IV) war, die verschiedenen Konfigurationen zu vergleichen und
das Ergebnis auch neben die Ergebnisse der Experimente (I-III) zu halten.
Die Konfiguration 'grob' kann nur Vorteile aus der Aufteilung nach 'ACT' ziehen. Was
sich aber negativ bei getObjs(ID('SCENE')) ausgleicht.
Bei der Konfiguration 'alles flach' spielt es keine Rolle, nach welchen Elementtypen
gefahndet wird, genausowenig, wie oft diese Vorkommen. Es ist nichts anderes, als ein
Hintereinanderausführen von getAll für alle in Frage kommenden Dokumente.
Fazit : Wenn es um datenbankorientierte Queries geht, kann die Granularität nicht fein
genug sein. In Experiment (I) war die optimale Konfiguration, in Bezug auf Performanz, die
Konfiguration 'alles flach', während das Optimum in Experiment (III) von Konfiguration 'grob'
KAPITEL 7 EXPERIMENTE
erreicht wurde. Im Experiment (IV) war dann die feinste Granularität gefragt und die
Konfiguration 'mittel' war die optimale Fragmentierung. Aus technischen und zeitlichen
Gründen konnten die Experimente (III+IV) nicht mit der Konfiguration 'fein' durchgeführt
werden. Mit Sicherheit hätten aber, bei dieser Konfiguration, alle getObjs-Anfragen die
vier Sekunden-Grenze nicht überschritten.
Es gibt also keine optimale Konfiguration, denn für die verschiedenen Bedürfnisse gab es
keine Konfiguration, die nicht mit Nachteilen behaftet gewesen wäre. Will man also die
optimale Konfiguration, in Bezug auf Performanz erhalten, muß man sich im Klaren sein,
welche Anforderungen das System optimal erfüllen soll.
Als Untersuchungs-Objekte wurden wieder Teile aus dem Drama 'Hamlet' ausgewählt.
Es konnten allerdings nur zwei Konfigurationen zum Vergleich herangezogen werden, denn bei
der Konfiguration 'mittel aufgeteilt' konnte die Zeit nicht mehr gemessen werden. Übrig
KAPITEL 7 EXPERIMENTE
blieben die Konfigurationen 'alles flach' und 'grob aufgeteilt'. Für das adhoc-Parsen wurde für
dieses Experiment eigens der erste Akt von Hamlet zum SGML-Dokument umgewandelt und
dementsprechend wurde auch die Fragment-DTD für 'ACT' mit allen benötigten Definitionen
erstellt. Die Zeit des Parsens von diesem neuen Dokument wurde dann ausgewertet
SP Vorausparsen
worstcase bestcase
300 KB (Etype play) 0,50 sec 0,11 sec 0,05 sec
60 KB (Etype act) 0,18 sec 0,03 sec 0,01 sec
8 Schlußbemerkung
Ein weiteres Ziel dieser Arbeit war es, das objektrelationale Datenbanksystem zu
evaluieren und dabei immer ein Vergleich mit dem Vorgängersystem im Auge zu behalten.
Hierzu wurden fünf Experimente durchgeführt. Die Versuchs-Objekte waren hierbei drei große
Dramen von William Shakespeare in SGML-Fassung. Im wesentlichen wurden diese
Dokumente mit vier verschiedenen Konfigurationen in die Datenbank eingefügt und diverse
Ausgabe- und Abfrage-Funktionen zeitlich gemessen. Wie auch schon im objektorientierten
Vorgängersystem, gab es auch im objektrelationalen DBMS keine optimale Konfiguration für
alle gestellten Aufgaben. Vielmehr machten die Experimente deutlich, wie vorteilhaft man die
Konfigurationsmechanismen und Methoden, die die Dokumentstruktur ausnutzen, nutzen
kann, um eine optimale Performanz für die individuellen Anforderungen zu erhalten.
Dieser zum Testen entwickelte Prototyp eines objektrelationalen DBMS muß in Zukunft
noch Funktionen und Operationen erhalten, die das Datenbanksystem zu einem kompletten
Verwaltungssystem macht. Funktionen wie Ändern, Löschen oder, wie im Vorgängersystem
vorhandene, semantische Auswertung von Hyperlinks, sind noch zu implementieren. Dazu
kommt noch eine Benutzerschnittstelle im Internet, die gerade in Arbeit ist, sowie
Schnittstellen zu den Sprachverwandten HTML und XML. Darüber hinaus wäre eine
Automatisierung der Konfiguration denkbar. Beim aktuellen Stand wird die Konfiguration mit
unterstützenden Hilfroutinen noch vom Benutzer, per Hand erstellt.
KAPITEL 8 SCHLUSSBEMERKUNG
Anhang A
Anhang B
contentModel='(PLAYTITLE,FM,PERSONAE,SCNDESCR,PLAYSUBT,INDUCT?,
ACT+)'
containedTypes='e1 e2 e4 e9 e10 e11 e22 e24 e26'
includedTypes=' '
excludedTypes=' '
FLAT=NOT ELEMINDEX=N STRUCTINDEX=' '>
</ELEM>
KAPITEL 8 SCHLUSSBEMERKUNG
</SUPERDTD>
KAPITEL 8 SCHLUSSBEMERKUNG
Anhang C
-------------------------------------------------------------
-- Erstellen von Typen und Tabellen für die SGML-Datenbank --
-------------------------------------------------------------
-------------------------------------------------------
-- Attribut-Paarung
-- Die Instanz dieses Typs enthält das Attribut des Dokument-
Elements mit der
-- Referenz auf das entsprechende nonflatElem mit der own_id
'element'
-------------------------------------------------------
-- Elementtypen
-- Für jeden Elementtyp, welcher in einer von der Datenbank
unterstützten
-- DTD enthalten ist, gibt es eine entsprechende Instanz von
'etype'
-------------------------------------------------------
-- Dokument Typ Definitionen
-- Jeder Dokumenttyp hat eine entsprechende Instanz dieses Typs
-------------------------------------------------------
-- Dokumente
-- Die Instanz dieses Typs ist die Repräsentation eines
Dokuments
-------------------------------------------------------
-- Dokument- Elemente
-- Das ist die generische Repräsentation eines Dokument-
Fragmentes
KAPITEL 8 SCHLUSSBEMERKUNG
-------------------------------------------------------
-- Strukturierte Dokument- Elemente
-- Das ist die Repräsentation von Dokument- Elementen mit einer
expliziten
-- Datenbank- Repräsentation
-------------------------------------------------------
-- Flache Dokument Elemente
-- Das ist die Repräsentation von Dokument-Fragmenten, die aus
Dokument- Elementen
-- bestehen, deren Repräsentation unstrukturiert ist.
-------------------------------------------------------
-- PCDATA- Index
-- Eine Instanz dieses Typs identifiziert das Vorkommen eines
Text-Inhalts innerhalb
-- eines Dokuments.
-- Jeder Wert von 'content' ist der Textinhalt des Elements vom
Elementtyp 'elementType'
-- 'positions' ist dann die Menge alle Index- Einträge in der
Form : "oid|occurrence"
-- 'oid' ist die own_id des Elementes, in dem der Inhalt
vorkommt
KAPITEL 8 SCHLUSSBEMERKUNG
-------------------------------------------------------
-- Structurierter Index
-- Eine Instanz dieses Typs identifiziert das Vorkommen eines
Textinhalts in einem
-- verschachtelten Paar von bestimmten Elementtypen,
-- bei denen der 2. Elementtyp in dem 1. Elementyp enthalten
ist
create row type structIndex
(
extElemType id_type,
intElemType id_type,
content varchar(128),
positions set(varchar(128) not null)
);
-------------------------------------------------------
-- create Tables (etype, dtd, document, docElem)
-------------------------------------------------------
create table etypeTable of type etype
(
PRIMARY KEY (own_id)
);
-------------------------------------------------------
create table dtdTable of type dtd
(
PRIMARY KEY (own_id),
UNIQUE(name)
);
-------------------------------------------------------
create table documentTable of type document
(
PRIMARY KEY (own_id),
KAPITEL 8 SCHLUSSBEMERKUNG
UNIQUE(name)
);
KAPITEL 8 SCHLUSSBEMERKUNG
-------------------------------------------------------
create table docElemTable of type docElem
(
PRIMARY KEY (own_id)
);
-------------------------------------------------------
create table nonflatElemTable of type nonflatElem
UNDER docElemTable;
-------------------------------------------------------
create table flatElemTable of type flatElem
UNDER docElemTable;
-------------------------------------------------------
create table attrRecTable of type attrRec
(
PRIMARY KEY (element , name , value)
);
-------------------------------------------------------
create table attrIndexTable of type attrIndex
(
PRIMARY KEY (elementType , attrName , attrValue)
);
-------------------------------------------------------
create table structIndexTable of type structIndex
(
PRIMARY KEY (extElemType,intElemType,content)
);
-------------------------------------------------------
create table PCDATAIndexTable of type pcdataIndex
(
PRIMARY KEY (elementType,content)
);
-------------------------------------------------------
KAPITEL 8 SCHLUSSBEMERKUNG
Anhang D
---------------------------------------------------------------
---Initialisieren aller Tabellen mit mindestens einem Leer-
Datensatz--
---------------------------------------------------------------
-- the ETypes for the DTD "SUPERDTD"
insert into etypeTable values(0, "SUPERDTD",4,"(DOCTYPE,
(ENTITY|ELEM|
NOTATION|SHORTREF|USEMAP)*,(COMBI)*)","f",Null);
insert into etypeTable values(1, "DOCTYPE",4,"EMPTY","f",Null);
insert into etypeTable values(2,
"ENTITY",4,"(#PCDATA)","f",Null);
insert into etypeTable values(3,
"ELEM",4,"(ATTRIBUTE*)","f",Null);
KAPITEL 8 SCHLUSSBEMERKUNG
Abbildungsverzeichnis
Tabellenverzeichnis
Literaturverzeichnis