Objektorientierte Datenbanken

Werbung
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
Herunterladen