270 likes | 473 Views
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
E N D
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 ruft HTML-Seite Browser CGI- Programm Produkt-datenbank generierteSeite Client 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) HTML-Seite Produkt-datenbank Eingabe Browser Applet Business- Logik (Java) DB-Zugr. Programm RMI RMI Client 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 Verk. Kunde Teil knr Adr. 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> kunden; List<Bestellung> best; Bag<Teil> teile; Set<Bestellung> best;
ODMG-Datenmodell: Vererbung class Eilbestellung extends Bestellung( extent Eilbestellungen ){ attribute int priorität ; attribute Date deadline ; ...} Erbt Attribute und Methoden von BestellungRedefinition von Methoden möglich
Persistenzkonzepte (1) Ortogonale PersistenzTyp 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 writeVermeidung von Deadlocks
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 bwhere 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.setrelationships, 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-CompilerOptions-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] ; so heisst das Dictionary (=Schema) oneFile = false [databases\my_base1] ; so heisst die Datenbank oneFile = false [classes\Liefert] ; daraus wird Dictionary-Info generiert persistent = true ; 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 pnr name Assistent chef Professor assis *