Datenbankprogrammierung 1 Die Folien basieren auf: Datenbanken: Konzepte und Sprachen, Andreas Heuer und Gunter Saake, mitp-Verlag, 2. Auflage, 2000, http://wwwiti.cs.uni-magdeburg.de/biber/ Datenbanken kompakt, Andreas Heuer und Gunter Saake, mitp-Verlag, 2003 Studienbriefe zu Datenbankprogrammierung, Karl M. Göschka, Jürgen Falb Datenbanksysteme – Eine Einführung, Alfons Kemper und Andre Eickler, Oldenbourg Verlag, München, 6. Auflage, 2006. http://wwwdb.in.tum.de/research/publications/books/DBMSeinf OO Programmierung & Relationale Datenbanken OO Programmierung und Relationale DB Grundproblem: Abbildung der objektorientierten auf die relationale Struktur Abbildung einfacher Klassen? direkt auf Tabellen Attribut Spalte Instanz Zeile (Tupel) Primärschlüssel Primärschlüssel Komplexere Strukturen? Beziehungen zwischen Klassen? Abbildung komplexerer OO Strukturen: Ansätze Schwache Struktur mit Dependent-valueClasses: Objekte abhängiger Werte-Klassen werden als BLOB (Binary Large Object) in einem einzigen Attribut gespeichert Nachteile: Daten können nicht durchsucht werden Keine Beziehungen auf diese Daten darstellbar Starke Struktur Jede Klasse in eine eigene Tabelle Tabellen werden (wie die Klassen) über Attribute in Beziehung gesetzt Datenbankstruktur spiegelt Klassenstruktur wider Abbildung komplexerer OO Strukturen: Ansätze Hybride Struktur Instanzen der Objekte werden serialisiert Referenzen werden jedoch in eindeutige Schlüsselbeziehungen umgeformt Strukturinformation bleibt erhalten, spiegelt sich aber nicht in relationaler DBStruktur wider Persistenzansätze Was bedeutet Persistenz eigentlich? Die Lebensdauer eines persistenten Objektes übersteigt die Lebensdauer der Applikation, die das Objekt erzeugt hat. D.h., Zustand der Objekte wird auf einem nicht-flüchtigen Medium gespeichert, sodass das Objekt weiter existiert, auch wenn die Anwendung beendet wird. Persistenzansätze 1. Objekt-Serialisierung Umwandlung eines Objektes (und aller davon erreichbaren Objekte) in einen Bytestrom Für Persistenz im „kleinen Bereich“ nutzvoll bzw. auch für Kommunikation über Sockets, RMI, CORBA, etc. Ablegung der serialisierten Objekte in der DB natürlich auch möglich DB hat keine Struktur sondern ist nur Lager für serialisierte Objekte Bereits in Java eingebaut Banane-Gorilla-Problem: Um auf ein Objekt (Banane) zuzugreifen, müssen erst alle assozierten Objekte (Gorilla) instanziert werden. Objekt-Serialisierung Vorteile: Leicht zu implementieren, auch ohne DB möglich Sehr schnell, wenn Daten nur selten geschrieben/gelesen werden Spiele Nachteile: Hohe Last für Instanzierung Gröbere Granularität für Persistierung Zuverlässigkeit nicht gewährleistet, wenn es während der Serialisierung zu einem Systemabsturz kommt schlecht geeignet bei großen Datenmengen, wenn Objekte oft verändert werden, zuverlässige Persistenz benötigt wird 2. Spezifische Persistenz Jedes Objekt hat eigene Verbindung zur DB für seine eigenen Zwecke Anwendung: Nur für kleine Projekte mit geringer Funktionalität Informationssysteme, die nur die wesentlichsten DBOperationen brauchen D.h. für einfache Struktur, aber durchaus für große Datenmengen Vorteil: sehr einfach, wenn man Transaktionen braucht Nachteile: Starke wechselseitige Abhängigkeit jedes Objektes von der gesamten Datenstruktur Erweiterungen schwierig 3. Gekapselter Datenbankzugriff DB-Zugriff wird in einigen wenigen ControllerObjekten (database access objects) gekapselt Controller ist für bestimmte Tabellen und bestimmte Klassen verantwortlich Abhängigkeit DB/Applikation auf wenige Objekte reduziert Andere Objekte weitgehend von Persistenzaufgaben befreit Eignet sich auch schon für komplexere Strukturen 4. Persistenzframeworks Grundidee: Business Objects sollen ohne Rücksicht auf Persistenz entwickelt werden ( Transparenz) DB-Zugriff weitgehend in Framework gekapselt Für größere Projekte bzw. mehrere ähnliche Projekte geeignet Nicht die Datenmenge ist entscheidend, sondern die Struktur! Orthogonale Persistenz in OODatenbanken Drei Hauptströmungen: Erweiterung OO Programmiersprachen um Persistenz (z.B. PJama) Erweiterung relationaler DB um objektorientierte Kernels Komplett neu entwickelte Systeme (z.B. Multimedia-DB) UML Klassendiagramm vs. ER Diagramm Sehr viele Gemeinsamkeiten, kaum Unterschiede Im Prinzip ist es Geschmackssache, ob man für den DB-Entwurf UML oder ER verwendet. Unterschiede: Methoden im Klassendiagramm, aber nicht im ERD Kein Schlüssel in UML Assoziationen in UML können eine Richtung haben, im ERD nicht ... Programmiersprachenanbindung SQL: Anfrage und Manipulationssprache für relationale DB Implementierung von Anwendungssystemen: Java, C#, C++, etc. Wie kann man SQL-Anweisungen in anderen Programmiersprachen gestatten? Programmiersprachenanbindung Call Level Interface (CLI) Einbettung dynamisch statisch Call-Level Interface (CLI) Ziel: Nutzung von SQL-Anweisungen in einer Programmiersprache Bibliothek ermöglicht Zugriff und Manipulation der DB Kann aus Programmiersprache heraus aufgerufen werden Beispiele für Implementierungen des SQL/CLI Standards JDBC ODBC (Open Database Connectivity) Weitere Beispiele: OCI (Oracle Call Interface) MySQL ++ Einbettung von Datenbanksprachen in Programmiersprachen Verbindet DB-Sprache (SQL) mit Programmiersprache Statische Einbettung Dynamische Einbettung Precompiler analysiert Quelltext (Normaler Code + SQL) und wandelt SQL-Anweisungen in Prozeduraufrufe um Ermöglicht Konstruktion von SQL-Anweisungen zur Laufzeit SQL-Anfragen sind Zeichenketten aus Sicht der Programmiersprache Grundproblem bei der Kopplung SQL/Programmiersprache? Menge von Tupeln vs. Tupeln Cursor Cursor Problem bei der Kopplung imperativer Programmiersprachen mit SQL: Unterschiedliche Datenstrukturen Imperative Programmiersprache: Tupel SQL: Relation = Menge von Tupeln Impedance mismatch Cursor = ITERATOR über eine Liste von Tupeln Cursor (Forts.) Beispiel: Fetch-Anweisung: declare AktProdukt cursor for select Bezeichnung, Preis, Bestand from Produkt for update of Preis, Bestand Zugriff auf einzelne Tupeln einer Relation Bewirkt weitersetzen des Cursor-Zeigers Realisiert Datentransfer in das Anwendungsprogramm Muss in modernen Call Level Interfaces nicht immer explizit deklariert werden, z.B. nur interne Verwendung in JDBC Static Embedded SQL SQL Anweisungen werden in den Quelltext eingebettet Statisch SQL Anweisung zur Übersetzungszeit bekannt Vorübersetzer analysiert SQL-Anweisung und setzt sie in Prozeduraufruf um nicht nötig bei CLI Vorteil: Geringere Fehleranfälligkeit durch Überprüfung zur Übersetzungszeit Nachteil: Alle SQL Anweisungen müssen bereits ausformuliert sein. Z.B. kann die Bedingung im WHERE Teil nicht erst zur Laufzeit vom Anwender bestimmt werden. Nur Variablen der Wirtssprache können mit Werten belegt werden. Beispiel: Einsatz der Cursor-Technik exec sql declare AktProdukt cursor for //Deklaration des Cursors select Bezeichnung, Preis, Bestand from Produkt for update of Preis, Bestand; //Ändern von Preis,Bestand erlaubt exec sql open AktProdukt; //Öffnen des Cursors exec sql fetch AktProdukt //Transfer eines Tupels in Variablen der Anwendung into :bezeichnung, :preis, :bestand; exec sql close AktProdukt; //Schließen des Cursors Dynamic Embedded SQL SQL Anweisungen werden zur Laufzeit zusammengestellt und als Zeichenkette zum DB-Server gesendet. in der Laborübung verwendet Nachteil: Fehlerhafte Anweisungen und Typkonflikte können erst zur Laufzeit erkannt werden. (CLI unterstützen dynamisches SQL, z.B. JDBC bettet dynamisches SQL in Java ein) Beispiel exec sql begin declare section; Anfragestring char(256) varying; exec sql declare section; exec sql declare AnfrageObjekt statement; Anfragestring:= „delete from Bestellposten where BestNr=1013‟ exec sql prepare AnfrageObjekt from:Anfragestring; exec sql execute AnfrageObjekt Beispiel: Übergabe von Variablen der Wirtssprache als Parameter Anfragestring:= „delete from Bestellposten where BestNr=?‟ exec sql prepare AnfrageObjekt from :Anfragestring; exec sql execute AnfrageObjekt using :loeschBestNr Stored Procedures SQL wird um Konstrukte erweitert, die man aus Programmiersprachen kennt: Schleifen Funktionen/Prozeduren ... Funktionalität der Anwendung kann in der DB realisiert werden Beispiele: Oracle PL/SQL Microsoft Transact SQL Standard: SQL/PSM (Persistent Stored Modules) Stored Procedures (Forts.) Vorteile: Nachteile: Schnell, da die Optimierung durch das DBMS erfolgt ( Daten müssen nicht aus der DB geholt werden!) Prozeduren sind nur von DBMS abhängig nicht von externen Programmiersprachen bzw. Betriebssystem Prozeduren können in der Integritätssicherung verwendet werden, z.B. in Aktionsteil von Triggern Fehlersuche deutlich aufwendiger Benutzerinteraktion schwer realisierbar Besonders nutzvoll wenn Client-Applikationen, die in verschiedenen Sprachen geschrieben sind, auf die gleichen DB-Operationen zugreifen sollen Security wichtig ist: Zugriff nur über stored procedures, kein direkter Zugriff auf Tabellen Stored Procedures vs. Stored Functions SQL/PSM unterstützt Prozeduren und Funktionen Funktion: Liefert Wert zurück Kann nur Eingabeparameter haben Stored Procedure Unterstützt sowohl Eingabe- als auch Ausgabeparameter Definition und Verwendung der Stored Function Create function geschmack (rz int) Returns varchar(20) Begin return case when rz <= 9 then “Trocken” when rz < 9 and rz <= 18 then “Halbtrocken” when rz > 18 and rz <= 45 then “Lieblich” else “Süß” end End SELECT Name, Weingut FROM Weine WHERE Farbe = “Rot” AND geschmack(Restzucker)=“Trocken” Definition und Verwendung der Stored Procedure Create procedure weinliste (in erz varchar(30), out wliste varchar(500)) Begin declare pos integer default 0; for w as WeinCurs cursor for select Name from Weine where Weingut = erz do ... end for; End; define wliste varchar(500); call weinliste(“Helena”, wlist);