gif gif up gif contents
Nächste Seite: 3.3 Notifikation und Nachrichtenaustausch Vorige Seite: 3.2.3 Das deduktive Datenbanksystem

3.2.4 Die objekt-orientierte Datenbank O

Die Abbildung eines Datenbankschemas auf die Datenstrukturen eines Anwendungsprogramm ist einfach, wenn auf beiden Seiten das gleiche Datenmodell verwendet wird. Insofern können objekt-orientierte Datenbanksysteme leicht in Anwendungsprogramme eingebunden werden. Die zugehörigen Programmierschnittstellen ermöglichen transparenten Zugriff auf Datenbankobjekte und deren Methoden.

O [O -94] ist ein objekt-orientiertes Datenbankmanagementsystem, das aus einem Datenbankkern und einer Entwicklungsumgebung besteht. Die Entwicklungsumgebung beinhaltet eine Applikationsprogrammschnittstelle (O API) und Schnittstellen zu C, C++ und anderen Programmiersprachen. Außerdem kann man Anfragen in OQL (Object Query Language) formulieren und Objekte und Methoden mit der Datenbanksprache O C definieren. Diese Umgebung ist Grundlage für weitere Werkzeuge (O Look, O Graph), die das Erstellen von GUI-basierten Applikationen ermöglichen.

Die C++-Programmierschnittstelle ermöglicht die Speicherung von Objekten aus Applikationsprogrammen. Das O System spielt dabei die Rolle eines virtuellen Objektmanagers für eine Applikation, d.h. zur Laufzeit ist ein Zugriff auf die Objekte möglich, die sich schon im Speicher der Applikation befinden, andere Objekte müssen zunächst durch das Datenbanksystem geladen werden, bevor darauf zugegriffen werden kann.

O erweitert dafür Standard-C++-Programme um folgende Features:

Persistente Zeiger
ermöglichen die Abspeicherung von Zeigern zwischen Objekten des Applikationsprogramms in der Datenbank.

Generische Klassen
für (dynamische) Felder, Listen und Mengen von Objekten werden als C++-Templates bereitgestellt.

Persistence roots
sind Objekte oder Werte der Datenbank, die C++-Objekten zugewiesen werden können. Zum Beispiel kann man auf die Menge der neuen Angestellten New_Employees (definiert in O ) in C++ durch folgende Variablendeklaration zugreifen:
Set<Ref<Employee>> new_emps("New_Employees");.

Datenbanksystemunterstützung
beinhaltet Transaktionen, Indizierung und einige Werkzeuge wie zum Beispiel OQL und O Look.

Persistente Zeiger werden durch C++-Templates definiert: der C++-Typ Ref<X> steht für eine Referenz (oder Zeiger) auf ein Element der Klasse X. Objekte des Typs Ref<X> können in C++ genauso benutzt werden wie Zeiger. Auch Felder, Listen und Mengen werden mit Template-Klassen implementiert: Set<Ref<X>> steht für eine Menge von Objekten der Klasse X.

Die Klasse Employee hat ein Attribut name und ein Attribut dept, das ein Feld von Departments enthält.
class Employee {
    char *name;
    Varray<Ref<Department>> dept;
    Ref<Department> find_dept(char* n);
};

Die Methode find_dept sucht eine Abteilung mit bestimmten Namen in der Menge der Abteilungen eines Angestellten.

Ref<Department> Employee::find_dept(char *n) {
    int i;
    Ref<Department> d;
    for (i=0; i < dept.size; i++) {
        d=dept.item[i];
        if(d.name == n) return d;
    }
    return (Department*) 0;    // Null, wenn kein Department 
                               // gefunden wurde
}

Besonders interessant ist die Möglichkeit, Datenbankobjekte entweder durch C++-Klassen oder mit der Datenbanksprache O C zu deklarieren. Damit können bereits existierende C++-Programme leicht in O integriert werden. O verfügt dafür über ein Hilfsprogramm (o2import), das die Header-Dateien mit den Klassendefinitionen in C++ einliest und daraus dann Klassen für das Datenbanksystem und zusätzlichen C++-Code für den Zugriff auf die Datenbankobjekte generiert. Andererseits kann man mit o2export aus Klassen des Datenbanksystems C++-Klassen erstellen, womit die Applikation auf die Objekte der Datenbank zugreifen und deren Methoden aufrufen kann.

  
Abbildung 3.6: Erstellung eines C++-Programms mit O

Gegeben sei folgende Definition der Klasse Employee in O :
class Employee type
    tuple ( name: string,
            dept: list(Department))
    public method add_department(d: Department)
end;

add_department sei hier in O C als Methode für Datenbankobjekte implementiert. o2export erstellt daraus automatisch die folgende C++-Klasse, die C++-Funktion add_department ruft dabei nur die entsprechende O -Methode auf.

class Employee : public virtual Persistent_Object {
public:
    char *name;
    Varray<Ref<Department>> dept;    
    void add_department(Ref<Department>);
};

Die einzelnen Schritte und Komponenten, mit denen eine auf O basierende C++-Applikation erstellt werden kann, sind in Abbildung 3.6 dargestellt. Neben den generierten C++-Klassen können auch applikationsspezifische Quellcode-Dateien in anderen Programmiersprachen zu einem Programm zusammengebunden werden.



gif gif up gif contents

Christoph Quix
31. Juli 1996