Die Daten von relationalen Datenbanken können in einfache Record-Strukturen im Anwendungsprogramm übernommen werden, die aber für die oben genannten Anwendungsbereiche nicht ausreichen. Deshalb wurden verschiedene objekt-orientierte Erweiterungen des relationalen Datenmodells vorgeschlagen, von denen einige auch den Zugriff auf Objekte in Anwendungsprogramme integrieren.
Wiederhold [Wie86] erweitert das relationale Datenmodell um komplexe (verschachtelte) Sichtenobjekte. Eine Sicht ist dabei nicht nur eine relationale Anfrage, sondern auch eine Funktion, die die Attribute einer Relation auf die Attribute eines Objekts abbildet und umgekehrt. In [LW94] werden dafür unter anderem Outer-Joins benutzt. Dies sind Joins, bei denen die Tupel, die die Joinbedingung nicht erfüllen, mit Nullwerten aufgefüllt werden. Dadurch können in der Sicht auch Objekte enthalten sein, deren Attribute nicht vollständig instanziiert sind. Für die Bildung von Sichtenobjekten genügen Left-Outer-Joins, deren Anwendung im folgenden Beispiel gezeigt wird.
Auch in der Anfragesprache SQL kann man Left-Outer-Joins benutzen [EN94]. Bei der Left-Outer-Join-Operation werden auch die Elemente der linken Relation in die Ergebnisrelation aufgenommen, für die sich in der rechten Relation kein passendes Tupel finden läßt. Im Ergebnistupel werden die Attribute des fehlenden rechten Tupels durch Nullwerte ergänzt.SELECT employee.name, dept.name FROM (employee LEFT OUTER JOIN dept ON employee.deptid=dept.deptid) WHERE employee.salary > 100000Diese SQL-Anfrage führt einen Left-Outer-Join zwischen den Relationen employee und dept aus. Die Join-Bedingung wird hier hinter dem Schlüsselwert ON angegeben. Die abschließende WHERE-Klausel führt noch eine Selektion auf dem Ergebnis des Joins aus. Die Anfrage kann auch mit der Relationenalgebra dargestellt werden. Das Zeichen für einen Left-Outer-Join ist.
![]()
Die Idee der Sichtenobjekte wird im Penguin-System [KH93, TK94, KJA93] realisiert. Das Penguin-System ermöglicht die Integration von Sichtenobjekten in C++-Programmen. Penguin hat eine Schichtenarchitektur, die in Abbildung 3.2 abgebildet ist.
Das System basiert auf einem relationalen Datenbanksystem. Auf der untersten physikalischen Ebene werden die Daten der Relationen abgespeichert, die zweite relationale Schicht enthält das strukturelle Modell der Daten, d.h. die Informationen über die Verbindungen der Relationen. Die Sichtenobjektebene enthält die komplexen Objekte des Sichtenobjektmodells. Die C++-Klassen für die C++-Objektebene generiert Penguin automatisch und stellt somit eine Schnittstelle zur Verfügung, die die von Penguin bereitgestellten Funktionen zur Erzeugung, Instanziierung, Änderung und zum Navigieren der Sichtenobjekte nutzen kann. Bei dem Übergang von der relationalen Ebene zur Sichtenobjektebene kann die Struktur der Objekte verändert werden, zum Beispiel können die Attribute von mehreren Relationen auf Attribute von eines Objekts abgebildet oder Objekte können zu einem komplexen Objekt vereinigt werden.
Abbildung 3.2: Schichten-Architektur des Penguin-Systems
Ein Vorteil dieser Architektur ist, daßjedes Anwendungsprogramm seine eigene Sicht mit eigener Objektstruktur definieren kann. Wenn die Daten der relationalen Datenbank für ein Programm mit anderer Datenstruktur genutzt werden sollen, dann ist lediglich die Definition eines neuen Sichtenobjekts nötig, anstelle einer grundlegenden Änderung des Datenmodells.
Bei der Übersetzung der Definition eines Sichtenobjekts wird diese zunächst analysiert und das System erstellt dann den Programmcode für die C++-Klassen. Für jede Basisrelation, die in einer Sicht enthalten ist, wird eine Basisklasse generiert, die die grundlegenden Attribute und Methoden dieser Relation definiert. Davon wird dann eine Klasse abgeleitet, in der man nur auf die Attribute des Sichtenobjekts zugreifen kann. Verschachtelte Objekte werden durch Zeiger referenziert. Des weiteren kann der Anwendungsprogrammierer für die Sichtenobjekte seine eigenen C++-Methoden definieren. Die Methoden können auch in der Definition einer Anfrage benutzt werden. Abbildung 3.3 zeigt die Implementierung des Anfragesystems von Penguin.
Abbildung 3.3: Implementierung des Anfragesystems
Das System ist modular aufgebaut und die wichtigsten Funktionen sind auf mehrere Agenten verteilt. Den Kern der Anfragebearbeitung bildet der Object Query Agent (OQA). Dieser Agent bearbeitet die Anfragen des Applikationsprogramms, analysiert und transformiert sie. Zur Analyse greift der OQA auf die Methodeninformation des Applikationsprogramms und auf die Definition der Sichtenobjekte im Penguin-System zu. Die Auswertung einer Anfrage wird auch vom OQA gesteuert. Dabei werden die relationalen Operationen an das Datenbanksystem weitergeleitet. Die Methodenaufrufe in Anfragen werden an das Applikationsprogramm gesendet. Die Applikation schickt die Ergebnisse der Methoden an das Datenbanksystem, woraufhin das Anfrageergebnis in Form von Sichtenobjekten instanziiert werden kann. Das Anwendungsprogramm kann mit Hilfe des Application Interface auf die Sichtenobjekte zugreifen. Die verschiedenen Agenten innerhalb des Penguin-Systems verwalten die Sichtenobjekte und ermöglichen einen Zugriff darauf.
Christoph Quix