Objektorientierte Datenbanken Prof. Dr. Stefan Böttcher Fachbereich 17 - Informatik Universität Paderborn Einordnung von OODB • Trend zum Internet => HTML + CGI + Programmiersprache => HTML/XML + Java + Datenbank • Trend zu Multi-Tier-Architekturen => Middle-Ware (Java/Corba) + Frontend + Datenbank (Backend) • Trend zur OO-Modellierung => UML -> Java/C++ + Datenbank 2-Tier-Architektur mit Common Gateway Interface (CGI) Eingabe HTMLSeite ruft CGIBrowser generierte Programm Seite Client Produktdatenbank Server + minimale Anforderung an den Client + Server: CGI-Programm in beliebiger Sprache + Robust - Session-lose Kopplung: keine zwischenzeitliche Interaktion - hohe Serverlast - Sicherheitsrisiken 3-Tier-Architektur (mit Java und DB) HTMLSeite Produktdatenbank Browser Applet BusinessDB-Zugr. RMI Logik (Java) Programm Eingabe Client RMI Application-Server DB-Server +/- geringe Anforderung an den Client +/- 2 Server: Java-Anwendung (portabel) und DB-Zugriff + Robust + Session-Konzept bei Kopplung: zwischenzeitliche Interaktion + geringere Serverlast als bei CGI Anwendungslast zwischen Client und Application-Server verteilbar + weniger Sicherheitsrisiken (durch Sandbox) Ziele von Datenbanken • Daten gegen Verlust sichern (Persistenz) • Atomizität von Transaktionen • Isolation von Transaktionen • Konsistenzerhaltung persistenter Daten • Effiziente Anfragebearbeitung • Benutzer-nahe Modellierung Warum objektorientiert? Software-Engineering verlangt: • Wartbarkeit / Modularität (von Software) • Anpaßbarkeit • Erweiterbarkeit • Wiederverwendbarkeit OO Analyse -> OO Design -> OO Programm Zusätzliche Eigenschaften objekt-orientierter Datenbanken • Typkonstruktoren und komplexe Objekte, • Klassen, Methoden und Kapselung, • Vererbung, Redefinition und späte Bindung, • Orthogonale Persistenz • Objekt-Identität ODMG-Datenmodell (Beispiel) Bestellung bnr Kunde knr Adr. Verk. Teil tnr Bez. ODMG-Datenmodell (Beispiel) class Bestellung (extent Bestellungen) { attribute int bnr ; attribute string verkäufer ; relationship Teil teil inverse Teil::best ; relationship Kunde ku inverse Kunde::best ; ... } ODMG-Datenmodell (Beispiel) class Kunde (extent Kunden) { attribute int knr ; attribute struct Adresse (int plz, sring ort, string str, int hausnr) adresse ; relationship list<Bestellung> best inverse Bestellung::ku ; ... } ODMG-Datenmodell (Beispiel) class Teil (extent Teile) { attribute int tnr ; attribute string bezeichnung ; relationship set<Bestellung> best inverse Bestellung::teil ; ... } ODMG-Datenmodell Typkonstruktoren • Basistypen: int nr; string bezeichnung; ... • Tupelkonstruktor: struct(int plz, string ort, ...) • Objektkonstruktor: Teil(int nr, string bez) • Kollektionen: Array<Kunde> List<Bestellung> Bag<Teil> Set<Bestellung> kunden; best; teile; best; ODMG-Datenmodell: Vererbung class Eilbestellung extends Bestellung ( extent Eilbestellungen ) { attribute int priorität ; attribute Date deadline ; ... } Erbt Attribute und Methoden von Bestellung Redefinition von Methoden möglich Persistenzkonzepte (1) Ortogonale Persistenz Typ des Objektes ist unabhängig von seiner Lebenszeit => persistente und transiente Objekte gleich (nicht: erben von einer Klasse PersistentObjekt) Persistenz-unabhängiger Code: gleicher Code für persistente und transiente Bestellung => nur eine Klasse Bestellung Persistenzkonzepte (2) Persistenz durch explizites binden in die DB db.bind( bestellung33 , hp5l ) ; Objekt-Ref. , globaler Name Persistenz durch Erreichbarkeit: bestellung33.teil.bezeichnung ; ist auch persistent in DB Transaktionen ... Transaction txn ; try{ txn.begin() ; ... ; db.bind(...) ; ... db.lookup(...) ; ... ; db.delete( ... ) ; } catch( ODMGException e) { txn.abort() ; } txn.commit() ; ... Transaction-Objekte - Factory-Idee Transaktionen (Sperrkonflikte) Sperrdauer bis Transaktionsende upgrade-Sperre : jetzt read, später write Vermeidung von Deadlocks read write upgrade read o.K. - o.K. write - - - upgrade o.K. - - Anfragesprache OQL Welches Teil hat Kunde nr 7 bestellt ? select b.teil.bezeichnung from Bestellungen b where b.ku.knr = 7 Wo wohnt der Kunde, der Teil 33 bestellt hat ? select struct (plz: ad.plz , ort: ad.ort) from Bestellungen b where b.teil.tnr = 33 and b.ku.adresse = ad Joins in kommerziellen OODBMS nicht unterstützt Sprach-Bindings (z.B. Java-Binding, C++-Binding) Idee: Nur 1 Sprache für Programmierer C++ - Binding: z.B. Templates für List, Set, ... Java - Binding: erweitert java.util.List und java.util.set relationships, Schlüssel, Extents werden nicht vom ODMG-Java-Bindung unterstützt, aber: z.B. Poet-JavaODMG bietet Extents an Effizienz von relationalen im Vergleich zu OO-Datenbanken Vorteile von OODB + Pfadausdrücke in Queries + gut für stark strukturierte Daten + keine Modellierungsbruch -> Effizienz Vorteil von RDBMS + große Mengen exakt gleichartiger, nicht unterstrukturierter Daten -> Standard-Anfrageoptimierung Kompilierungskonzepte (Java) Precompiler Options-Datei sagt, welche Klassen des Java-Programms Persistenz-fähig sind (z.B. Poet) Post-Compiler Options-Datei sagt, welche Klassen des Java-Programms Persistenz-fähig sind (z.B. Versant) Systeme Poet und Versant + nahe am ODMG-Standard + High-level DB-Operationen +/- Plattenzugriff auf Objekt-Level ObjektStore +/- etwas weiter entfernt vom Standard -/+ Plattenzugriffe auf Page-Level O2 + erfüllt voll ODMG-Standard - nicht mehr am Markt Zusammenfassung OODB • passen zu Internet/Middleware/OOP • verkürzen Entwicklungszeit / kein Modellbruch • sind mächtiger als relationale DB • sind meistens effizienter als relationale DB • sind standardisiert, Produkte sind verfügbar • geringerer Marktanteil als relationale DB, aber steigende Tendenz Kompilierungskonzepte am Beispiel von Poet (Java) Options-Datei ( ptjavac.opt in Version 5.1 bzw. ptj.opt in 6.1) sagt, welche Klassen des Java-Programms Persistenz-fähig sind [schemata\my_dict1] oneFile = false ; so heisst das Dictionary (=Schema) [databases\my_base1] oneFile = false ; so heisst die Datenbank [classes\Liefert] persistent = true ; daraus wird Dictionary-Info generiert ; diese Klasse ist persistent Kompilierungskonzepte am Beispiel von Poet (Java) Precompiler (Version 5.1) Übersetzen von Java-Programmen mit Zugriff auf die Datenbank > ptjavac -classpath '%CLASSPATH%' *.java Post-Compiler (Version 6.1) > javac *.java - compilieren mit gewöhnlichen Java-Compiler > ptj -enhance -inplace -create Programme starten mit > java Bind poet://LOCAL/my_base1 obj1 > java Lookup poet://LOCAL/my_base1 obj1 > java Delete poet://LOCAL/my_base1 obj1 Beispielklasse: Liefert class Liefert { String lieferant, teil ; int preis, lieferzeit ; java.util.Date uhrzeit ; public Liefert( String l, String t, int p, int z ) { lieferant=l ; teil=t ; preis=p ; lieferzeit=z ; } public String toString() { return lieferant + " " + teil + " " + preis + " " + lieferzeit + " um " + uhrzeit ; } } Uni-Beispiel leiter Vorlesung Angestellter * vorl. vnr name Assistent pnr chef * assis name Professor