Vorlesung Datenbanken 2 - A. Achilles Themen Prolog Wozu Datenbanken Datenmodelle und Grundlagen Datenbank-Entwurf Relationale DBMS Schnittstellen Optimierung Replikation und Synchronisation DRDA XML-Datenbanken DataWareHouse-Konzept Objekt-Relationale DBMS Objektorientierte DBMS -1- Vorlesung Datenbanken 2 - A. Achilles Prolog Prof. Dr. Albrecht Achilles Büro: C.2.46 Sprechstunde: Dienstag 11-12 Telefon 0231/755-6782 privat: 02306/42489 montags, mittwochs: 16.00-17.00 dienstags, donnerstags: 17.00-18.15 freitags vormittags(?) e-mail: [email protected] www: www.inf.fh-dortmund.de/personen/professoren/achilles Vorlesung Studiengang Fachnummer Vorlesung Übung Praktikum Datenbanken Wirtschaftsinformatik 43101 Mo, 8:30-10:05 Raum A.E.02 Mo, 10:15-11:00, Raum A.E.02 Mo, 11:05-13:35, Raum B.E.22 Themen Wozu Datenbanken Geschichtliche Betrachtung Einsatzarten Anforderungen Standardisierungen Entwicklungen Datenmodelle Relationale DBMS Schnittstellen Datenbank-Entwurf Optimierung Replikation und Synchronisation DRDA DataWareHouse-Konzept Objektorientierte DBMS Bücher Achilles, A.: SQL - Standardisierte Datenbanksprache vom PC bis zum Mainframe Oldenbourgh, Auflage von Mitte 1999 Date, C.J.: An Introduction to Database Systems Vol I, II Addison-Wesley, 1990 Date, C.J., Darwen, H.: A Guide to The SQL Standard Addison-Wesley, 1997 Lang, S.M., Lockemann, P.C.: Datenbankeinsatz Springer, 1995 Melton, J., Simon, A.R.: Understanding Relational Language Concepts Morgan Kaufmann Publishers, 1999 Ceri, St., Pelagatti, G.: Distributed Databases, Principles and Systems McGraw Hill, 1984 Weitere Hinweise Kimball, R.: The Data Warehouse Toolkit John Wiley & Sons, 1996 McFadden, F. R. et al.: Modern Database Management Addison-Wesley, 1998 Morrison, J.: Database Driven Web Sites Course Technology, Inc., May 2000 Mullins, C. S.: DB2 Developers Guide Yarger, R. J. et al.: MySQL and mSQL O'Reilly & Associates, 1999 Fleming, C.C., von Halle, B.: Handbook of Relational Database Design Addison-Wesley, 1989 (hrsg.) Lockemann, P.C., Schmidt, J.W.: Datenbank-Handbuch Springer-Verlag, 1987 -2- Vorlesung Datenbanken 2 - A. Achilles Quellen im Internet Auflistung von deutschsprachigen Online-Tutorials (auch zum Thema Datenbanken) Interaktives SQL-Online Tutorial Datenbank-Design Oracle Database Documentation DB2 Online MySQL Tutorial Lotus Notes und Domino http://java.sun.com/docs/index.html http://www.sqlcourse.com http://www.sum-it.nl/cursus/dbdesign/english http://docs.oracle.com/database_mp.html http://www-4.ibm.com/cgi-bin/db2www/data/db2/udb/winos2unix/support/v7pubs/en_main http://www.mysql.com/doc/T/u/Tutorial.html http://www.notes.net Abschluss Unbenoteter Teilnahmenachweis berechtigt zur Teilnahme an der Fachprüfung wird erreicht durch Abgabe von 50% der gestellten Aufgaben die Anzahl der abzugebenden Aufgaben liegt zu den Weihnachtsferien fest Fachprüfung (FPg) Form: Klausur Hilfsmittel: ??? wird rechtzeitig bekannt gegeben -3- Vorlesung Datenbanken 2 - A. Achilles Datenbanken - Wozu Geschichtliche Entwicklung Einsatzarten Anforderungen Standardisierungen Entwicklungen Geschichtliche Entwicklung Dateiensystem: in Anwendungen verankerte I/O-Programmierung => Neuprogrammierung aller I/O-Module, bei Verlagerung oder Veränderung der Dateien, Einführung neuer Platten-Hardware, struktureller Veränderung der gespeicherten Daten Zur Wahrung der Datenkonsistenz: Abgleichprogramme Prä-Relationale DBMS Datacom (invertierte Listen) IMS (hierarchisch, 68) IDMS (Netzwerk, 71) Relationale DBMS Aufsätze seit ca. 75 DB2 (seit ca. 1980) Oracle ... verteilt (seit ca. 95) MySQL (Web-Anfragen) Post-Relational Objekt-Relational: Weiterentwicklung von RDBMS Objekt-Orientiert: z.B. Poet (seit ca. 95) -4- Vorlesung Datenbanken 2 - A. Achilles Einsatzarten "traditionell": kleine bis mittlere Komplexität der Datenstruktur, geringe Transaktionsrate kleines bis mittleres Transaktionsvolumen kleines bis großes Datenvolumen "formatierte Daten" Beispiele: Lagerhaltung Personalverwaltung Geschäftsvorgänge "neue Anwendungen": Typ A mittlere bis hohe Komplexität der Datenstruktur, viele lesende Zugriffe pro Zeiteinheit: Datenvolumen oder Zahl der lesenden Transaktionen geringe schreibende Transaktionsrate sehr geringes Transaktionsvolumen mittleres bis sehr großes Datenvolumen Beispiele: Data Warehouse Web-Anwendungen Typ B geringe bis mittlere Komplexität der Datenstruktur, geringe lesende Zugriffe pro Zeiteinheit extrem hohe Transaktionsraten extrem hohes Transaktionsvolumen mittleres bis sehr großes Datenvolumen Beispiele: Daten für Energieversorger Daten für Telefonabrechnung (insb. Handy) Typ C geringe bis sehr hohe Komplexität der Datenstruktur, geringe lesende Zugriffe pro Zeiteinheit geringe Transaktionsraten ggf. sehr lange Transaktionsdauern extrem hohes Transaktionsvolumen mittleres bis sehr großes Datenvolumen Beispiele: Dokumentenretrieval-Systeme CAD/CAM-Systeme geographische Datenbanken -5- Vorlesung Datenbanken 2 - A. Achilles Anforderungen seit der relationalen Phase Programmierung nicht IO-zentriert: unabhängig von physischer Speicherung unabhängig von Performance-steigernden Maßnahmen Datenadressierung logisch über Eigenschaften Sichern der Integrität Kontrolle der Zugriffe Transaktionsunterstützung Backup und Recovery Verteilung Anforderungen an RDBMS Codd Basis-Regeln Struktur-Regeln Manipulations-Regeln Integritäts-Regeln Basis-Regeln Datenrepräsentation auf logischer Ebene als Tabellen jeder gespeicherte Wert ist logisch durch Kombination von Tabellenname, Primärschlüssel und Spaltenname erreichbar Der NULL-Wert wird unterstützt, er ist von allen anderen Werten verschieden der Katalog ist wie alle anderen Daten auch als Tabellen repräsentiert es muss mindestens eine DB-Sprache geben, die Datendefinition Datenmanipulation Datenretrieval Integritätsbeschränkungen Autorisierungen Transaktionen unterstützt theoretisch änderbare virtuelle Tabellen müssen auch vom System geändert werden Relationen können durchgängig als Operanden behandelt werden Anwendungsprogramme bleiben logisch unberührt von Veränderung der Speicherrepräsentation das Gleiche gilt für informationserhaltende Änderungen der Tabellen Integritätsregeln werden in relationaler DB-Sprache definiert und im Katalog gespeichert. Das System überwacht sie eigenständig und unabhängig von den Anwendungsprogrammen das DBMS ist verteilungsunabhängig falls eine "low-level"-Schnittstelle existiert, können damit nicht Integritäts- und Autorisierungsregeln umgangen werden Struktur-Regeln Beziehungen zwischen Feldern und Tabellen nur über benannte Spalten und unnumerierte Zeilen alle gespeicherten Daten sind in Basistabellen enthalten Ergebnis einer Anfrage ist wiederum eine Tabelle Daten einer virtuellen Tabelle werden bei der Ausführung dynamisch erzeugt Tabellenkopien, die gespeichert werden, erhalten einen Eintrag im Katalog jede Spalte einer Tabelle kann als Attribut aufgefaßt werden das Konzept der Domänen wird unterstützt jede Tabelle hat einen Primärschlüssel stammt eine Spalte(nkombination) aus der gleichen Domäne wie der Primärschlüssel einer (anderen) Tabelle, so handelt es sich um einen Fremdschlüssel zu der Tabelle -6- Vorlesung Datenbanken 2 - A. Achilles Manipulations-Regeln Folgende Operationen werden zumindest unterstützt: Selektion von Zeilen bzgl. der Vergleichsoperatoren = <= < >= > <> Projektion auf Spalten Join von Tabellen mittels Vergleichs von Spalten mit obigen Vergleichsoperatoren Outer Join Division Mengenorientierte Operationen: UNION INTERSECT SET DIFFERENCE Integritäts-Regeln Primärschlüssel darf in keiner Komponente NULL enthalten für jeden Fremdschlüssel, der nicht NULL enthält, muß es einen Eintrag mit korrespondierendem Primärschlüssel in der referenzierten Tabelle geben Anwendungsbezogene Integritätsregeln müssen in der DB-Sprache unterstützt und im Katalog eingetragen werden Standardisierungen CODASYL ANSI/SQL, ISO NIST X/Open ODMG Entwicklungen (RDBMS) Trigger Verteilung Objekt-Relational -7- Vorlesung Datenbanken 2 - A. Achilles Modelle Das hierarchische Modell Benutzer nimmt Daten in hierarchischer Form wahr, also nicht wie im relationalen Modell in Tabellenform Benutzer muss durch die Daten navigieren typischer Vertreter: IMS Beispiel: Modellierung Studenten aus der Sicht des PS Problem: 1. Ebene Student oder Prüfung? Entscheidung für die Ebenen: 1. Student mit Matrikelnummer, Name, Anschrift 2. Grundstudium - Hauptstudium 3. Fächer mit Nr., Dozent, Semester, Ergebnis Besonderheiten im Hauptstudium: Projekt, Arbeit, Kolloquium in IMS Strukturbeschreibung in Assembler-Datei durch die Übersetzung werden ausführbare Dateien und Bibliotheken erzeugt: zum physischen Anlegen der Datenspeicher zum Erzeugen von Zugriffsmethoden, mit deren Hilfe kann aus einem Programm heraus auf die Daten zugegriffen werden graphische Darstellung Skizzierung des DD-Files (Datendefinition) DBD SEGM FIELD FIELD FIELD SEGM FIELD FIELD SEGM FIELD FIELD FIELD FIELD FIELD ... NAME=STUDIES NAME=STUDENT,BYTES=100 NAME=(MATRNR#,SEQ),BYTES=7,START=1 NAME=NAME,BYTES=30,START=8 NAME=ADDRESS,BYTES=63,START=38 NAME=GRUNDST,PARENT=STUDENT;BYTES=2 NAME=(NR#,SEQ),BYTES=1,START=1 NAME=DONE,BYTES=1,START=2 NAME=VORLES,BYTES=35 NAME=(NR#,SEQ),BYTES=2,START=1 NAME=CODE,BYTES=7,START=3 NAME=DOZENT,BYTES=20,START=10 NAME=SEMSTR,BYTES=2,START=30 NAME=RESULT,BYTES=3,START=32 -8- Vorlesung Datenbanken 2 - A. Achilles Skizzierung des PCB-Files (Sicht) PCB SENSEG SENFLD SENFLD SENSEG DBDNAME=STUDIES NAME=STUDENT,PROGOPT=G NAME=MATRNR,START=1 NAME=NAME,START=8 NAME=GRUNDST,PROGOPT=G Damit wird festgelegt, welche Felder der Benutzer sieht wie er auf die Felder zugreifen darf Skizzierung der Operationen Verwendet werden Funktionsaufrufe (z.B. in PL/I), deren Parameter die entsprechende Aktion angeben: GU Get Unique GN Get Next GNP Get Next under current Parent GHU wie GU mit der Möglichkeit eines anschließenden DLET oder REPL entsprechend GHN und GHNP ISRT InSeRT new segment DLET DeLETe existing segment REPL REPLace existing segment GU dient auch der Initialisierung (initial position). Navigierender Zugriff (Pseudo-Code): GU STUDENT WHERE MATRNR# = ' ... ' ; do until no more GRUNDST ; GN GRUNDST ; do until no more VORLES ; GNP VORLES ; /* mach was damit */ end ; end ; Besonderheiten Logical Database Secondary Indexes Recovery Concurrency: Record (Segment) locking Security (via PCB) Integrity: Uniqueness (seq), Regeln für logische Datenbanken ANSI/SPARC-Architektur: drei Ebenen-Architektur -9- Vorlesung Datenbanken 2 - A. Achilles Wie eine Anfrage bearbeitet wird Aufgaben eines DBA Erstellen der konzeptionellen Sicht, Erstellen der internen Sicht, Erstellen der externen Sichten - dies betrifft insbesondere Zugriffsrechte, Dazu kommen noch: Verankern von Regeln, die die Sicherheit und die Integrität der Daten gewährleisten, Datenschutz, Erstellen von Backup-Strategien und Recovery-Prozeduren, Überwachen der Performance und Erstellen von Maßnahmen, um die Gesamtperformance zu steigern, in Zusammenarbeit mit der Systemgruppe: Installation des DBMS und Einbinden neuer Hardware. - 10 - Vorlesung Datenbanken 2 - A. Achilles Generelle Struktur eines DBMS DBA Typische Eingriffsmöglichkeiten auf unterster Ebene: Reservieren von Hauptspeicher für Systempuffer usw. Zeitpunkt: Installation des DBMS Verteilung der Daten auf die Platten Zeitpunkt: Implementation der DB sowie im Lebenszyklus der DB Anschaffung neuer Speicherperipherie zusammen mit Betriebssystemsgruppe Zeitpunkt: Lebenszyklus der DB Einwirkungen auf unterer Ebene: Füllungsgrad der Seiten beeinflussen Reorganisation und damit Clustern der Daten auf den Speicherseiten Bereitstellen von Sekundärindexen Typ eines Sekundärindexes bestimmen (soweit das DBMS dies zuläßt) - 11 - Vorlesung Datenbanken 2 - A. Achilles Einwirkungen auf höherer Ebene: Informationserhaltende Strukturänderungen Bereitstellung von DB-Prozeduren Zugriffspfad-Analyse und -Optimierung TID Indirektion und damit einfache Verschiebbarkeit von Information auf einer Seite Grund: nach mehreren Einfügungen, Löschungen und Änderungen von Datensätzen in einer Seite entstehen Lücken, da die Sätze in der Regel unterschiedlich lang sind => Garbage Collection kann wieder ausreichend Platz auf der Seite beschaffen TID-Konzept verschiebt die Information, wo genau der Datensatz steht, auf die Seite: kürzere Information über den Speicherort gegenüber der vollständigen Adresse bei Garbage Collection braucht nur der Index auf der Seite, die sich bereits im Speicher befindet, geändert werden bei Verschieben von Datensatz auf Überlaufseite (bei Clusterung) muss nur Eintrag im Seitenindex geändert werden Cluster Erfolgt häufig ein Zugriff auf Datensätze in einer bestimmten Reihenfolge, kann eine Clusterung die Performance steigern: die Datensätze werden so auf die Seiten verteilt, dass Sätze, die in der Ordnung (Clusterindex) aufeinanderfolgen, so weit wie möglich jeweils auf einer Seite zusammengefasst werden bei der Verarbeitung in Reihenfolge des Clusterindex werden die physischen Speicherzugriffe minimiert Problem liegen Daten geclustered vor und erfolgen eine Reihe von Änderungen, so können nach gewisser Zeit Datensätze nicht mehr auf diejenige Seite geschrieben werden, auf die sie auf Grund der Clusterung kommen müßten Überlaufseiten zur Aufnahme der Datensätze Lösungen: Füllungsgrad der Seiten verändern Reorganisation - 12 - Vorlesung Datenbanken 2 - A. Achilles Index Aufgabe eines Indexes ist es, einen schnellen Zugriff auf gewünschte Information zu ermöglichen Zugriff auf Datensätze in sortierter Reihenfolge direkter Zugriff auf einen Datensatz Bereichsanfrage Dazu wird der Schlüssel zusammen mit dem TID gespeichert => die zu speichernde Datenmenge ist wesentlich reduziert Zum Suchen gut geeignete Strukturen: Pointerketten Index-sequentiell B-Tree Hash Die Art des Index ist in den meisten Fällen bereits durch die Wahl des DBMS vorgegeben Index: Pointerketten Voraussetzung: Pointerkette wird in Schlüsselreihenfolge verwaltet Schnellerer Zugriff allein dadurch, dass zu durchsuchende Datenmenge erheblich reduziert Bereichsabfragen sowie sortierter Zugriff möglich Typische Verwendung z.B. in Netzwerk-DBMS Index: Index-sequentiell Voraussetzung: Speicherung auf den Daten-Seiten in Schlüsselreihenfolge (sequentiell) Im Index wird für jede Daten-Seite der Schlüssel (und TID) des letzten Records aufgenommen (desjenigen mit größtem Schlüsselwert) Index selbst sequentiell geordnet => Verfahren kann mehrstufig benutzt werden Bereichsanfragen sowie sortierter Zugriff sehr gut Suchen: vgl. "Algorithmen..." Besonderheiten: geeignet z.B. als Cluster-Index Überlauf-Organisation Reorganisations-anfällig Index: B-Tree insbesondere: ausgeglichener sortierter B-Tree Spezialfall von Index-sequentiell wird mit k die für den Baum vereinbarte Schlüsselanzahl bezeichnet, so gilt: der Baum ist sortiert jeder Knoten (bis auf die Wurzel) enthält mindestens k und max. 2k Schlüssel der Weg von der Wurzel zu jedem Blatt ist gleich lang k beschreibt die Breite (Fan Out) des Baumes: k=100 bedeutet z.B., dass man mit nur zwei Zugriffen 100x100=10000 TIDs auffinden kann, mit drei Zugriffen einen Datensatz in 10000 Datensätzen lesen kann schneller Zugriff Bereichsanfragen möglich sortierter Zugriff möglich Problem: Reorganisation Einsatz typisch für RDBMS - 13 - Vorlesung Datenbanken 2 - A. Achilles Index: Hash die Verbindung zwischen Schlüssel und TID erfolgt über eine Funktion, kein Lesezugriff => besonders schnell Problem: keine Bereichsanfrage möglich! kein Zugriff in sortierter Reihenfolge möglich Wahl der geeigneten Hash-Funktion Index Nur eindeutiger Index garantiert, daß angegebener Wert höchstens einmal vorhanden ist Vorteile beim Einsatz: schnelles Suchen von Datensätzen Nachteile beim Einsatz: bei Änderungen (Einfügen, Löschen, Ändern von Datensätzen) muß Index mitgepflegt werden Verlangsamung bei sehr kleinen Dateien (nur wenige Seiten) erzeugt Index sogar beim Lesen zuviel Overhead Index: kombinierte Spalten Index kann aus mehreren Attributen kombiniert sein. Index kann beim Auffinden nur dann sinnvoll benutzt werden, wenn Attribute von links her ohne Lücken bekannt sind: Tabelle Prüfungen MatrNr 4711 4712 4712 4711 4711 VName Programmierung Programmierung Programmierung Datenbanken Programmierung 1 1 2 2 Semester Sommer 2000 Sommer 2000 Winter 2000 Sommer 2001 Sommer 2001 Note 2.0 3.0 3.0 1.0 1.3 werden Informationen über Prüfungen verwaltet und ein Index über MatrNr, VName und Note (in dieser Reihenfolge) angelegt, so kann Index ausgenutzt werden, wenn MatrNr, VName und Note MatrNr und VName MatrNr bekannt sind, sonst jedoch nicht. Manche DBMSe ermöglichen es, mit einem Zugriff auf den Index auszukommen ohne auf die Datensätze zuzugreifen, wenn gesuchte Information bereits im Index vorhanden ist. Anmerkung: die Reihenfolge des Indexspalten muß nicht mit der Reihenfolge der Spalten in der Tabelle übereinstimmen Datenkompression damit kann das gespeicherte Datenvolumen verringert werden weniger Lesezugriffe mehr CPU-Leistung bei der Dekomprimierung Manche DBMSe verwenden spezielle Kompression bei Cluster-Index und geclusterten Datensätzen Optimizer Aufgabe der Komponente: Ermitteln von Zugriffspfaden Ermitteln des "günstigsten" Pfads Kriterien für "günstigen" Pfad: - 14 - Vorlesung Datenbanken 2 - A. Achilles keine Regel-basiert Reihenfolge der Tabellen im SELECT-Statement wenn möglich, Index verwenden ... Kosten-basiert Ermittlung mehrerer Alternativen abschätzende Bewertung der jeweiligen Kosten Plattenzugriffe CPU-Belastung Speicherbedarf Auswahl der günstigsten Alternative Beispiel: Optimzer Tabelle Student Matr-Nr 4711 4712 Name Mustermann Element Vorname Demo ... Anschrift Irgendwo ... ImmatrikDatum 11.11.1999 ... ExmatrikDatum ... ... ... Tabelle Prüfungen MatrNr 4711 4712 4712 4711 4711 VName Programmierung Programmierung Programmierung Datenbanken Programmierung 1 1 2 2 Semester Sommer 2000 Sommer 2000 Winter 2000 Sommer 2001 Sommer 2001 Note 2.0 3.0 3.0 1.0 1.3 Index auf Student.Name und Prüfungen.Matr.Nr Anfrage: SELECT Student.MatrNr, Name, VName, Semester, Note FROM Student, Prüfungen WHERE Name = "Mustermann" AND Vorname = "Demo" Mögliche Zugriffspfade? Optimizer, Beispiele für Zugriffspfade Einige Beispiele: ohne Indexe: Sequentielles Abarbeiten von Student, zu jedem akzeptierten Datensatz sequentielles Abarbeiten von Prüfungen umgekehrt: Abarbeiten von Prüfungen und für jeden akzeptierten Datensatz Abarbeiten von Student Vorsortieren von Prüfungen hinsichtlich des Attributs MatrNr, sequentielle Verarbeitung von Student, für jeden akzeptierten Datensatz binäres Suchen in der sortierten Tabelle von Prüfungen Vorsortieren beider Tabellen nach dem Attribut MatrNr und Zusammenfügen, danach satzweises Abarbeiten mit Einsatz von Indexen Sequentielles Abarbeiten von Student, für jeden akzeptierten Datensatz direkter Zugriff auf Prüfungen Direkter Zugriff auf akzeptierte Datensätze von Student, danach direkter Zugriff auf Prüfungen ... ... und wenn beide Tabellen nach MatrNr geclustered vorliegen? - 15 - Vorlesung Datenbanken 2 - A. Achilles Regel-basiert Direkter Zugriff auf akzeptierte Datensätze von Student, danach direkter Zugriff auf Prüfungen Je nach Regelsatz bleibt nur dieser Ansatz übrig. Nicht immer optimal! (?) Kosten-basiert ohne Indexe: Sequentielles Abarbeiten von Student, zu jedem akzeptierten Datensatz sequentielles Abarbeiten von Prüfungen ergeben sich aus dem sequentiellen Lesen der Tabelle Student und dem wiederholten sequentiellen Lesen der Tabelle Prüfungen. Dabei geht die Selektivität der Anfrage hinsichtlich der Tabelle Student ein umgekehrt: Abarbeiten von Prüfungen und für jeden akzeptierten Datensatz Abarbeiten von Student Kosten: ? Vorsortieren von Prüfungen hinsichtlich des Attributs MatrNr, sequentielle Verarbeitung von Student, für jeden akzeptierten Datensatz binäres Suchen in der sortierten Tabelle von Prüfungen Kosten: ? Vorsortieren beider Tabellen nach dem Attribut MatrNr und Zusammenfügen, danach satzweises Abarbeiten Kosten: ? mit Einsatz von Indexen Sequentielles Abarbeiten von Student, für jeden akzeptierten Datensatz direkter Zugriff auf Prüfungen ... Kosten: ? Direkter Zugriff auf akzeptierte Datensätze von Student, danach direkter Zugriff auf Prüfungen Kosten: ? ... und wenn beide Tabellen nach MatrNr geclustered vorliegen? - 16 - Vorlesung Datenbanken 2 - A. Achilles Datenbanken - Entwurf Fragestellung: von der "Idee" zur implementierten Datenbank (einschließlich "zentraler Programme/DB-Prozeduren"): wie? es muß sichergestellt werden, daß Datenbasis über langen Zeitraum gestellten Anforderungen genügt Randbedinungen ähnlich dem Entwurf von Programm-Systemen Rückgriff auf Methoden und Erkenntnisse des Software Engineering Vorgehensmodell (4-Phasen-Modell): Analyse konzeptueller Entwurf logischer Entwurf physischer Entwurf Ziel dieser Vorgehensweise möglichst frühe Berücksichtigung von Informations- und Datenverarbeitungsanforderungen möglichst späte Festlegung auf DBMS Hardware und BS sollen erst ganz zum Schluss Eingang finden (vgl. Software-Entwurf und -Entwicklung) Analyse-Phase Abgrenzung des Anwendungsbereichs, Konkretisierung (vgl. Systemanalyse) Daten: Herkunft, Ziel, Volumen ermitteln Prozesse: rechnergestützt, andere Analyse-Phase (detailierter) Datenbank dient der Informationsablage und -gewinnung Informationsbedarf muss detailiert beschrieben werden Unterschiedliche Aspekte müssen in getrennten Verzeichnissen festgehalten werden: Datenverzeichnisse: beschreiben die zu speichernde Fakten Operationsverzeichnisse: beschreiben Verwendung der Daten Ereignisverzeichnisse: beschreiben, welches Ereignis eine Operation auslöst. Daraus ergeben sich die Abläufe. Endanwender-orientiert, hier wird nur schwach formalisiertes Vorgehen vorgestellt basiert z.B. auf Formularen, Arbeitsabläufen und -beschreibungen, Mitarbeiterbefragungen, Dokumenten usw. - 17 - Vorlesung Datenbanken 2 - A. Achilles Schritte 1. Erfassen und Beschreiben der benötigten Daten 2. Beseitigen von Synonymen und Homonyen Redundanzen 3. Erfassung nur implizit vorhandener Information 4. Klassifizierung: Aufteilung und Zuordnung zu Daten/ Operationen/ Ereignisse Datenverzeichnis (FH) Nr. D001 Name Student D002 Professor D003 Prüfung D004 Beschreibung Identifikation MatrNr Klassifikation Person Daten Name, Anschrift, FB, Datum Immatrikulation, - Exmatrikulation Identifikation PersNr Klassifikation Person Daten Name, Anschrift, FB, Raum, Telefon, Lehrgebiet Identifikation PrüfNr Klassifikation Studienleistung Daten Fach, Professor, Datum, Vorleistungen Zusatz-Info Synonyme immatrikulierter Student, aktiver Student ehemaliger Student Kardinalität 150000 Oberbegriff Mitglied Synonyme Dozent Kardinalität 500 Oberbegriff Mitglied Synonyme Fachprüfung, Leistungsnachweis, Projektarbeit, Diplomarbeit, Kolloquium Kardinalität 5000 Oberbegriff Zensur Studentische Identifikation LNr Synonyme Prüfungsleist Klassifikation Studienleistung Kardinalität 50000000 ung Daten Student, Prüfung, Oberbegriff Wiederholung, Note Operationsverzeichnis (FH) Nr. O001 Name Student immatrikulieren O002 Student exmatrikulieren O003 Notenspiegel erstellen O004 Noten eingeben O005 Prüfungsliste erstellen Beschreibung Eingabe Name, Anschrift, FB, Datum Ausgabe eindeutige MatrNr Eingabe Name, Anschrift, Datum Exmatrikulation Ausgabe Eingabe Name, Anschrift Ausgabe Fächer, Noten Zusatz-Info Häufigkeit selten Bezugsdaten D001 DB Einfügen Häufigkeit selten Bezugsdaten D001 DB Suchen, Ändern Häufigkeit mittel Bezugsdaten D001, D002, D003, D004 DB Suchen Häufigkeit häufig Bezugsdaten D001, D003, D004 DB Suchen, Einfügen Eingabe MatrNr, PrüfNr, Wiederholung, Note Ausgabe [endgültig nicht[ bestanden Eingabe Fach, Professor, Datum Häufigkeit häufig Ausgabe Student, Note Bezugsdaten D002, D003, D004 DB Suchen Ereignisverzeichnis (FH) Nr. E001 E002 E003 Name Ankunft Studentenanwärter Eingang Notenliste Anforderung Ergebnisspiegel Bedingung Syntax elementar Semantik konditional (falls) Syntax elementar Semantik konditional Syntax elementar Semantik temporal (wenn) - 18 - löst aus O001 O003, O002 O005 Vorlesung Datenbanken 2 - A. Achilles konzeptuelle Phase vergleichbar mit Spezifikationsphase bei Software-Entwicklung um Sachverhalte und Gesetzmäßkeiten in formale Gestalt überführen Beschreibungsmittel eines semantischen Modells verwenden Ziel: vorgegebene Sachverhalte vollständig und korrekt innerhalb der festgelegten Strukturen des Modells zu beschreiben, dabei wird angestrebt, daß das Ergebnis unabhängig von einem speziellen Datenmodell eines DBMS ist. konzeptuelle Phase -Relationentheorie wünschenswert: Transformation vom semantischen zum logischen Modell automatisieren Wenn relationales Modell auch für semantische Zwecke geeignet ist, kann es als Ausgangs- und Zielpunkt sukzessiver Transformationen genommen werden dazu: Abhängigkeit zwischen Attributen betrachten Gütekriterium bei Transformation: Verringerung der Speicherredundanzen und Anomalien Der Entwurfsansatz kann dann zur Optimierung bestehender Relationenschemata als auch bei Neuentwicklung benutzt werden. Redundanzen und Anomalien Werden zur Verdeutlichung die kompletten Informationen über die Professoren in den Prüfungen aufgeführt: Nr. - Name Professor D003 Prüfung Beschreibung Identifikation PersNr Klassifikation Person Identifikation PrüfNr Klassifikation Studienleistung Daten Fach, Professor, Anschrift, FB, Raum, Telefon, Lehrgebiet, Datum, Vorleistungen Zusatz-Info wird nach D003 verlagert Synonyme Fachprüfung, Leistungsnachweis, Projektarbeit, Diplomarbeit, Kolloquium Kardinalität 5000 Oberbegriff Zensur dann: Ändern sich die Daten eines Professors an vielen Stellen Änderungen notwendig Änderungsanomalie Einfügen von Daten eines neuen Professors neue Prüfung muss angegeben werden, ohne Prüfung nicht möglich! Einfügeanomalie Löschen einer Prüfung, die als einzige Daten eines Professors enthält Informationen über diesen verschwinden ebenfalls Löschanomalie - 19 - Vorlesung Datenbanken 2 - A. Achilles Relationentheorie - Normalisierung Darstellung als Relationen d.h. als Teilmenge aller Tupel des durch die Domänen gegebenen Kreuzproduktes. Domäne: Wertebereich eines Attributs Entwurfsziel: Redundanzen verringern und damit die Anomalien vermeiden Einführung der Normalformen dienen der Elimination der Redudanzen: 1. Normalform Eine Relation ist in 1. NF, wenn alle Attributdomänen ausschließlich atomare Werte besitzen: Zahlen, Zeichenketten, Datumswerte usw. Ausgeschlossen sind damit explizit Listen, Records, Relationen, Mengen, usw. Funktionale Abhängigkeiten (Definitionen): Anmerkung: die folgenden Aussagen gelten zeitunabhängig, d.h. man kann ihre Gültigkeit nicht aus der momentanen Ausprägung einer Relation entnehmen. Definition "funktional abhängig" Gibt es zeitunabhängig eine Abbildung (Funktion) von einer Attributmenge in eine andere Attributemenge einer Funktion, so heißt die zweite Attributmenge funktional abhängig von der ersten Definition „voll funktional abhängig“ Ist eine Attributmenge funktional abhängig von einer Attributmenge, nicht aber von einer Teilmenge dieser Attributmenge, so nennt man diese Abhängigkeit voll funktional abhängig Definition „Schlüssel“ Ein Schlüssel ist eine Attributmenge, von der die Relation voll funktional abhängt diese Attributmenge ist minimal identifizierend für die Relation Eine Relation kann mehrere unterschiedliche Schlüssel haben. 2. Normalform Eine Relation in 1NF ist in 2NF, wenn jedes Nicht-Schlüsselattribut voll funktional von jedem Schlüssel abhängt. Definition „transitiv abhängig“ Eine funktionale Abhängigkeit heißt transitiv abhängig, wenn sie durch 2 nicht-triviale funktionale Abhängigkeiten ersetzt werden kann. - 20 - Vorlesung Datenbanken 2 - A. Achilles 3. Normalform Eine Relation in 2NF ist in 3NF, wenn es kein Nicht-Schlüsselattribut gibt, das transitiv von einem Schlüssel abhängt Anmerkung: die Abhängigkeit im letzten Bild war trivial! Boyce-Codd Normalform Alle Attribute hängen voll funktional von jedem Schlüssel ab Definition „mehrwertige Abhängigkeit“ Spannen die disjunkten Attributmengen A, B, C die Relation R auf, so liegt eine MVD (Multi Valued Dependence = mehrwertige Abhängigkeit) vor, wenn der Zusammenhang zwischen A und C ohne Kenntnis der Werte von B beschrieben werden kann 4. Normalform Eine Relation in 3NF ist in 4NF, wenn es außer funktionalen Abhängigkeiten keine MVDs gibt. Anmerkung 1 Die Normalisierung kann bis zur 4NF schrittweise durch verlustfreie informationserhaltende Zerlegung der jeweiligen Ausgangsrelation in zwei Relationen erfolgen. Anmerkung 2 Das Vorgehen bei der Zerlegung ist robust hinsichtlich der Auswahl der Primärschlüssel, wenn mehrere Schlüsselkandidaten vorliegen. Kleine Abweichungen sind nur zu erwarten bei der Aufstellung von "Verbindungsrelationen". Es kann noch den Fall geben, daß eine verlustfreie Zerlegung nicht in 2, wohl aber in mehr Relationen möglich ist. Dieser Fall wird durch die 5. Normalform beschrieben. Definition: JD (Join Dependency) Eine Relation erfüllt JD bzgl. der disjunkten aufspannenden Attributmengen A, B, C, ..., wenn die Relation durch Join aus den Projektionen R|A, R|B, R|C, ... entsteht. 5. Normalform Eine Relation in 4NF ist in 5NF, wenn alle JDs nur auf Schlüsselkandidaten beruhen. Die Zerlegung kann mit Werkzeugen unterstützt werden. Höhere Normalformen bewirken verringerte Redundanz weniger Anomalien besser hinsichtlich Datenänderungen Aber: in der Regel mehr Tabellen mehr Joins verringerte Effizienz beim Lesen deswegen: Implementation relationaler Datenbanken beendet Normaliserung in vielen Fällen bereits nach der 2. NF Relationentheorie gut, wenn auf den logischen Entwurf abgestimmt, d.h. gut geeignet für relationale Datenbanken Generell wird Semantik nur sehr eingeschränkt unterstützt Relationentheorie wenig geeignet, um konzeptuelle Modellierung weitgehend unabhängig vom Datenmodell eines DBMS durchzuführen - 21 - Vorlesung Datenbanken 2 - A. Achilles E-R-Modell (Entity-Relationship) semantisches Modell, ausschließlich für konzeptuellen Entwurf muß zur Implementierung noch übersetzt werden E-R-Modell ca. 25 Jahre alt entstanden in einer Zeit, als noch keine Objekt-orientierten Techniken diskutiert wurden Vorteil: intuitive Semantik einfache graphische Darstellung anschaulich und gut lesbar Definitionen: Entity (Gegenstand) abstraktes oder physisches Objekt der zu modellierenden Welt Entity Type Zusammenfassung aller Entities gleicher Bedeutung Attribut dienen der Beschreibung und zur eindeutigen Identifizierung von Entities Domäne Wertebereich eines Attributs Relationship beschreibt Zusammenhang zwischen mehreren Entities ggf. mit zusätzlicher Information n-stelliger Relationship-Type kombiniert eine feste Menge von n Entity-Types (nicht notwendig unterschiedliche Entity-Types) Beispiel für graphische Darstellung - 22 - Vorlesung Datenbanken 2 - A. Achilles Beispiel zeigt: Entity-Types mit Attributen Relationship-Types insbesondere 3-stelligen Relationship-Typ Kardinalitäten macht für einen Relationship-Typ eine Aussage über Mindest- und Höchstzahl des Auftretens einer Ausprägung eines Entity-Types Darstellung: <min,max> (max=*: keine Beschränkung) Aggregation (blau) Aggregation, Generalisierung Relationship nur zwischen Entities möglich Aggreation: neuen Zusammenfassung eines Relationship-Types mit seinen Entity-Types zu einem Entity-Type Generalisierung: Zusammenfassung ähnlicher Entity-Types zu einem neuen generischen Entity-Type. für das eingangs betrachtete Beispiel: Professor Student (Mitarbeiter) durch Generalisierung ggf. FH-Angehöriger Weak Entity-Type Entity-Type kann nicht für sich alleine existieren er bedarf (mindestens) eines zugehörigen Relationship-Types Kardinalität: <1,1> Beispiel: Student, Prüfungsleistung Wird Information über Student entfernt, so auch seine Prüfungsleistungen Darstellung - 23 - Vorlesung Datenbanken 2 - A. Achilles Grenzen: Stärke (Einfachheit, nur Entity- und Relationshiptype) = Schwäche mangelnde formale Fundierung Kardinalitätsangaben besonders anfällig für Fehler objektiv ermittelbare Gütekriterien? Objektorientiert Relationentheorie, E-R-Modellierung ausschließlich strukturelle Merkmale, nicht Verhalten, Oeratoren, Ereignisfolgen aber: Datenstrukturen und verarbeitende Algorithmen eng verzahnt einerseits: DB-Einsatz sollte Trennung zwischen Daten und Anwendungsprogrammen betonen, da auf Grund von Langlebigkeit Anwendungsprogramme nie vollständig vorhersehbar andererseits: Leistungsoptimierung erfordert Vorhersagen über Anwendungen, Abfolge von Programmaufrufen, ... OO-Techniken naheliegend 3 Phasen, in der Regel nacheinander ausgeführt Strukturelle Modellierung Beschreibung aller relevanten Eigenschaften Dynamikmodellierung Beschreibung der Objektzustände und der einwirkenden Ereignisse Funktionsmodellierung Beschreibung der Aktivitäten als Ausführung von Operatoren Strukturelle Modellierung Klasse anstelle von Entity-Type Beziehungsdarstellung mittels Kardinalitäten - 24 - Vorlesung Datenbanken 2 - A. Achilles - 25 - Vorlesung Datenbanken 2 - A. Achilles mehrstellige attributierte Assoziation Aggregation (ist Bestandteil von) und Generalisierung (Vererbungsbeziehung) Dynamikmodellierung Zeitveränderliche Aspekte, Kontrollfluß zwischen den Objekten Zustandsübergangsdiagramme: zulässige Zustände und mögliche Übergänge - 26 - Vorlesung Datenbanken 2 - A. Achilles Funktionsmodell basiert auf klassischem Datenflußdiagramm Prozesse Datenspeicher Aktoren Entwurf und Integration Problem: die Zahl der Entity-Types kann bei Entwürfen schnell auf mehrere 100 kommen Übersichtlichkeit nicht mehr gegeben Vorgehensweise: Der konzeptuelle Entwurf wird aufgeteilt Gleiches Vorgehen, wenn bereits existierende Datenbanken zusammengeführt werden müssen im ersten Fall: die zu modellierenden Ausschnitte entstehen koordiniert im zweiten Fall: Ausschnitte sind unkoordiniert entstanden Überlegung: jede Anwendergruppe hat eine ihrer Aufgabenstellung gemäße Sicht der Datenbasis Phase 1: identifiziere die verschiedenen Anwendergruppen entwickle konzeptuelles Modell Phase 2: integriere die so entstandenen Modelle Problem ist das Auffinden der Arbeitsgruppen, ansonsten: Entwicklung der Teilmodelle ist bereits behandelt Phase 2: Zusammenführung der Teilmodelle Welche Probleme können auftreten? Namenskonflikte gleicher Sachverhalt wird mit unterschiedlichen Namen belegt (Synonyme) unterschiedliche Sachverhalte werden mit gleichem Namen belegt (Homonyme) Merkmalskonflikt gleicher Sachverhalt wird in unterschiedlichen Teilmodellen unterschiedlich betrachtet und führt zu unterschiedlich vielen oder nur teilweise überlappenden Satz an Attributen Strukturkonflikt gleicher Sachverhalt wird in den Teilmodellen unterschiedlich modelliert z.B. im E-R-Modell als Attribut-Domänenpaar oder als Relationship mit zweitem Entity-Type Bedingungskonflikt funktionale oder mehrwertige Abhängigkeiten, Schlüsseleigenschaften, Kardinaltitäten... im E-R-Modell z.B. unterschiedliche Kardinalitäten bei Teilmodellen Abstraktionskonflikt gleicher Sachverhalt in unterschiedlichen Teilmodellen unterschiedlich detailliert modelliert - 27 - Vorlesung Datenbanken 2 - A. Achilles Phase 2: Zusammenführungs-Strategie Problem: Komplexitätsreduzierung Problem: Systematik der Anordnung - 28 - Vorlesung Datenbanken 2 - A. Achilles Problem: Systematik der Reihenfolge Bemerkung erster Ansatz scheidet in der Regel aus Komplexitätsgründen aus Ansätze 2 und 3 aus Sicht der Komplexität her möglich liefern aber je nach Zusammenfassung, Reihung unterschiedliche Ergebnisse n-1 gleichartige Konsolidierungsschritte jeder Schritt: Konfliktanalyse beide Sichten vergleichen Konfliktbereinigung für jeden ausgemachten Konflikt: eine Sicht "gibt nach" z.B: bei Abstraktionskonflikt diejenige mit geringerem Detailierungsgrad Sichtenverbindung zu einem Schema zusammenführen: identische Teile nur einmal erfassen disjunkte Teile vollständig übernehmen bei Abstraktionskonflikten: einpassen Physischer Entwurf (bei RDBMS) prinzipiell gilt: die Kosten durch den physischen Zugriff sind zu minimieren dies kann bei RDBMS durch folgenden Ansatz geschehen: Festlegung von Speicherbereichen und Zuordnung zu Plattenpartitionen Vereinbarung von Tabellenbereichen zur Aufnahme einer oder ggf. mehrerer gleichartig zu behandelnder Relationen Anzugeben sind Speicherbereich Anfangsgröße - 29 - Vorlesung Datenbanken 2 - A. Achilles erwartete Wachstumsrate Seitengröße Zuordnung von Relationen zu Tabellenbereichen Clusterung Erzeugen von Indexen manche werden automatisch durch das verwendete RDBMS angelegt, ggf. ist noch der Speicherbereich anzugeben Clusterindex Primärindex Sekundärindexe zur Unterstützung von Fremdschlüsseln weitere Indexe Installation des gewählten DBMS Anpassung der Installationsparameter an die Anforderungen dies betrifft unter anderem Directory-Größe Größe für temporäre Tabellenbereiche (Sortieren usw.) im Speicher zu reservierender Bereich für DBMS Cache für Datenseiten Cache für DB-Kommandos und -Zugriffspfade Bereitstellen der Sichten Benutzerverwaltung Rechtevergabe Implementation der Integritätsregeln Implementation der DB-Prozeduren - 30 - Vorlesung Datenbanken 2 - A. Achilles Relationale DBMS SQL Standard SQL92 mit Erweiterungen Vorgänger: SQL86, SQL89 derzeit: SQL92 in drei Leveln, um Herstellern Übergang zu erleichtern (mit späteren Erweiterungen) Entry-Level notwendig für SQL92-Kompatibilität NIST-Institute überwachte die Konformität zu diesem Level Intermediate-Level Full Level Erweiterungen CLI (Call Level Interface) - 1995 PSM (Persistent Stored Modules) - 1996 SQL Standard Sprache besteht aus Definitionssprache Datenretrieval Datenmanipulation Kontrolle Sprachanbindungen Module Embedded SQL CLI JDBC - 31 - Vorlesung Datenbanken 2 - A. Achilles Sprachelemente Datentypen, Konstanten, NULL vordefinierte Variable CURRENT_DATE usw. CURRENT_USER usw. skalare Funktionen numerische Funktionen POSTION, EXTRACT, CHARACTER_LENGTH, OCTET_LENGTH, BIT_LENGTH Zeichenkettenfunktionen CONVERT, LOWER, SUBSTRING, TRANSLATE, TRIM, COLLATE, UPPER, || CAST CASE mit NULLIF, COALLESCE Spaltenfunktionen AVG, COUNT, MAX, MIN, SUM Zeilenkonstruktor (Row Value Constructor) ausdruck oder (ausdruck1[, ausdruck2[,...]]) oder (subquery) Tabellenkonstruktor Ausdrücke skalare Ausdrücke Tabellenausdrücke Join-Tabellenausdruck Tabellenname geklammerter allgemeiner Tabellenausdruck Prädikate einfache Prädikate VALUES zk1[, zk2[,...]] BETWEEN, EXISTS, IN, IS NULL, LIKE, MATCH, OVERLAPS, UNIQUE quantifizierte Prädikate z.B: >= ALL, >= ANY, >= SOME gefolgt von einem Subselect Datenbankstruktur SQL-Umgebung: DBMS- Instanz zusammen mit allen Datenbanken, auf die diese Instanz zugreifen kann angelegten Benutzern Programmen Katalog enthält eine Menge von SQL-Schemata, SQL-Schema ist jeweils einem Benutzer zugeordnet, aber Benutzer kann mehrere Schemata besitzen Schema enthält eine Reihe von realen Einträgen wie z.B. Tabellen, Views, etc. Katalog: eine Menge logisch zusammengehörender Tabellen, Schema: ein spezieller Ausschnitt daraus Implementation eines Kataloges: DBMS-Hersteller jedoch: Standard fordert pro Katalog genau ein spezielles Schema mit dem Namen INFORMATION_SCHEMA "Dictionary" - Metainformation aller in den Schemata gespeicherten Objekte - 32 - Vorlesung Datenbanken 2 - A. Achilles INFORMATION_SCHEMA INFORMATON_SCHEMA_CATALOG_NAME SCHEMATA DOMAINS TABLES VIEWS COLUMNS TABLE_PRIVILEGES COLUMN_PRIVILEGES USAGE_PRIVILEGES DOMAIN_CONSTRAINTS KEY_COLUMN_USAGE ASSERTIONS CHARACTER_SETS COLLATIONS TRANSLATIONS VIEW_TABLE_USAGE VIEW_COLUMN_USAGE CONSTRAINT_TABLE_USAGE CONSTRAINT_COLUMN_USAGE COLUMN_DOMAIN_USAGE SQL_LAGUAGES INFORMATION_SCHEMA_CATALOG_NAME_CARDINALITY SQL_IDENTIFIER CHARACTER_DOMAIN CARDINAL_NUMBERS (Assertion) (Domain) (Domain) (Domain) Benennung (voll-qualifiziert): katalog_name.schema_name.objekt_name katalog_name.schema_name.objekt_name.spalten_name Da mit SQL-Environment und -Sitzung Katalog und Schema verbunden sind, werden diese ergänzt, wenn der Name nicht voll-qualifiziert ist. SQL-Sitzung Verbindung: Ende mit CONNECT DISCONNECT innerhalb eine Reihe von Transaktionen Eine Anwendung kann nacheinander mehrere Verbindungen - und damit mehrere Sitzungen - aufbauen; die jeweils vorhergehende Sitzung wird damit vorübergehend "in Ruhe versetzt" CONNECT TO ... SET CONNECTION ... Zeichensätze eigene Zeichensätze können vereinbart werden alphabetische Sortierreihenfolge kann vereinbart werden Übersetzungsvorschrift kann vereinbart werden CREATE CHARACTER SET CREATE COLLATION CREATE TRANSLATION - 33 - Vorlesung Datenbanken 2 - A. Achilles Constraints Einschränkungen, die erfüllt sein müssen, damit Daten in Tabellen eingetragen werden können Constraints (benannt oder unbenannt) sind möglich für Schema (nur unbenannt) Domain Tabelle Tabellenspalte Constraints können sofort oder erst am Ende einer Transaktion (verzögert) überprüft werden Sie lauten somit (innerhalb der jeweiligen CREATE Anweisung): [CONSTRAINT name] einschränkung [[INITIALLY DEFERRED | INITIALLY IMMEDIATE] [[NOT] DEFERRABLE] ] Constraints (Einschränkung) CHECK (prädikat) wirkt, als würde entsprechend die Anweisung SELECT * FROM tables WHERE NOT (prädikat) ausgeführt. Enthält diese Ergbnistabelle Zeilen, so wäre die CHECK-Einschränkung verletzt. Constraints (Einschränkung) in einer Tabellendefinition PRIMARY KEY UNIQUE ( ... ) ( ... ) FOREIGN KEY ( ... ) REFERENCES tabelle [((...)] [ MATCH {FULL|PARTIAL} ] [ ON UPDATE {CASCADE|SET NULL|SET DEFAULT|NO ACTION} ] [ ON DELETE {CASCADE|SET NULL|SET DEFAULT|NO ACTION} ] Primärschlüssel, Eindeutigkeit und Fremdschlüssel-Vereinbarungen Constraints (Einschränkung) in einer Spaltendefinition NOT NULL PRIMARY KEY UNIQUE REFERENCES tabelle [((...)] [ MATCH {FULL|PARTIAL} ] [ ON UPDATE {CASCADE|SET NULL|SET DEFAULT|NO ACTION} ] [ ON DELETE {CASCADE|SET NULL|SET DEFAULT|NO ACTION} ] Unzulässigkeit von NULL-Werten, Primärschlüssel, Eindeutigkeit und Fremdschlüssel-Vereinbarung DDL - Data Definition Language CREATE SCHEMA ... DEFAULT CHARACTER SET CREATE DOMAIN CREATE TABLE CREATE VIEW CREATE ASSERTION CREATE CHARACTER SET CREATE COLLATION CREATE TRANSLATION GRANT ... ... ... ... ... ... ... ... ... - 34 - Vorlesung Datenbanken 2 - A. Achilles temporäre Tabellen CREATE TABLE {GLOBAL|LOCAL} TEMPORARY name ... [ ON COMMIT {DELETE|PRESERVE} ROWS ] Nicht persistente Daten, die im Laufe einer Transaktion zur Verfügung stehen müssen, können auf diese Weise strukturiert werden. Besonderheiten: Gültigkeitsbereich Aufbewahrungsdauer Foreign Key Check Views Gründe Information kann auf Sicht des jeweiligen Benutzers angepasst werden Basis-Tabellen können unabhängig von Benutzersicht strukturell verändert werden Datenschutz CREATE VIEW AS SELECT ... ... [ WITH [CASCADED|LOCAL] CHECK OPTION ] ORDER BY nicht erlaubt rekursive Definition ausgeschlossen Überprüfung der VIEW-Definition Datenänderung durch Views: änderbare VIEWs Domains CREATE DOMAIN ... [ DEFAULT ... ] [ constraint ] [ COLLATE .... ] permamente Tabellen (Basis-Tabellen) CREATE TABLE ... ( spalte ... [ spalten_constraint ] [ DEFAULT ... ] [ COLLATE ... ], ... [ tabellen_constraint, ... ] ) Assertions (An Schemata gebundene Einschränkungen) CREATE ASSERTION ... CHECK ( prädikat ) [ [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ [NOT] DEFERRABLE ] Im Gegensatz zu Tabellen-Einschränkungen gelten diese Einschrängungen generell Tabellen-Einschränkungen werden nur überprüft, wenn eine Datenänderung vorgenommen wird, die diese Tabelle betrifft typische Erweiterungen CREATE CREATE CREATE CREATE CREATE FUNCTION INDEX PROCEDURE TABLESPACE TRIGGER - 35 - Vorlesung Datenbanken 2 - A. Achilles typische Erweiterungen Ergänzungen der Standard-Anweisungen um Angaben, die den Speicherort festlegen das Logging beeinflussen Clustern/Partitionieren unterstützen Art der Replikation beeinflussen ... typische Erweiterung: Trigger CREATE TRIGGER ... { BEFORE | AFTER | INSTEAD OF } { INSERT | DELETE | UPDATE } ON ... [ REFERENCING [ OLD AS ref_old ] [ NEW AS ref_new ] ] { FOR EACH ROW | FOR EACH STATEMENT } [ WHEN ( bedingung ) ] trigger_aktion Rechte GRANT { ALL PRIVILEGES | SELECT | DELETE | INSERT [( ... )] | UPDATE [( ... )] | REFERENCES [( ... )] } ON TABLE ... TO ... | PUBLIC [ WITH GRANT OPTION ] Für Datenbankobjekte wie DOMAIN, COLLATION usw. lautet die Rechtevergabe GRANT USAGE ON ... TO ... | PUBLIC [ WITH GRANT OPTION ] REVOKE [ GRANT OPTION FOR ] ... ON ... FROM ... | PUBLIC { CASCADE | RESTRICT } GRANT OPTION FOR entzieht die GRANT OPTION CASCADE löscht auch abhängige Objekte - 36 - Vorlesung Datenbanken 2 - A. Achilles Veränderung des SQL-Environments SET CONNECTION ... SET CONSTRAINTS ... { DERFERRED | IMMEDIATE } SET TRANSACTION { ISOLOATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZE } | { READ ONLY | READ WRITE } | ... } SET CONNECTION dient dazu, die aktive Verbindung zu wechseln SET CONSTRAINTS verändert den Zeitpunkt, zu dem die Prüfung durchgeführt wird SET TRANSATION beeinflußt die Performance (Nebenläufigkeit von Transaktionen) sowie die gegenseitige Beeinflussung: volle Serialisierbarkeit: SERIALIZE wenn erlaubt ist, dass bei erneutem (gleichen) SELECT innerhalb einer Transaktion auch Datensätze erscheinen können, die von anderen Transaktionen inzwischen eingefügt wurden: REPEATABLE READ (Zeilen, die gelesen wurden, bleiben unverändert) wenn bei erneutem gleichen SELECT innerhalb einer Transaktion auch die gelesenen Zeilen von einer anderen Transaktion geändert werden dürfen: READ COMMITTED wenn auch Zeilen gelesen werden dürfen, die von anderen Transaktionen noch nicht freigegeben wurden: READ UNCOMMITTED DML Datenretrieval SELECT FROM WHERE GROUP BY HAVING .... .... .... .... .... JOIN in der FROM-Klausel: tabelle1 JOIN tabelle2 ON tabelle1 USING (spalte) tabelle1 NATURAL JOIN ON tabelle2 und weitere Tabellenausdrücke Unteranfragen - ungebunden: in einer Subquery wird eine Ergebnismenge ermittelt und ein Vergleich mit einem Record (ggf. mit Allquantor) durchgeführt Unteranfrage - gebunden: durch Einführung einer Tabellenreferenz und Benutzung der Referenz in der Subquery wird die Subquery jeweils für die gerade betrachtete Zeile berechnet Verbindung von SELECT-Anfragen: SELECT .... FROM .... WHERE .... .... UNION | INTERSECT | EXCEPT SELECT .... FROM .... WHERE .... .... Geordnete SELECT-Anfragen: SELECT-Anweisung ORDER BY .... - 37 - Vorlesung Datenbanken 2 - A. Achilles Problem mit NULL: Vergleich zwischen SUM(spalte)/COUNT(*) und AVG(spalte) Einfügen INSERT INTO tabelle [ (spalte1 ,... ) ] { SELECT-Anweisung | Tabellen-Konstruktor } Löschen DELETE FROM tabelle [ WHERE CURRENT OF cursor | WHERE Suchbedingung ] Ändern UPDATE tabelle SET spaltei = { ausdrucki | NULL | DEFAULT } .... [ WHERE CURRENT OF cursor | WHERE Suchbedingung ] DCL - Datenkontrolle Transaktionen COMMIT ROLLBACK Erweiterungen: SAVEPOINT save ROLLBACK SAVEPOINT save LOCK TABLE tabelle IN {SHARE|EXCLUSIVE} MODE - 38 - Vorlesung Datenbanken 2 - A. Achilles Schnittstellen - Überblick Spracherweiterungen haben sich nicht durchgesetzt Module-Sprache: insbesondere als Definitionsgrundlage für SQL92 Konzept Trennung zwischen SQL und Programmiersprache, wohldefinierter Übergabemechanismus zwischen Programm und Module aber: Implementation völlig von DBMS-Hersteller abhängig embedded SQL Konzept Einbetten der SQL-Anweisungen in den Programm-Quelltext Verwendung eines Präkompilers aber: Probleme bei der „Vermischung“ von Einbettung und Programmiersprache Call-Level-Interface wichtiger Standard Trennung zwischen SQL und Programmiersprache, wohldefinierter Übergabemechanismus zwischen Programm und CLI-Routine Implementation weitgehend Datenbank-unabhängig JDBC wichtiger (kommender) Standard, insbesondere für DB-Prozeduren, Web-Anbindungen Grundlagen Cursor-Konzept Status und Fehlererkennung NULL-Wert und Indikator-Variablen Schnittstellen - Cursor-Konzept SELECT-Anweisung ergibt eine Ergebnistabelle Prozedurale Programmierung ist auf satzweise Verarbeitung abgestellt SELECT ... INTO :arg1, ... FROM ... WHERE ... erlaubt, wenn höchstens eine Zeile ermittelt wird Problem: Lösung des allgemeinen Problems? dient dazu, eine Ergebnismenge in eine Folge einzeln einlesbarer Datensätze aufzulösen DECLARE cname [INSENSITIVE] [SCROLL] CURSOR FOR { SELECT-Anweisung | prepared-Anweisung } der Cursor-Name ist keine Variable, sondern eine statische Referenz auch der Kursor kann "dynamisch" behandelt werden Öffnen eines Cursors Zeitpunkt, zu dem die SELECT-Anweisung ausgewertet wird OPEN cname [ USING ...] Position des Cursors: vor der ersten Ergebniszeile USING ... dient zur Übergabe von Hostvariablen bei prepared Anweisungen Schließen eines Cursors CLOSE cname - 39 - Vorlesung Datenbanken 2 - A. Achilles Lesen eines Datensatzes mittels Cursor Cursor wird auf den nächsten Satz der Ergebnismenge geschoben FETCH [ ABOLUTE n | FIRST | LAST | NEXT | PRIOR | RELATIVE n ] FROM cname INTO { Liste von Hostvariablen | SQL DESCRIPTOR dname } Nutzung eines Cursors Problem: Erkennung des Endes Schnittstellen - Status Jede SQL-Anweisung erzeugt eine Status-Information Normierung in SQL92: Variable SQLSTATE 5 Byte, aufgeteilt in 2 Byte "Klasse" und 3 Byte "Unterklasse" wichtige Klassen: Klasse 00 01 02 08 23 27 Bedeutung erfolgreiche Ausführung Warning Daten nicht vorhanden Connection error Constraint violation Triggered data change violation - 40 - Vorlesung Datenbanken 2 - A. Achilles Schnittstellen - Indikator-Variable NULL-Wert ist nicht Bestandteil der üblichen Programmiersprachen Konzept zur Behandlung von NULL wird benötigt Zusammen mit einer Hostvariablen (vgl. Module-Sprache, embedded SQL) kann eine Indikatorvariable benutzt werden (kein Komma zwischen Host- und zugehöriger Indikatorvariable): wird aus der Datenbank gelesen, so besagen die Werte der Indikator-Variablen nach Ausführung der SQL-Anweisung = 0 Übertragung korrekt > 0 bei Übertragung wurden Stellen abgeschnitten Anzahl der abgeschnittenen Stellen = Wert der Indikatorvariable < 0 NULL-Wert wurde übertragen wird in die Datenbank geschrieben, so gilt: wird vor Ausführung Wert < 0 gesetzt: NULL-Wert wird in Datenbank geschrieben nach Ausführung werden die Werte = 0 und > 0 wie oben interpretiert Schnittstellen - Module-Schnittstelle Aufruf von Modulen dadurch Trennung von Host-Sprache und SQL Module sind in eigener "Sprache" geschrieben pro Module eine SQL-Anweisung Argumentübergabe möglich Vorteile: Module und Programm können getrennt optimiert werden kein Precompiler kein Konflikt zwischen SELECT (Programmiersprache) und SELECT (SQL) Übersetzung und Anbindung der Module aber nicht geregelt, DBMS-Hersteller-abhängig Beispiel MODULE beispiel LANGUAGE PLI SCHEMA demo DECLARE cursor_stud_pruefungen CURSOR FOR SELECT vname, semester, note FROM pruefungen WHERE matrnr = :matrstud; PROCEDURE commit (SQLSTATE); COMMIT WORK; PROCEDURE rollback (SQLSTATE); ROLLBACK WORK; PROCEDURE open_cursor_stud_pruefungen ( SQLSTATE, :matrstud CHAR(7) ); OPEN open_cursor_stud_pruefungen; PROCEDURE close_cursor_stud_pruefungen ( SQLSTATE); CLOSE open_cursor_stud_pruefungen; PROCEDURE lies_cursor_stud_pruefungen ( SQLSTATE, :vorlesname CHAR(20) :semester CHAR(11), :note CHAR(3), :i_note INTEGER); FETCH NEXT FROM cursor_stud_pruefungen INTO :vorlesname, :semester, :note INDICATOR :i_note; - 41 - Vorlesung Datenbanken 2 - A. Achilles Beispiel für Programm DCL sqlstate CHAR( 5); DCL student CHAR( 7); DCL vorlesung Char(20); DCL semester CHAR(11); DCL note CHAR( 3); DCL inote BIN FIXED; ON CONDITION (SQLEXCEPTION) BEGIN ... END; ... student = '4711'; CALL open open_cursor_stud_pruefungen(sqlstate, student); IF SUBSTR(sqlstate, 1, 2) > '02' THEN SIGNAL SQLEXCEPTION; DO WHILE ('1'b); CALL lies_cursor_stud_pruefungen(sqlstate, vorlesung, semester, note, inote); IF SUBSTR(sqlstate, 1, 2) > '02' THEN SIGNAL SQLEXCEPTION; IF SUBSTR(sqlstate, 1, 2) = '02' THEN LEAVE; IF SUBSTR(sqlstate, 1, 2) > '00' THEN PUT ('Warnung beim Lesen'); ELSE DO; IF itext < 0 THEN text='???'; PUT LIST (vorlesung, semester, note); END; END; CALL close_cursor_stud_pruefungen; ... Schnittstellen - Embedded SQL SQL-Anweisungen werden in den Quelltext eingebettet: EXEC SQL SQL_Anweisung; konkretes Beispiel: EXEC SQL INSERT INTO pruefungen VALUES (:student, :vorlesung, :semester, :note:inote) ; Einleitung und Ende der eingebetteten Anweisung ergeben sich aus der gewählten Programmiersprache - 42 - Vorlesung Datenbanken 2 - A. Achilles Beispiel EXEC SQL BEGIN DECLARE SECTION; DCL sqlstate CHAR( 5); DCL student CHAR( 7); DCL vorlesung Char(20); DCL semester CHAR(11); DCL note CHAR( 3); DCL inote BIN FIXED; EXEC SQL END DECLARE SECTION; EXEC SQL DECLARE cursor_stud_pruefungen CURSOR FOR SELECT vname, semester, note FROM pruefungen WHERE matrnr = :student; ... student = '4711'; EXEC SQL WHENEVER NOT FOUND GOTO ENDE; EXEC SQL OPEN open_cursor_stud_pruefungen; DO WHILE ('1'b); EXEC SQL FETCH cursor_stud_pruefungen INTO :vorlesung, :semester : note:inote; IF SUBSTR(sqlstate, 1, 2) > '00' THEN PUT ('Warnung beim Lesen'); ELSE DO; IF itext < 0 THEN text='???'; PUT LIST (vorlesung, semester, note); END; END; ENDE: EXEC SQL CLOSE cursor_stud_pruefungen; ... Precompiler übersetzt eingebettete Anweisungen in Statements der jeweiligen Programmiersprache arbeitet vor Übersetzungszeit keine Kenntnis von Information zur Zeit der Ausführung arbeitet rein sequentiell prüft zusammen mit DBMS für jede eingebettete Anweisung: ist Anweisung syntaktisch korrekt sind alle referenzierten Objekte in DB vorhanden sind Zugriffsrechte gegeben nach erfolgreicher Prüfung: ersetzt Anweisung durch Quelltext und benötigte Datenstrukturen ggf. ermitteln "optimalen" Zugriffspfad Ausnahmebedingungen EXEC SQL WHENEVER NOT FOUND | SQLERROR GOTO label | CONTINUE - 43 - Vorlesung Datenbanken 2 - A. Achilles Statische SQL-Anweisungen alle Informationen sind bereits zum Zeitpunkt der Programmierung bekannt: Namen der Objekte Struktur der Manipulationsanweisung Struktur der WHERE-Klausel verwendete Host-Variablen ... Offen bleiben darf nur der Wert der in Ausdrücken verwendeten Host-Variablen Vorteile je nach DBMS kann der Zugriffspfad ermittelt und in der DB gespeichert werden damit entfällt das Berechnen während der Ausführungsphase einzig Rechte müssen noch überprüft werden Oracle schaut einem Cache nach, ob SQL-Anweisung bereits bekannt. Schreibweise muß präzise übereinstimmen dann wird zugehörige Ausführungsform aus dem Cache übernommen Dynamische SQL-Anweisungen nicht in jedem Fall ist die SQL-Anweisung bereits vor der Compilationsphase bekannt Typisch z.B. für interaktive Oberflächen, die auf DB zugreifen Anweisung wird erst zur Laufzeit des Programmes ermittelt es muß Möglichkeiten geben, eine Zeichenkette an das DBMS zu übergeben, die zur Laufzeit ausgewertet und als SQL-Anweisung ausgeführt wird. Problem einmaliger Zugriff oder wiederholter Zugriff? Bei wiederholtem Zugriff mit Hilfe der ermittelten Anweisung müßte jeweils die Analyse-Phase erneut durchlaufen werden Performance! einmaliger Zugriff EXEC SQL BEGIN DECLARE SECTION; DCL zeichenkette CHAR(200); EXEC SQL END DECLARE SECTION; zeichenkette = 'CREATE TABLE KUNDEN (' || ' KNUMMER SMALLINT PRIMARY KEY,' || ' KNAME CHARACTER(20) NOT NULL, ' | ' KTEXT CHARACTER(50) )' ; EXEC SQL EXECUTE IMMEDIATE :zeichenkette ; mehrfacher Zugriff EXEC SQL BEGIN DECLARE SECTION; DCL zeichenkette CHAR(200); EXEC SQL END DECLARE SECTION; zeichenkette = 'INSERT INTO KUNDEN ' || ' VALUES( ?, ?, ? ) ' EXEC SQL PREPARE prep_anweisung FROM :zeichenkette ; - 44 - Vorlesung Datenbanken 2 - A. Achilles Ausführung EXEC SQL EXECUTE prep_anweisung USING :var1, :var2, :var3 ; Anmerkungen prep_anweisung ist ein Bezeichner, keine Host-Variable! :zeichenkette muß gültige SQL-Syntax besitzen es sind nur positionale Parameter erlaubt keine Kommentare, keine Host-Variablen erlaubte DML-Anweisungen: INSERT, DELETE, UPDATE sowie single SELECT alle DDL-Anweisungen DCL-Anweisungen: COMMIT, ROLLBACK an Stelle von USING ... kann auch allgemeiner ein SQL-Descriptor verwendet werden. Dies wird insbesondere bei dynamischen SELECT-Anweisungen benötigt: EXEC SQL ALLOCATE DESCRIPTOR demo_descriptor ; // Initialisieren des Descriptors EXEC SQL DESCRIBE prep_anweisung USING SQL DESCRIPTOR demo_descriptor ; // Zugriff: EXEC SQL GET DESCRIPTOR demo_descriptor :anzahl = COUNT ; EXEC SQL GET DESCRIPTOR demo_descriptor VALUE :i :var1= INFO, ... die wichtigsten Eigenschaften sind NAME, UNNAMED, TYPE, LENGTH, DATA, PRECISION; SCALE, INDICATOR Dynamische SQL-Anweisungen: SELECT sql_frage = 'SELECT KNUMMER, KNAME FROM KUNDEN WHERE KNAME LIKE ?' ; EXEC SQL PREPARE prep FROM :sql_frage; EXEC SQL ALLOCATE curs CURSOR FOR prep; EXEC SQL ALLOCATE DESCRIPTOR d_in ; EXEC SQL ALLOCATE DESCRIPTOR d_out; EXEC SQL DESCRIBE INPUT prep USING SQL DESCRIPTOR d_in; EXEC SQL DESCRIBE OUTPUT prep USING SQL DESCRIPTOR d_out; EXEC SQL SET DESCRIPTOR d_in VALUE 1 DATA=:string; EXEC SQL OPEN curs USING SQL DESCRIPTOR d_in; // Schleife zum Auslesen ... EXEC SQL FETCH curs INTO SQL DESCRIPTOR d_out; Schnittstellen - CLI Sprach- und DBMS-unabhängige Schnittstelle von Prozeduraufrufen keine Inkonsistenzen zwischen Hostsprache und SQL Übersetzung der SQL-Anweisungen zur Laufzeit dazu wird nur das DBMS benötigt Bibliotheken sind sprach- und DBMS-unabhängig => Software-Firmen können Anwendungen im Object-Code weitergeben Zugriff auf mehr als ein DBMS möglich Debugging wird erleichtert Nachteile gegenüber Embedded SQL: durch Binden lassen sich bei Embedded SQL weitere Sicherheitsstufen einbauen bei statischem SQL sind unter Umständen durch Voroptimierung effizientere Programme möglich, da bei CLI jede SQL-Anweisung erst vom DBMS übersetzt und optimiert werden muß. - 45 - Vorlesung Datenbanken 2 - A. Achilles Typische Verarbeitung: Initialisierung Transaktionsverarbeitung Terminierung Initialisierung /* Verbindungsaufbau es folgen einige "Handles" */ SQLHENV henv; SQLHDBC hdbc; SQLCHAR *server; SQLCHAR *user; SQLCHAR *password; SQLHSTMT hstmt; SQLCHAR stmt[] = "INSERT INTO student VALUES (?, ?, ?); SQLHSTMT hstmt; SQL_CHAR matrnr[7] = "1111111"; SQL_CHAR name[10] = "Mustermann"; SQL_CHAR adresse[10] = "Irgendwo 1"; /* SQL-Umgebung bereitstellen */ rc = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv ); /* Verbindungshandle anlegen */ rc = SQLAllocHandle( SQL_HANDLE_DBC, henv, &hdbc ); /* Verbindungsaufbau */ if (SQLConnect( hdbc, server, SQL_NTS, user, SQL_NTS, password, SQL_NTS ) != SQL_SUCCESS ) return ( print_err(...) ); Transaktionsverarbeitung /* rc rc // /* rc Transaktionsverarbeitung */ = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ); = SQLPrepare( hstmt, stmt, SQL_NTS ); da jede Anweisung dynamisch zur Parameterübergabe: */ = SQLGetStmrAttr( hstmt, SQL_ATTR_APP_PARAM_DESC, &hdesca, 0L, (SQLINTEGER *)NULL ); rc = SQLGetStmtAttr( hstmt, SQL_ATTR_IMP_PARAM_DESC, &hdesci, 0L; (SQLINTEGER *)NULL ); rc = SQLSetDescRec( hdesca, 1, SQL_C_CHAR, ... 7, ... (SQLPOINTER)matrnr), ...); rc = SQLSetDescRec( hdesci, 1, SQL_CHAR, ... 7, ...); ... rc = SQLExecute( hstmt ); rc = SQLEndTran( henv, SQL_COMMIT ); rc = SQLFreeStmt( hstmt, SQL_DROP ); Terminierung /* rc rc rc Terminierung */ = SQLDisconnect( hdbc ); = SQLFreeHandle( SQL_HANDLE_DBC, hdbc ); = SQLFreeHandle( SQL_HANDLE_ENV, henv ); - 46 - Vorlesung Datenbanken 2 - A. Achilles Innerhalb der Transaktionsverarbeitung: Statement-Handle bereitstellen: SQLAllocHandle() direkte Ausführung: SQLExecDirect(...) mehrfache Ausführung: Vorbereiten: SQLPrepare() Parameter übergeben: SQLSetDescRec() Ausführen: SQLExecute() Ergebnisse bearbeiten: Zeilenstruktur erkennen und Variablen an Zeilenstruktur binden Struktur beschreiben: SQLDescribeCol() Binden: SQLBindCol() Zeile holen: SQLFetch() Daten auslesen: SQLGetData() wurden Daten verändert: Bestimmung der Anzahl veränderter Zeilen: SQLRowCount() Transaktion beenden: SQLEndTran() Statement-Handle freigeben: SQLFreeHandle() Schnittstellen - Java Eigenschaften von Java Sprache ist objektorientiert weitestgehend unabhängig von BS Vernetzung wird direkt unterstützt weitgehede Sicherheit eingebaut JDBC: Schnittstelle zu DBMS normiert, beruht auf CLI und SQL/92 Entry-Level Inzwischen bieten namhafte DBMS-Hersteller die Möglichkeit an, Java-DBMS-Prozeduren einzubinden JDBC besteht aus Klassen und Interfaces. Die wichtigsten sind: java.sql.DriverManager dient zum Laden eines Treibers und zum Aufbau einer DB-Verbindung java.sql.Connection stellt eine DBMS-Verbindung dar java.sql.Statement dient dazu, SQL-Anweisungen auszuführen java.sql.ResultSet erlaubt es, Ergebniszeilen auszuwerten Java-Anbindungen an DBMS 1. JDBC-ODBC-Schnittstelle: erste funktionierende Anbindungsart, setzt JDBC-Aufrufe in ODBCAufrufe um. Wenig performant, ODBC-Treiber muss auf derselben Maschine installiert sein. 2. Java-DBMS-spezifisches API: auch hier muss Umsetzung von JDBC-Aufrufe in Herstellerspezifische DBMS-API (Java-fremder Code) vorgenommen werden. 3. JDBC-Netz mit pure Java Treiber: JDBC-Aufrufe werden in Netzwerk-Protokoll übersetzt, das DBMS-unabhängig ist. Java-Server nimmt Aufrufe entgegen und kommuniziert mit Ziel-DB. 4. Natives Protokoll mit pure Java Treiber: Treiber wandelt die JDBC-Aufrufe direkt in das vom DBMS verwendete Netzwerk-Protokoll um. Geringerer Kommunikationsaufwand als 3, aber stärkere Hersteller-Bindung Middleware: EJB-Technologie ermöglicht es, mehrere DBMS-Server einzubinden, unterstützt Skalierbarkeit, erzwingt Anwendung von Geschäftslogik - 47 - Vorlesung Datenbanken 2 - A. Achilles Verbindungsaufbau try { Class.forName( "jdbc.Treibername" );// Laden des Treibers Connection conn = DriverManager.getConnection( url, "userid", "password" ); } catch (java.lang.ClassNotFoundException e) { ... } catch (java.sql.SQLWarning e) { ... } catch (java.sql.SQLException e) { ... } beim Laden eines Treibers wird der statische Initialisierer aufgerufen dieser registriert "sich" beim DriverManager damit kann der DriverManager bei Verbindungsanfragen auf den Treiber zugreifen die Klassen-Methode getConnection der Klasse DriverManager dient zum Aufbau der Verbindung zu einer Datenbank: das erste Argument spezifiziert Treibertyp und Datenbank, z.B.: jdbc:odbc:DemoDB URL-Darstellung, immer mit jdbc beginnend; in diesem Falle eine JDBC-ODBC-Bridge. DemoDB ist der Name der Datenbank das zweite Argument ist die Benutzerkennung das dritte Argument das zu dieser Benutzerkennung gehörige Passwort Achtung: Voreinstellung für autoCommit ist true (vgl.: Java-Transaktionen) das Objekt conn vom Typ Connection besitzt eine Implementation der Schnittstelle Connection damit kann es Statement-Objekte erzeugen, um SQL-Anweisungen an die Datenbank zu übergeben PreparedStatement-Objekte erzeugen, um SQL-Anweisungen aufzubereiten und wiederholt parametrisiert auszuführen CallableStatement-Objekt erzeugen, um Stored Procedures aufzurufen mit der Methode natievSQL( String sqlAnweisung ) die aus der JDBC-sqlAnweisung erzeugte native SQL-Anweisung anzeigen, die an das DBMS übermittelt wird Metadaten über die Verbindung abfragen, Informationen über unterstützte SQL-Grammatik, Stored Procedures, Tabellen, usw. die Verbindung schließen ( close() ) geschieht automatisch, wenn Gabage Collector das Verbindungsobjekt löscht nur lesende Zugriffe erlauben Transaktionen unterstützen entweder im autoCommit-Modus oder direkt durch commit() und rollback() den Isolationsgrad durch setTransactionIsolation(..) setzen (vgl. SET TRANSACTION) Ausführen von SQL-Anweisungen innerhalb eines Connection-Objektes stehen die Methoden createStatement() erzeugt ein Statement-Objekt prepareStatement( String sqlAnweisung ) erzeugt ein PreparedStatement-Objekt prepareCall( String sqlAnweisung ) erzeugt ein CallableStatement-Objekt bereit, um die Voraussetzungen zu schaffen, SQL-Anweisungen zu bearbeiten Ausführen von SQL-Anweisungen Statement-Interface int anzahl; Statement stmnt = conn.createStatement(); anzahl = stmnt.executeUpdate( "CREATE TABLE test " + "(NUMMER INTEGER, NAME VARCHAR(20)) " ); anzahl = stmnt.executeUpdate( "INSERT INTO test " + "VALUES( 1, 'Demozeile' )" ); ResultSet rs = stmnt.executeQuery( "SELECT * FROM test" ); ... stmnt.close(); - 48 - Vorlesung Datenbanken 2 - A. Achilles Das Interface enthält als wichtigste Methoden executeUpdate( String sqlAnweisung ) diese dient dazu, eine SQL-INSERT-, UPDATE- oder DELETE-Anweisung oder SQL-DDLAnweisungen ohne Parameter an das DBMS zu übermitteln und direkt auszuführen executeQuery( String sqlSelect ) übergibt beliebige parameterlose SQL-SELECT-Anweisungen an das DBMS und erzeugt ein Objekt vom Typ ResultSet, das die Ergebniszeilen enthält und zugreifbar macht. (Vgl. Cursor-Konzept) Neben diesen Methoden gibt es weitere Methoden um die maximale Länge von Ergebnisfeldern abzufragen bzw. zu begrenzen die maximale Anzahl von Ergebniszeilen abzufragen oder zu begrenzen ein Timeout für die Dauer der Ausführung der Anweisung abzufragen oder zu begrenzen die SQL-Warnings auszulesen einen Cursor-Namen zu vereinbaren bei SELECT FOR UPDATE kann dann in einem anderen Statement positioniertes UPDATE, DELETE (WHERE CURRENT OF cursor) verwendet werden beliebige SQL-Prozeduren aufzurufen, die ggf. mehrere SELECT-Anfragen beinhalten: execute( String sqlProzedur ) Methoden, um weitere ResultSet bzw. UpdateCounts zu ermitteln, wenn mehrere erzeugt worden sind um das Statment-Objekt zu schließen: close() PreparedStatement-Interface (ist von Statement abgeleitet) PreparedStatement prep = conn.prepareStatement( "INSERT INTO test VALUES( ?, ? )" ); prep.setInt( 1, 2); prep.setString(2, "Zeile 2"); prep.executeUpdate(); Die SQL-Anweisung wird an das DBMS zur Analyse und "Vorübersetzung" geschickt. Das Interface enthält als wichtigste Methoden executeUpdate() diese dient dazu, die vorbereitete SQL-INSERT-, UPDATE- oder DELETE-Anweisung oder SQL-DDLAnweisungen mit den vereinbarten Parametern an das DBMS zu übermitteln und auszuführen executeQuery() übergibt mit den vereinbarten Parametern die SQL-SELECT-Anweisungen an das DBMS und erzeugt ein Objekt vom Typ ResultSet, das die Ergebniszeilen enthält und zugreifbar macht. (Vgl. Cursor-Konzept) Neben diesen sowie den ererbten Methoden gibt es weiterhin clearParameter() hiermit werden alle vereinbarten Parameterwerte gelöscht set...( int nr, ... wert ) setzt den Parameter nr auf den angegebenen wert setNull( int nr, int sqlType ) setzt den angegebenen Parameter auf den NULL-Wert - 49 - Vorlesung Datenbanken 2 - A. Achilles CallableStatement-Interface (ist von PreparedStatement abgeleitet) // Vorbereitung: in der Regel nicht in rufenden // Programm enthalten int anzahl; Statment stmnt = conn.createStatement(); anzahl = stmnt.executeUpdate( "create procedure SHOW_TEST "+ "AS select * FROM test WHERE NUMMER = ?" ); // Ende der Vorbereitung CallableStatement cstmnt = conn.prepareCall( "{call SHOW_TEST(?)}" ); cstmnt.setInt( 1, 2); ResultSet rs = cstmnt.executeQuery(); Eine Prozedur ist (in der Regel) unabhängig von der Ausführung eines Programmes in der Datenbank vorhanden und vorübersetzt. Das Interface enthält als wichtigste Methoden execute() falls mehrere SQL-Anweisungen (insbesondere SELECT) durch die Prozedur zusammengebunden sind. executeUpdate() diese dient dazu, die Prozedur mit den vereinbarten Parametern aufzurufen und auszuführen executeQuery() erzeugt ein Objekt vom Typ ResultSet und führt die Prozedur mit den vereinbarten Parametern aus Neben den ererbten Methoden gibt es weitere Methoden um Ausgabe-Parameter zu registrieren registerOutParameter( int nr, int sqlType ) AusgabeParameter auszulesen den gerade ausgelesenen Parameterwert auf NULL zu prüfen var = get...( int nr ) wasNull() Auslesen von Ergebnistabellen ResultSet-Interface ResultSet rs = stmt.executeQuery( "SELECT * FROM test"); System.out.println("Nummer, Name "); while (rs.next()) { String eins = Integer.toString(rs.getInt( 1 ).toString()); String zwei = rs.getString( 2 ); System.out.println( eins + ", " + zwei ); } Ein Objekt vom Typ ResultSet entspricht einem Cursor. Die wesentlichen Methoden sind next() um die nächste Zeile zu lesen (den Cursur eine Zeile weiterzuschieben) get...( int nr ) bzw. get...( String spaltenName ) um die entsprechende Spalte, auf der der Cursor derzeit positioniert ist, auszulesen wasNull() um festzustellen, ob in der zuletzt ausgelesenen Spalte der NULL-Wert übertragen wurde getMetaData() um die Struktur des ResultSet analysieren zu können - 50 - Vorlesung Datenbanken 2 - A. Achilles Analysieren der Struktur von Ergebnistabellen ResultSetMetaData-Interface ResultSet rs = stmt.executeQuery( "SELECT * FROM test"); ResultSetMetaData rsmd = rs.getMetaData(); System.out.println( "Anzahl der Spalten: "+ rsmd.getColumnCount() ); for (int i = 1; 1 <= rsmd.getColumnCount(); i++) { int jdbcType = rsmd.getColumnType( i ); String tname = rsmd.getColumnTypeName( i ); String cname = rsmd.getColumnName( i ); } Ein Objekt vom Typ ResultSetMetaData enthält Methoden getColumnCount() um die Anzahl der Spalten zu bestimmen getColumnType( int nr ) um den JDBCType der entsprechenden Spalte zu bestimmen getColumnName( int nr ) um den Namen der entsprechenden Spalte zu bestimmen getPrecision( int nr ) getScale( int nr ) um Information über die Interna der Zahldarstellung der entsprechenden Spalte zu bekommen isAutoIncrement( int nr ) isCaseSensitive( int nr ) isSearchable( int nr ) isCurrency( int nr ) isNullable( int nr ) isSigned( int nr ) isReadOnly( int nr ) isWritable( int nr ) um weitere Informationen über die entsprechende Spalte zu bekommen JDBC 2.0 JDBC 2.0 ist zweigeteilt Paket java.sql ist der Kern der SQL-Schnittstelle, der auch die alte API JDBC 1.0 enthält. Änderungen liegen in Verbesserungen des ResultSet Scrollbar und änderbar neue Datentypen: BLOB, CLOB Batch-Updates Paket javax.sql JNDI Unterstützung Connection Pooling distributed Transactions RowSet-Objekte - 51 - Vorlesung Datenbanken 2 - A. Achilles java.sql Ein Objekt vom Typ ResultSet muß nicht nur sequentiell mit next() durchlaufen werden, es gibt weitere Methoden zum beliebigen Zugriff: absolute( int nr ) positioniert auf die Zeile nr afterLast() positioniert direkt hinter das Ende der letzten Zeile beforeFirst() positioniert direkt vor die erste Zeile first() positioniert auf die erste Zeile getRow() liefert die Nummer der aktuellen Zeile zurück isAfterLast() gibt an, ob hinter der letzten Zeile positioniert ist isBeforeFirst() gibt an, ob vor der ersten Zeile positioniert ist isFirst() zeigt an, ob die Position auf der ersten Zeile liegt isLast() entsprechend, ob die Position auf der letzten Zeile ist last() positioniert auf die letzte Zeile moveToInsertRow() hierbei handelt es sich um eine spezielle Zeile, die mit einem änderbaren ResultSet-Objekt verknüpft ist. Dadurch kann eine neue Zeile in das Objekt eingefügt werden. Bei dem Aufruf wird die aktuelle Position des Cursurs gemerkt moveToCurrentRow() steht der Cursur auf der Eingabezeile, so wird er daraufhin auf die ehemalige Position zurückgesetzt next() bereits in JDBC 1.0: positioniert auf die folgende Zeile previous() positioniert auf die vorhergehende Zeile relative( int anzahl ) verschiebt die Position um anzahl Zeilen, bei negativem Vorzeichen in Richtung Anfang Damit ein Objekt vom Typ ResultSet entsprechende Eigenschaften hat, muß das Statement-Objekt darauf eingerichtet werden: Statement stmnt = conn.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, // Scrolling zugelassen // Änderungen anderer // werden nicht wahrgenommen ResultSet.CONCUR_UPDATABLE); // Änderungen zugelassen - 52 - Vorlesung Datenbanken 2 - A. Achilles Ist ein Objekt vom Typ ResultSet änderbar, so können folgende Methoden darauf angewandt werden: deleteRow() löscht die aktuelle Zeile aus der Datenbank insertRow() fügt den Inhalt der Eingabezeile in die Datenbank ein rowDeleted() zeigt an, ob eine Zeile gelöscht wurde rowInserted() gibt an, ob eine Zeile eingefügt wurde rowUpdated() zeigt, ob eine Zeile geändert wurde update...( int nr, typ wert ) ändert in der aktuellen Zeile die Spalte nr auf wert updateNull( int nr ) setzt in der aktuellen Zeile die Spalte nr auf NULL updateRow() ändert in der Datenbank die der aktuellen Zeile zugehörige Zeile Ändern einer Zeile in der Datenbank mittels eines änderbaren ResultSet-Objekts Statement stmnt = conn.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = stmnt.executeQuery("SELECT * FROM test"); rs.absolute(2); // aktuelle Zeile ist Zeile 2 rs.updateString("NAME", "Zeile ZWEI"); // Ändern der zweiten Spalte der // aktuellen Zeile in "Zeile ZWEI" rs.updateRow(); // Eintragen in die Datenbank ... conn.commit(); // Transaktion beenden // damit Änderung für andere // sichtbar machen Einfügen in die Datenbank mittels eines änderbaren ResultSet-Objekts ... rs.moveToInsertRow(); // zur Eingabezeile gehen rs.updateInt( 1, 3); rs.updateString( 2, "3. Zeile" ); // Ändern der Spalten der Eingabezeile rs.updateRow(); // Eingabezeile in Datenbank eintragen rs.moveToCurrentRow(); // zurück zur alten aktuellen Zeile ... conn.commit(); // Transaktion beenden // damit Änderung für andere // sichtbar machen Weitere Verbessereungen des ResultSet: stmnt.setFetchSize( 25 ); ResultSet rs = stmnt.executeQuery( "SELECT * FROM test" ); // es werden zunächst nur 25 Zeilen // in den ResultSet rs geladen Weitere Ergebnisse mittels stmnt.getMoreResults() - 53 - Vorlesung Datenbanken 2 - A. Achilles Neue Datentypen die neuen SQL-Datentypen BLOB CLOB ARRAY REF werden unterstützt, es gibt entsprechende Interfaces und get...(...) und set...(...)-Methoden in ResultSet Auch benutzerdefinierte Typen werden durch das Interface Struct sowie die ResultSetMethoden getObject(...) und setObject(...) bereitgestellt. Performance-Verbesserung durch „Batch“ Statement stmnt = conn.createStatement(); conn.setAutoCommit( false ); stmnt.addBatch("INSERT INTO test VALUES( 4, 'Z4' )" ); stmnt.addBatch("INSERT INTO test VALUES( 5, 'zeile fuenf' )" ); stmnt.addBatch("INSERT INTO test VALUES( 6, 'sechs' )" ); int [] updateCounts = stmnt.executeBatch(); ... conn.commit(); Die Anweisungen werden in der Reihenfolge ausgeführt, in der sie dem Batch hinzugefügt wurden jede einzelne Anweisung muß eine Zahl zurückliefern, die die Anzahl der Änderungen angibt; diese Zahl wird dem Array updateCounts hinzugefügt. Ist dies nicht der Fall, wird eine BatchUpdateException geworfen. ein JDBC-Treiber muß nicht notwendig Batch unterstützen und die Methoden addBatch(...), clearBatch() und executeBatch() unterstützen Aufschluß über den letzten Punkt liefern die DatabaseMetaData: DatabaseMetaData dbmd = conn.getMetaData(); if (dbmd.supportsBatchUpdates()) System.out.println( "der Treiber unterstützt Batch" ); JNDI DataSource-Objekt repräsentiert eine Datenquelle: DBMS, Tabelle, Datei, ... wird vom Administrator mit entsprechendem Werkzeug bei JNDI (Java Naming and Directory Interface) Dienst registriert Anwendung kann unter logischem Namen danach beim JNDI suchen und dann die Verbindung herstellen Informationen über die Datenquelle - Name, Server, usw. - sind als Eigenschaften im DataSourceObjekt enthalten müssen nicht mehr hart codiert werden bei Verlagerung der Datenquelle muss Code nicht verändert werden Verbindung mittels JNDI-API ohne Verwendung von Treibern: String lname = new String("jdbc/DemoDB"); // logischer Name für Datenquelle Context ctx = new InitialContext(); // JNDI-API DataSource ds = (DataSource)ctx.lookup( lname ); // unter dem Namen "jdbc/DemoDB" wird // eine Datenquelle gesucht Connection conn = ds.getConnection( "NAME", "passwort" ); Verbindungsaufbau über JNDI ist insbesondere dann wichtig, wenn verteilte Transaktionen oder Connection Pooling eingesetzt werden soll. - 54 - Vorlesung Datenbanken 2 - A. Achilles Pooled Connection um die Performance zu verbessern, ist es bei häfigen Zugriffen sinnvoll, eine Verbindung nicht völlig zu zerstören, sondern sie wiederzubenutzen durch entsprechende Maßnahmen stellt der Administrator einen Pool von Verbindungen zu einer Datenquelle bereit für die Programmierung ändert sich (fast) nichts Im folgenden sei unter dem logischen Namen jdbc/poolDB ein Pool von Verbindungen bereitgestellt. ctx = new InitialContext(); ds = (DataSource)ctx.lookup("jdbc/poolDB"); try { Connection conn = ds.getConnection( "NAME", "passwort" ); // und hier wird damit gearbeitet } catch (Exception e) {... } finally { if (conn != null) conn.close(); } Die finally-Klausel bewirkt, daß die Verbindung auf jeden Fall geschlossen wird, auch dann, wenn eine Ausnahme geworfen wird. Damit steht die Verbindung wieder im Pool bereit und wird nicht durch die Anwendung lange blockiert. Verteilte Transakionen auch hier wird die wesentliche Arbeit beim „Deployen“ erledigt: die Datenquelle muß korrekt beim JNDI angemeldet werden und dabei mit einer XADataSource verbunden werden die Anmeldung im Programm verläft wieder wie gehabt, d.h. verteilte Transaktionen sind für den Programmierer nahezu transparent ein TransactionManager verwaltet im Hintergrund die Transaktion einzig folgende Restriktionen sind zu beachten: verboten sind die Aufrufe conn.commit() conn.rollback() conn.setAutoCommit(true) RowSet dient als "Behälter" für Zeilen Implementation ist ein Aufsatz auf den Treiber erweitert ResultSet unterstützt das JavaBeans Modell hat Methoden um Listener hinzuzufügen, zu entfernen und deren Eigenschaften festzulegen eine spezielle Eigenschaft ist das Kommando, das gesetzt und ausgeführt werden kann ein RowSet kann sein Kommando selbst einstellen und ausführen und sich somit selbst mit Daten versorgen ein RowSet kann sich nach dem Laden von der Datenquelle abkoppeln es kann in abgekoppelten Zustand serialisiert werden es eignet sich zur Versendung über das Netz z.B. zu einem PDA es kann aktualisiert und dann zum Datenabgleich erneut mit seiner Datenquelle verbunden werden - 55 - Vorlesung Datenbanken 2 - A. Achilles Datenbanken - Optimierung Ansätze ein oder mehrere Datenbank-Knoten: bezogen auf einen Datenbank-Knoten Installation des DBMS Bereitstellen von physischem Speicher Plazierung von Tabellen, Indexen Indexierung Partitionierung Clustern Denormalisierung mehrere Knoten: Knoten-übergreifend Verteilung weitere Einflüsse Replikation Installation Größe des Dictionaries ggf. Blockgröße des Dictionaries Positionierung des Ditionaries im physischen Speicher Vermeidung von Congestion des Controllers sowie der Platte Sicherungskonzepte: Dual Logging Überschreiben? Logging auf externe Medien Strategie Größe und Speicherort ... Bestimmung der Größe von Plattenplatz für Daten Indexe (temporärem) Plattenplatz für Sortiervorgänge Blockgröße für physisches IO auf Daten Physischer Speicherplatz Ziel: durch Bereitstellung von genügend physischen Laufwerken an genügend Controllern sollen im laufenden Betrieb die IO-Zugriffe gut verteilt werden, so dass in diesem Bereich keine Engpässe auftreten Möglichst Trennung von DBMS-System-Dateien Dictionary Log-Bereiche temporäre Plattenbereiche für große Sortiervorgänge (mehrere) Bereiche für die Daten (ggf.) eigene Index-Bereiche Plazierung Ziel: durch Verteilung der Tabellen, Indexe auf mehrere Controller/Laufwerke sollen im laufenden Betrieb die IO-Zugriffe gut verteilt werden, so dass in diesem Bereich keine Engpässe auftreten Hier ist das zu erwartende Zugriffsverhalten des Systems - d.h. Häufigkeit der Zugriffe auf die Daten einzubeziehen - 56 - Vorlesung Datenbanken 2 - A. Achilles Indexe Indexe sollen typischerweise folgende Aspekte unterstützen: den direkten Zugriff auf Datensätze den Zugriff auf einen Bereich das Sortieren Indexe verändern die Struktur der gespeicherten Daten nicht, können somit ohne Probleme auch nachträglich eingerichtet werden Probleme beim Index-Einsatz: bei kleinem Datenvolumen (Richtwert < 8 Pages für eine Tabelle): Zugriff über Index teurer als kompletter Table-Scan bei Änderungen an einer Tabelle müssen sämtliche Indexe für diese Tabelle mitgepflegt werden Geeignete Index-Kandidaten: Schlüsselspalten Spalten, die in Join, Group, Having und Sort-Operationen häufig benötigt werden ggf. falls Index bereits gesamte Information für häfigen Zugriff enthält Partitionierung Geeignete Aufteilung einer Tabelle auf mehrere Partitionen führt dazu, dass im Mittel weniger physische IO_Vorgänge abzuwickeln sind: so kann z.B. statt eines kompletten Table-Scans ein Scan einer geeigneten Partition ausreichen Partitionen können ggf. unabhängig voneinander gesichert werden ggf. können Partitionen bei Mehrprozessorsystemen parallel verarbeitet werden Arten der Partitionierung: horizontale Partitionierung: ein Partitionierungs-Index nimmt transparent die Aufteilung in die einzelnen Partitionen vor dies wird bereits von vielen DBMS unterstützt vertikale Partitionierung: bedeutet eine strukturelle Veränderung Schlüsselspalten müssen in allen Partitionen wiederholt werden Verbesserung bei allen Zugriffen, die nur auf eine Partition zugreifen müssen wegen verringertem IO aber: Partitionsübergreifende Zugriffe erfordern Join, werden somit erheblich teurer sorgfältige Planung erforderlich Clustern Ziel: Tabellenzeilen, die logisch "zusammengehören" und somit häufig zusammen gelesen werden, sollen physisch nahe benachbart gespeichert werden Gelingt dies, so werden in der Regel bei einer IO-Operation bereits die gemeinsam benötigten Tabellenzeilen gelesen Unterstützung: ein Index, der als Cluster-Index ausgezeichnet wird, sorgt für die physische Speicherung der Datensätze nahe benachbarte Sätze werden möglichst im gleichen Block gespeichert Ausnutzung von "FreeSpace"-Parametern Problem: was passiert nach mehrfachen Änderungen? - 57 - Vorlesung Datenbanken 2 - A. Achilles Denormalisieren Ziel: Performance-Steigerung durch Verminderung der Lese- und Join-Operationen Problem: Denormalisierung macht Eregbnisse des vorhergehenden Entwurfs teilweise rückgängig Konsequenzen sorgfältig bedenken wichtige Vorgehensweisen: häufig benutzte Verdichtungen werden in regelmäßigen Abständen berechnet und physisch in einer eigenen Tabelle gespeichert spart sowohl IO-Operationen als auch Rechenzeit Normalisierung wird nicht vollständig durchgeführt spart Join-Operationen Tabellen (oder Teile davon) werden verdoppelt kann lesenden Zugriff verbessern Problem: ändernde Transaktionen wegen Redundanz bei Informations-Systemen mit großen Datenbeständen und hohen Anforderungen an die Zugriffsgeschwindigkeit wird man in vielen Fällen auf Denormalisierung zurückgreifen müssen. Mehrere Knoten - Verteilung Verteilung ohne Replikation limitierender Faktor die Datenübertragung => Verteilung ist so zu wählen, dass Datenübertragung minimiert wird Faktoren: Verteilung der Daten auf den DB-Knoten Anwendungen und deren Zugriffsverhalten Häfigkeitsverteilung bzgl. des Aufrufs der Anwendungen Verteilung der Aufrufe auf die Knoten weitere Einflüsse je nach Gesamtanforderung: Ausfallsicherheit der einzelnen DB-Knoten Anzahl der Verbindungen zwischen den DB-Knoten Geschwindigkeit der Verbindungen Qualität der Verbindungen Auslastung der einzelnen Knoten CPU-Leistung der Knoten Hauptspeicher der Knoten (Platten-) Peripherie der Knoten ... Mehrere Knoten - Replikation * Replikation bedeutet: durch Duplizieren von Tabellen gezielte Redundanz Replikation von Tabellen, die (nahezu) ausschließlich gelesen werden, ist völlig unproblematisch Problem: Replikate, die auch geändert werden sollen in diesem Fall sind für jedes Replikat Vor- und Nachteile abzuwägen: größere Verfügbarkeit der Daten höhere Performance bei lesenden Transaktionen erhöhter Systemaufwand höhere Kommunikation Verlangsamung bei ändernden Transaktionen (je nach Replikationsverfahren) - 58 - Vorlesung Datenbanken 2 - A. Achilles Synchronisation und Replikation Warum verteilte Informationssysteme? größere Ausfallsicherheit auch wenn ein Knoten ausfällt, kann noch auf andere Knoten - und damit auf die dort gespeicherten Daten - zugegriffen werden erhöhte Datenverfügbarkeit kann als "Korollar" der ersten Aussage angesehen werden insbesondere eine Duplizierung von Daten gestattet die Erreichbarkeit auch bei Ausfall von Knoten jedoch: diese Aussage gilt nur bei rein lesendem Zugriff; Änderungen können Probleme bereiten: vgl. Transaktionen Verbesserung des Durchsatzes durch Duplizierung von Daten auf den einzelnen Knoten kann eine Reduzierung der Netzlast erreicht werden - da Anwendungen parallel auf den Knoten laufen, kann damit eine Verbesserung des Durchsatzes erzielt werden Lastausgleich insbesondere bei Anfragen kann bei geeigneter Zwischenschicht die Auslastung der einzelnen Knoten (und Netzverbindungen) berücksichtigt werden um eine gleichmäßige Auslastung zu erreichen Mobilität dieses Argument ist anders gelagert als die vorherigen: externe Mitarbeiter bekommen zur Unterstützung Laptops, deren Daten nahtlos in das „Firmendatenmodell“ eingefügt werden sollen Probleme bei verteilten Informationssystemen Kommunikationsaufwand Daten, die nicht auf dem Knoten liegen, auf dem eine Anfrage erfolgt, müssen über das Netz geholt werden bei Duplikaten muß bei einer Datenänderung die Änderung "rechtzeitig" an alle Knoten weitergegeben werden Aktualität der Daten auf den einzelnen Knoten wie rechtzeitig werden Änderungen an die anderen Knoten weitergereicht? Konsistenz der Daten bei Duplizieren der Daten tritt auf Grund der obigen Aussagen das Problem auf, daß Daten ggf. nicht mehr (oder auch nur zeitweise nicht) konsistent über die Datenbasis aller beteiligten Knoten sind Auf Grund der Probleme bei verteilten Informationssystemen die Verteilung ist sorgfältig zu planen Duplizierung der Daten ist sorgfältig zu planen das Verfahren, duplizierte Daten zu aktualisieren, entscheidet über die Art, wie die das System eingesetzt werden kann Wie bei Normalisierung gilt: Verteilung und Duplizierung nur soviel wie nötig Auch bei verteilten Systemen müssen Transaktionen wie in einem lokalen DBMS unterstützt werden D.h. die Eigenschaften A Atomicity (Atomarität) eine Änderung der Daten wird entweder vollständig oder überhaupt nicht vorgenommen C Consistency (Konsistenz) geänderte Daten müssen Konsistenz-Bedinungen erfüllen I Isolation (isolierte Zurücksetzbarkeit) ein Zurücksetzen betrifft ausschließlich die Änderungen, die in der Transaktion vorgenommen wurden D Durability (Dauerhaftigkeit) die Daten einer erfolgreichen Transaktion werden dauerhaft gespeichert müssen gewährleistet sein - 59 - Vorlesung Datenbanken 2 - A. Achilles Anschauliche Darstellung: eine Transaktion ist eine zusammengefaßte Folge von Operationen, die eine logische Einheit bilden sie werden entweder alle ausgeführt oder es wird keine Änderung sichtbar die Datenbasis wird aus einem konsistenten Zustand in einen neuen konsistenten Zustand überführt anschaulich: am Ende einer Transaktion wird wieder ein korrekter Zustand der abzubildenden Welt dargestellt wird eine Transaktion zurückgesetzt, so werden Änderungen anderer Transaktionen nicht davon betroffen Änderungen, die innerhalb einer Transaktion gemacht werden, werden am Ende permanent gespeichert lokale Transaktionen betreffen nur ein DBMS (einen Datenbank-Knoten) globale Transaktionen in einem Verteilten System betreffen mehrere Knoten Verfahren zur Transaktionsunterstützung an einem Knoten: typisch für bekannte relationale DBMSe: Sperrverfahren weitere Verfahren in diesem Abschnitt Verfahren zur globalen Transaktionsunterstützung? Globale Transaktionsunterstützung setzt auf der lokalen Transaktionsunterstützung auf durch Kommunikation der beteiligten Knoten muss gewährleistet werden, dass die auf den beteiligten Knoten laufenden Subtransaktionen gemeinsam ausgeführt oder verworfen werden üblicherweise verwendetes Protokoll: Zwei-Phasen-Commit-Protokoll Dieses Protokoll kennzeichnet für jede Transaktion einen Knoten besonders aus: "Koordinator" ist derjenige Knoten, an dem die Transaktion gestartet wird Abschluß der Transaktion: 1. der Koordinator schickt an alle an der Transaktion beteiligten Knoten die Meldung Prepare-to-commit 2. die Knoten informieren daraufhin den Koordinator, ob sie die Transaktion lokal durchführen können (Commit) die Transaktion verwerfen müssen (Abort) 3. die jeweilige Subtransaktion wird jedoch noch nicht vollzogen, vielmehr warten die Knoten auf die endgültige Mitteilung des Koordinators 4. der Koordinator sammelt alle Rückmeldungen auf und informiert die Knoten: falls alle Rückmeldungen Commit lauten, mit der Meldung Commit falls wenigstens eine Rückmeldung Abort lautet, mit Abort 5. die Knoten vollziehen ihre Aktion auf Grund der endgültigen Meldung des Koordinators - 60 - Vorlesung Datenbanken 2 - A. Achilles 2-Phasen-Commit-Protokoll dieses Protokoll arbeitet korrekt, solange keine Ausfälle oder Verklemmungen auftreten was bei gestörter Kommunikation zwischen Koordinator und einem Knoten? Timeout-Mechanismus in den WAIT-Phasen: Kommt bis zum Ablauf des Timeouts keine Nachricht an, so muß auf diesen Fehler geeignet reagiert werden um Blockierung aufzuheben Timeout für Knoten Kommunikation zum Koordinator gestört mögliche Reaktion: kann andere beteiligte Knoten befragen und reagieren falls wenigstens ein Knoten mit Abort antwortet: selbst Abort vollziehen falls ein Knoten bereits die globale Rückmeldung vom Koordinator erhalten hat: entsprechend der globalen Commit- oder Abort-Meldung reagieren in allen anderen Fällen muß Knoten solange warten, bis Kommunikation zu Koordinator erneut aufgebaut ist Knotenausfall - Koordinator mögliche Reaktion: falls END-Record im Protokoll: alle beteiligten Subtransaktionen sind abgeschlossen Commit- oder Abort-Record: alle beteiligten Knoten werden darüber informiert andernfalls: globales Abort da Koordinator bei Auftreten des Problems offensichtlich noch in WAIT-Phase war - 61 - Vorlesung Datenbanken 2 - A. Achilles Knoten einer Subtransaktion mögliche Reaktion: Commit- oder Abort-Record im eigenen Protokoll: entsprechendes Redo oder Undo, um lokale Subtransaktion angemessen zu beenden Ready-Record: globales Abstimmungsergebnis muss erfragt werden andernfalls: Transaktion abbrechen offensichtlich hat Commit-Protokoll noch nicht begonnen Problem dieses Protokolls Koordinator muß Information auch über beendete Transaktionen aufbewahren Blockade der beteiligten Knoten bei Ausfall des Koordinators Problem Wie können Transaktionen synchronisiert werden, so dass der Isolationsgrad SERIALIZABLE erreicht wird? Es werden üblicherweise zwei verschiedene Arten von Verfahren eingesetzt: Sperrverfahren dies wird bei nahezu allen bekannten RDBMS verwendet Transaktionskonflikte werden ausgeschlossen, jedoch wird dies durch die Gefahr von Deadlocks erkauft Optimistische Synchronisationsverfahren hierbei handelt es sich um eine Reihe von Verfahren, die zunächst einmal Transaktionskonflikte zulassen um diese im Nachhinein zu korrigieren. Deadlocks werden dadurch vermieden. Die von einer Transaktion betroffenen Daten werden mit einer Lese- bzw. Schreibsperre versehen am Transaktionsende werden die Sperren wieder freigegeben will eine Transaktion Sperren auf bereits gesperrte Daten setzen, so muss sie auf die Freigabe der Sperren warten Deadlockgefahr Entscheidend für Parallelisierungsgrad und die Performance des Systems sind die folgenden Parameter die „Größe“ der gesperrten Daten die Art der Sperren Größe der gesperrten Datenobjekte: Objekt Record Page Tabelle Speicherbereich ... Datenbank Eskalation der Sperren variieren von System zu System Arten der Sperre zum Lesen andere Transaktionen können ebenfalls lesend aber nicht schreibend zugreifen nicht exklusiv mit der Option auf exklusiven Zugriff ... zum Schreiben exklusiver Zugriff - 62 - Vorlesung Datenbanken 2 - A. Achilles Zwei-Phasen-Sperrprotokoll: Phase 1: Eine Transaktion belegt jedes Datenobjekt, auf das sie zugreift, mit einer entsprechenden Sperre Phase 2: Nach Freigabe der einer Sperre darf die Transaktion keine weiteren Sperren anfordern d.h. in der ersten Phase werden alle Sperren angesammelt und nach erfogten Änderungen in der zweiten wieder freigegeben. Am einfachsten zu implementieren: Freigabe aller Sperren am Ende der Transaktion Sperren werden in Sperrtabelle vermerkt, Einträge müssen zumindest enthalten Transaktionsnummer gesperrtes Objekt Art der Sperre Zugriff auf Sperrtabelle muss exklusiv erfolgen bei verteilten Systemen könnte zentrale Sperre verwendet werden Vorteil: Synchronisation der Transaktionen wie im lokalen System Nachteile: Kommunikation zum zentralen Knoten sowie Autonomieverlust der übrigen Knoten dezentrale Sperrtabellen: jede Transaktion fordert bei dem jeweiligen lokalen Sperrmanager Sperren an Problem: globale Deadlocks Zeitstempelverfahren Anstelle Sperrtabelle: jede Transaktion besorgt sich zu Beginn einen Zeitstempel bei Zugriff auf ein Objekt wird dieser in ein zusätzliches Feld des Objektes eingetragen (Erweiterung der Datenstruktur) (Basic Timestamp Ordering): eine Transaktion, die ein Objekt sperren will, das bereits einen jüngeren Zeitstempel trägt wird zugunsten der jüngeren Transaktion zurückgesetzt Vorteil: garantierte Deadlockfreiheit Nachteile: Erweiterung der Datenstrukturen Benachteiligung länger laufender Transaktionen Problem: Zeitstempel bei verteilten Systemen zentraler Zeitstempelserver zweitteiliger Zeitstempel: Zeitmarke + RechnerID optimistische Synchronisationsverfahren falls nur selten Transaktionskonflikte auftreten vorbeugende Sperren sind unnötiger Aufwand greifen nicht in den Ablauf einer Transaktion ein sie überprüfen statt dessen am Ende einer Transaktion, ob Konflikt aufgetreten ist in dem Falle wird Transaktion zurückgesetzt Transaktion läft in drei Phasen ab: 1. Lesephase benötigte Objekte werden gelesen sowie in einem Read-Set gespeichert bei Änderungen werden sei in einem Write-Set gepuffert, aber nicht zurückgeschrieben 2. Validierungsphase bei Transaktionende wird geprüft, ob Konflikte zu anderen Transaktionen aufgetreten sind Validierungsphase muß exklusiv durchlaufen werden, d.h. es darf jeweils nur eine Transaktion validiert werden dies gilt auch für verteilte Anwendungen 3. Schreibphase ist Validierung erfolgreich verlaufen, so wird Write-Set zurückgeschrieben Änderungen werden dadurch sichtbar - 63 - Vorlesung Datenbanken 2 - A. Achilles Vorteile Deadlock-frei geringer Kommunikationsaufwand Probleme vergleichsweise großer Aufwand bei Transaktionskonflikten zwei grosse Kategorien Unterschied in den zu überprüfenden Transaktionen rückwärts orientiert vorwärts orientiert Rückwärts orientierte Validierungsverfahren Validierungsphase vergleicht, ob benötigte Objekte in der Zwischenzeit von anderen Transaktionen verändert wurden Read-Set der zu validierenden Transaktion wird verglichen mit Write-Sets aller Transaktionen, die während der Lesephase der Transaktion validiert wurden: Transaktion ist validiert, wenn keine Differenzen auftreten Problem: langlaufende Transaktionen Vorwärts orientierte Validierungsverfahren Validierende Transaktion wird gegen zur Zeit der Validierung aktive Transaktionen geprüft Write-Set der zu validierenden Transaktion wird verglichen mit allen Read-Sets parallel laufender Transaktionen: gilt als validiert, wenn keine Konflikte auftreten Bei Validierungsfehler können zwei unterschiedliche Strategien beschritten werden: die zu validierende Transaktion wird zurückgesetzt die den Konflikt erzeugenden laufenden Transaktionen werden zurückgesetzt werden bei Validierungsfehler die den Konflikt erzeugenden laufenden Transaktionen zurückgesetzt lang laufende Transaktionen werden unterstützt nach vagen Informationen: Navision native DBMS ist ein Beispiel für ein RDBMS mit optimistischem Synchronisationsverfahren Allerdings kann Navision auch mit anderen RDBMS betrieben werden Probleme bei verteilten DBMS langsame Kommunikationsverbindungen fehleranfällige Verbindungen Daten nicht verfügbar entfernter Rechner ggf. stark überlastet Replikation adressiert diese Probleme: (einige) Datenobjekte werden mehrfach (auf mehreren Knoten) gespeichert: höhere Datenverfügbarkeit Performance-Verbesserung jedoch: Widerspruch zur Redundanzfreiheit jeder Fakt wird genau einmal gespeichert jeder Zugriff auf Daten liefert immer aktuellen Wert Replikation: bei lesendem Zugriff auf entfernte Daten: leicht „veraltete“ Kopie der Daten kann bereits nützlich sein: Verfügbarkeit Zugriffsgeschwindigkeit jedoch: zusätzlicher Plattenplatz Aktualität der Daten - 64 - Vorlesung Datenbanken 2 - A. Achilles Replikation einer Tabelle: lesende Transaktionen Systemverfügbarkeit bei lesenden Transaktionen steigt System wird gegenüber Ausfällen stabiler ändernde Transaktionen da Änderung an allen Replikaten vollzogen werden muß: Systemverfügbarkeit sinkt, da mit jedem Replikat die Wahrscheinlichkeit des Ausfalls mindestens eines beteiligten Knotens wächst Korrektheit: um globale Konsistenz zu gewährleisten: Änderung an replizierten Objekt muß an allen Replikaten so erfolgen, daß Transaktionen konsistente Version des Objekts wahrnehmen für jede globale Folge von Transaktionen muss gelten: die an jedem Knoten entstehenden Teiltransaktionen sind serialisierbar die Menge aller lokalen Transaktionsfolgen kann in serielle Ausführungsreihenfolge gebracht werden, die äquivalent zu einer globalen Folge ist Replikationverfahren sollen Korrektheit unterstützen syntaktische Verfahren unabhängig von weiterem Wissen über die Anwendung semantische Verfahren setzt spezielles Wissen über die Eigenarten der Anwendung voraus nicht universell einsetzbar Syntaktische Replikationverfahren: absolutistische Kopien-übergreifende Synchronisation z.B. Primary Copy, Token, Exclusive Writes Voting-basierte Kopien-übergreifende Synchronisation unstrukturiertes Quorum statisches Quorum (z.B. Majority Consensus) dynamisches Quorum (z.B. Dynamic Voting) strukturiertes Quorum statisches Quorum (z.B. Tree Quorum) dynamisches Quorum (z.B. Reconfigurable Tree Quorum) Read-One-Copy Kopien-übergreifende Synchronisation (z.B. ROWA) Primary Copy für Replikate einer Tabelle: ein Knoten wird für diese Replikate als Primärknoten ausgezeichnet Änderung darf nur an diesem Knoten erfolgen nach erfolgreicher Änderung durch eine Transaktion: Knoten übernimmt Verteilung der Änderung an die Knoten, die Replikate tragen Änderung ist asynchron Kommunikationsaufwand abhängig von Wahl des Primärknotens Verringerung des Kommunikationsaufwandes: Sammeln von Änderungsinformationen auf Primärknoten verzögerte gebündelte Weitergabe an andere Knoten Achtung: Aktualität der Replikate sinkt je nach Anforderung bzgl. der Aktualität bei lesenden Zugriffen: Lesen von Primärkopie keine Vorteile durch Replikation - 65 - Vorlesung Datenbanken 2 - A. Achilles Voting-Verfahren: unstrukturiertes Quorum Majority Consensus Änderungen: jeder Knoten, der ein Replikat hat, muss alle anderen Knoten kennen, die entsprechendes Replikat besitzen der Knoten, an dem Transaktion initiiert wird, muss alle beteiligten Replikat-tragenden Knoten befragen jeder befragte Knoten antwortet positiv, falls das betreffende Datenobjekt lokal frei ist (und sperrt es für die Transaktion), negativ falls es bereits gesperrt ist der fragende Knoten sammelt die Antworten ist die Mehrheit der Antworten positiv d.h. Hälfte aller Knoten + 1, darf die Änderung erfolgen (denn keine andere Transaktion kann entsprechend viele Stimmen erlangen) lesende Transaktionen: gleiches Prinzip wie bei Änderungen Vermeidung von Dirty Reads Inconsistent Reads Vorteile des Verfahrens: Stabilität gegenüber Knotenausfällen Nachteile: hoher Kommunikationsaufwand Voting-Verfahren: strukturiertes Quorum Tree Quorum Idee des Abstimmungsverfahren entspricht dem Majority Consensus: Bringe die Mehrheit der Knoten hinter dich! Jedoch Verringerung des Kommunikationsaufwandes: es wird eine Struktur (z.B. durch Vernetzung vorgegebene Baumstruktur) zu Grunde gelegt Anfrage startet vom Wurzelknoten aus anstelle der Mehrheit der Knoten: es ist die Mehrheit der Ebenen zu erzielen Mehrheit einer Ebene ist erreicht, wenn Mehrheit der Knoten dieser Ebene der Transaktion zustimmt Probleme: Kommunikation startet von Baumwurzel: Kommunikationsengpässe sind möglich Ausfall mehrerer (wichtiger) Knoten: ggf. keine entscheidungsfähige Mehrheit möglich Dynamische Quoren Problem bisherigen Vorgehens: Anzahl der Rückmeldungen starr auch wenn Knoten ausfallen: wird die ursprüngliche Anzahl von positiven Antworten eingefordert Vorgehen: mache Anzahl der geforderten positiven Antworten von Anzahl der erreichbaren Knoten abhängig Vorteil: höhere Verfügbarkeit Nachteil Gefahr der Netzpartitionierung - 66 - Vorlesung Datenbanken 2 - A. Achilles Netzpartitionierung (Dynamische Quoren) ROWA - Read One Write All jede Lesetransaktion fndet auf jedem Knoten den aktuellsten Stand Datenänderungen müssen synchron auf allen Replikaten durchgeführt werden ändernde Transaktionen müssen nicht nur das zu ändernde Datenobjekt, sondern auch alle Replikate dieses Objekts sperren Problem: fällt ein replikat-führender Knoten aus, so kann kein globales Commit erfolgen Stabilität des Systems von entscheidender Bedeutung Vorteil: für lesende Transaktionen gelten alle Vorteile von Replikation - 67 - Vorlesung Datenbanken 2 - A. Achilles Replikation bei konkreten DBMS Oracle: Basic Replication: Änderung auf Primärtabelle, Datenverteilung asynchron auf Replikate Replikate als Snapshot der Primärtabelle Änderungs-LOG der Primärtabelle wird benutzt, um die Änderungen zu propagieren entspricht dem Primary Copy Advanced Replication Symmetrische Replikation mit asynchroner Aktualisierung alle Replikate sind gleichberechtigt, Änderungen werden an alle übrigen Replikate asynchron weitergereicht keine Behandlung des DELETE-Konflikts Änderbare Snapshots Variante beider vorhergehenden Arten: Primärtabelle verteilt weiterhin die Änderungen asynchron an alle Replikate, Replikate richten die Änderungsmitteilung mit Hilfe des INSTEAD OF-Triggers an die Primärtabelle Symmetrische synchrone Aktualisierung (ROWA) ist nicht vorgesehen DB2: Asynchrone Aktualisierung unter Einsatz einer Primärtabelle es werden nur transaktions-konsistente, aber nicht transaktions-basierte Änderungen verteilt Verringerung der Netzbelastung, indem zwischen zwei Replikationszeiten Änderungen zusammengefaßt werden Transaktions-basierte asynchrone Aktualisierung unter Einsatz einer Primärtabelle Primary Copy Asynchrone Aktualisierung unter Einsatz einer Primärtabelle mit änderbaren Kopien sowohl Replikate als auch Primärtabelle erzeugen Änderungsmitteilungen, Änderungsmitteilungen der Replikate gehen an Primärtabelle, die auf Konsistenz überprüft, Primärtabelle übernimmt Verteilung Symmetrische synchrone Aktualisierung: (ROWA) ist nicht vorgesehen - 68 - Vorlesung Datenbanken 2 - A. Achilles Distributed Relational Database Architecture - DRDA Architekturbeschreibung von IBM 1998/99 festgelegt Menge von Protokollen bzw. Regeln, um plattform-übergreifend auf verteilte Daten zugreifen zu können definiert Methoden zur koordinierten Kommunikation zwischen verteilten RDBMS Zugriff auf entfernte Tabellen wirkt für Benutzer wie lokaler Zugriff Unterschied beachten Architektur DRDA beschreibt die Architektur, die Regeln, die den Zugriff ermöglichen Implementation APIs werden von diversen Herstellern angeboten und müssen sich an den Regeln/Protokollen von DRDA orientieren DB2 ist z.B. DRDA-verträglich, d.h. es hält sich an die DRDA-Spezifikation auch heute (Anfang 2002) gibt es noch kein Produkt, das den vollen Umfang von DRDA unterstützt DRDA ist nicht die einzige Architektur dieser Zielrichtung: RDA (Remote Database Access) (ISO, ANSI-Standard Kommittee) Unterschiede: RDA: Standard-Subset von SQL, das auf allen Plattformen verfügbar ist DRDA: arbeitet mit Plattform-spezifischen Erweiterungen von SQL RDA: nur dynamisches SQL DRDA: auch statisches SQL Verteilter Zugriff wird in DRDA mit drei Funktionen verwirklicht, die miteinander operieren: Application Requester (AR) Application Server (AS) Database Server (DS) Application Requester (AR) ermöglicht SQL und entsprechende Anforderungen durch Programme nimmt SQL-Anforderungen vom Programm entgegen und sendet sie zur Verarbeitung an die entsprechenden Server AR ist in DB2Connect verwirklicht Anmerkung: falls Daten völlig lokal vorliegen, wird kein DRDA benötigt falls Daten ausschließlich entfernt vorliegen, wird kein lokales RDMBS benötigt Application Server (AS) empfängt Anforderungen vom AR und bearbeitet diese AS bearbeitet Anforderungen direkt, sofern möglich SQL-Anweisungen werden an DS zur Bearbeitung weitergeleitet Kommunikation zwischen AR und AS Kommunikation-Protokoll zwischen AR und AS: Application Support Protocol Kommunikationsprotokoll sorgt für entsprechende Datenumwandlung z.B. ASCII-EBCDIC - 69 - Vorlesung Datenbanken 2 - A. Achilles Kommunikation zwischen AR und AS Database Server (DS) DS erhält Anforderung von AS oder einem anderen DS Anforderung kann SQL-Anweisung oder "Programm-Vorbereitung" sein wie AS: DS bearbeitet Anforderung soweit möglich, reicht den Rest weiter an anderen DS z.B. Join von Tabellen, die auf unterschiedlichen DS liegen Protokoll: Database Support Porotocoll damit unterschiedliche DBMS eingebunden werden können wird benutzt zwischen AS - DS DS - DS Rückgabe nach kompletter Bearbeitung der Anforderung AS gibt ReturnCode und ResultSet (sofern erzeugt) an AR ReturnCode: SQLSTATE es wird kein ResultSet erzeugt, falls INSERT, UPDATE, DELETE keine Ergebniszeilen bei SELECT DCL oder DDL Limited Block Protocol: Voraussetzung: Read only Cursor sendet mehrere Zeilen über das Netz, auch wenn Fetch jeweils nur eine Zeile bearbeiten kann dadurch Verringerung des Netzverkehrs und damit Performance-Verbesserung - 70 - Vorlesung Datenbanken 2 - A. Achilles Andere Standards: auf denen DRDA aufsetzt Advanced Program to Program Comunication (APPC) Kommunikations-Unterstützung LU6.2 zwischen funktional gleichberechtigten logischen Einheiten Distributed Data Management (DDM) definiert Methoden, um verteilte Daten über Netz mittels APPC anzusprechen Daten können entweder Files oder Tabellen in einem RDBMS sein Formatted Data: Object Content Architecture (FD:OCA) Architektur, um Daten-Felder auszutauschen Daten und ihre Beschreibung werden zusammen verpackt, so dass jedes DRDA-unterstützende DMBS Struktur und Inhalt verstehen kann Character Data Representation Architecture (CDRA) unterstützt den Austausch von Zeichen zwischen den unterschiedlichen Hardware- und BSArchitekturen DRDA bietet 5 unterschiedliche Ebenen für die Unterstützung von Verteilung 1. User-Assisted 2. Remote Request 3. Remote Unit of Work (RUW) 4. Distributed Unit of Work (DUW) 5. Distributed Request Übersicht über die DRDA-Ebenen DRDA-Ebene #SQL-Anweisungen User-Assisted Remote Request 1 Remote Unit of Work >1 Distributed Unit of Work >1 Distributed Request >1 #DBMS pro Einheit #DBMS pro SQL-Anweisung 1 1 1 1 >1 1 >1 >1 User-Assisted Distribution der Benutzer nimmt die physische Verteilung wahr, er kann nur Daten aus dem System extrahieren Daten in das System laden Achtung: Probleme bei Replikaten nützlich z.B. bei Erstellung von Snapshots Remote Request Wenn ein DBMS DRDA Remote Request Fähigkeiten unterstützt, dann kann eine einzige SQLAnweisung pro Single Unit of Work an ein entferntes DBMS gestellt werden um Daten zu lesen oder zu verändern Remote Unit of Work mehrere SQL-Anweisungen können in einer Transaktion gegen genau ein entferntes DBMS gestellt werden Distributed Unit of Work mehrere SQL-Anweisungen können in einer Transaktion gegen mehrere entfernte DBMS gestellt werden pro SQL-Anweisung kann jedoch nur ein DBMS angesprochen werden 2-Phase-Commit-Protokoll dient zur Synchronisation der Transaktion Distributed Request bedeutet vollständige Verteilung: eine SQL-Anweisung kann mehrere DBMS betreffen mehrere Anweisungen können in einer Transaktion verwendet werden Anmerkung: derzeit gibt es keine Produkte, die Distributed Request Eigenschaft besitzen - 71 - Vorlesung Datenbanken 2 - A. Achilles DRDA-Kommanofluss - 72 - Vorlesung Datenbanken 2 - A. Achilles XML Datenbanken Verarbeitung und Speicherung von XML-Dateien hat eine Reihe von Werkzeugen hervorgebracht, darunter auch "native XML-Datenbanken" Native XML-Datenbanken müssen ein logisches Modell für XML-Dokumente unterstützen und Speicherung und Zugriff daran ausrichten. Das Modell muß zumindest Elemente Attribute PCDATA und die Anordnung innerhalb eines Dokumentes unterstützen. Beispiele dafür: DOM und XPath das XML-Dokument muß die grundlegende Einheit zum (logischen) Zugriff darstellen (vgl. Tabellenzeile bei RDBMS) physisch kann ein beliebiges Modell zu Grunde liegen: hierarchisch relational objekt-orientiert proprietär Anforderungen: das DBMS ist ausgerichtet auf Speicherung von XML-Daten Speicherung und Wiederauffinden erfolgt auf der Basis von Dokumenten Werkzeug, um sicher XML-Dlkumente zu speichern und zu manipulieren Speicherung XML-Dlkumente werden als Einheit gespeichert Modell richtet sich an XML/DOM aus das Modell wird automatisch auf den zu Grunde liegenden Speichermechanismus gemapped Mengen von Dokumenten Abfragen und Änderungen beziehen sich auf eine Menge von Dokumenten (vgl. relationales Konzept) im Unterschied zum relationalen Konzept benötigt nicht jede XML-Datenbank ein Schema, dem die Dokumentenmenge genügt Schema-Unabhängigkeit erhöht Flexibilität Schema-Unabhängigkeit vergrößert das Risiko von Integritätsverletzungen müssen Schema-Strukturen eingehalten werden, sollten entsprechende XML-Datenbanken verwendet werden einige XML-Datenbanken unterstützen DTD-Validation Zukunft: W3C XML-Schema ? Anfragesprache und Performance XPath ermöglicht Anfragen auf Dokumentenmengen Probleme: keine Gruppierung keine Sortierung Datentypen werden nicht unterstützt keine Jois zwischen Dokumenten XQuery neuere Entwicklung von W3 adressiert diese Probleme in der Regel ist Indexierung möglich - 73 - Vorlesung Datenbanken 2 - A. Achilles Updates direkt: suchen, mit XML-API ändern, zurückspeichern XML:DBXUpdate neuere Update-Sprache, die Änderungen innerhalb des Servers ermöglicht wird von einigen XMLDBs untertützt - 74 - Vorlesung Datenbanken 2 - A. Achilles Data Warehouse Woher kommt der Ansatz? Entscheidungsfindung bei Geschäftsvorgängen: DSS (Decision Support System) Interaktive Verbindung von Regeln sowie Intuition von Experten Ziele: ad hoc Modellierung jeweils neuer Situationen Simulation eines Ausschnitts der realen Welt Aufgaben eines DSS Management Information System Standard Reports, Sales Forcast usw. Testen von Hypothesen Modellierung Erzeugung eines Modells und Validierung an Hand der historischen Daten Erkennung unbekannter Trends DSS benötigt Datenbasis Datenbasis muss flexibel und bei OLAP-Anforderungen (OnLine Analytical Processing) online zur Verfügung stehen: Datenbank (Data Warehouse) mit folgenden Eigenschaften: themenorientierte Zusammenfassung von Daten lesende Anfragen Verarbeitung großer Datenmvolumina pro Anfrage regelmäßiges Update durch Daten aus dem OLTP-System (OnLine Transaction Processing), das die aktuellen Geschäftsvorgänge unterstützt aus Sicht der Informatik werden folgende Problemstellungen angesprochen was unterscheidet ein Data Warehouse von einem OLTP spezielle Datenstrukturen, Komprimierung relationale DBMS - Spezialsysteme wie können Daten aus dem OLTP übernommen werden nicht behandelt werden wirtschaftliche Aspekte Problematik historischer Daten Vergleich OLTP - Data Warehouse OLTP Tabellengröße klein Zeilen pro Tabelle wenige Umfang einer Transaktion gering Dauer einer Transaktion kurz # online-Benutzern hoch # Updates sehr hoch Full Table Scan selten historische Daten wenig Normalisierungsgrad hoch Data Warehouse groß extrem viele sehr groß sehr lang einzelne nahezu keine häufig fast ausschließlich stark denomalisiert - 75 - Vorlesung Datenbanken 2 - A. Achilles um bei den zu erwartenden großen Datenmengen pro (lesender) Transaktion eine angemessene Performance zu erreichen De-Normalisierung der OLTP-Datenbank Pre-Join mehrerer Tabellen Ziel ist es, die Join-Operationen weitgehend zu vermeinden führt zu STAR- oder SNOWFLAKE-Schema Pre-Aggregation bereits werden des Ladens werden auf unterschiedlichen Stufen Aggregate gebildet anstelle einer kontinuierlichen Änderung periodisches Update mittels Batch STAR-Schema an Hand eines Beispiels: Fakt-Tabelle ist aus den normalisierten Tabellen mittels Join gewonnen. Enthält neben den Schlüsseln weitgehend sämtliche Information Schlüssel werden als Indexe (Dimensionen) verwendet (ggf. mit zusätzlicher Information) SNOWFLAKE-Schema: Verbindung mehrerer unterschiedlich thematisierter STAR-Schemata Multidimensionale Datenbanken (typisch unter Einbeziehung der Zeit) spezielle Architektur MOLAP (Multidimensional OnLine Analytical Processing) konventionelles RDBMS mit Aufsatz ROLAP (Relational Online Analytical Processing) - 76 - Vorlesung Datenbanken 2 - A. Achilles Spezielle multidimensionale Datenbank-Architektur Vorteil: gute Performance speziell bei beliebigen Ausschnitten Nachteil: Skalierbarkeit Multidimensionale Datenbank: RDBMS mit Aufsatz Vorteil: Flexibilität wesentlich besser Skalierbarkeit wesentlich besser als bei MOLAP Nachteil: Performance hinsichtlich einiger Operationen kann teilweise ausgeglichen werden durch entsprechenden Entwurf DBMS-unterstützte Partitionierung Mehrprozessor-Einsatz Redundanz im Data Warehouse zu beachtende Faktoren: Größe der Daten beeinflußt die Menge des Speicherplatzes und somit der Plattenkosten Änderungshäfugikeit wirkt sich auf CPU und I/O-Zeit aus Obwohl der wesentliche Einsatz lesend ist und somit Redundanz unproblematisch eingesetzt werden könnte, läßt sich Redundanz im Data Warehouse nur in einem bestimmten Bereich gut nutzen: Anlegen und Laden eines Data Warehouses vom OLTP SQL-Anweisungen während off-Zeit des OLTP Snapshot Log sniffing Insert-, Update-, Delete-Trigger spezielle Data Extract Programme während off-Zeit des OLTP SQL-Anweisungen während off-Zeit des OLTP können insbesondere dazu benutzt werden, Pre-Joins anzulegen Snapshot Überführung einer Tabelle in das Data Warehouse Ausnutzen von Replikation Log sniffing mit Spezialprogramm die Logs auf Änderungen untersuchen und diese in das Data Warehouse einbringen - 77 - Vorlesung Datenbanken 2 - A. Achilles Insert-, Update-, Delete-Trigger direktes Übernehmen jeder Änderung spezielle Data Extract Programme während off-Zeit des OLTP dieses Vorgehen bietet die besten Möglichkeiten, vor dem Einfügen Daten zu aggregieren - 78 - Vorlesung Datenbanken 2 - A. Achilles Objekt-Relationale DBMS OO-Methoden der Software-Entwicklung wirken sich auf Anforderungen an DBMS aus. OODB-Manifesto: notwendige Anforderungen komplexe Objekte Objekt-Identität Kapselung Typen und Klassen Typen- und Klassenhierarchie Overriding, Polymorphie, Overloading, Late Binding Berechnungsvollständige Datenbankprogrammiersprache Erweiterbarkeit Persistenz Sekundärspeicherverwaltung Synchronisation und Recovery von Transaktionen Anfragesprachen optionale Anforderungen Mehrfachvererbung statische Typisierung und Typ-Inferenz Verteilung Entwurfstransaktionen Versionen Zwei Ansätze: Erweiterung der RDBMS Neuentwicklung von OODBMS Erweiterung von RDBMS Komplex strukturierte Typen, Typkonstruktoren Objekt-Identifikation und Referenzen Spezialisierung, sowohl auf Objektebene als auch auf Klassenebene Beispiel Oracle 8 komplexe Typen Referenzen SQL3-Standard: baut auf SQL92 auf Erweiterung hinsichtlich ODBMS: Konzept benutzerdefinierter abstrakter Datentypen (ADT) Funktionen der ADT werden analog zu Methoden durch das DBMS verwaltet Tapeltypen (row) auf ADT ist Subtypkonzept mit Vererbung realisiert Redefinition von Attributen und Funktionen ist erlaubt Typkonstruktoren list, set, multiset nicht-atomare Wertebereiche für Attribute, können zusammen mit row verwendet werden Identifikatoren können für Tupel vergeben werden und können als Referenzen verwendet werden SQL3 umfaßt somit strukturelle Konzepte von ODBMS bei Kompatibilität zu vorhergehenden SQLVersionen - 79 - Vorlesung Datenbanken 2 - A. Achilles Einordnung von Oracle8 keine Vererbungshierarchie Beschränkung auf einen Kollektionstyp (Tabelle) Objekt-Views Komplexe Datentypen - Objekttypen User-Defined Datatypes (UDT): Object Types Collection Types Object Types - Objekttypen bestehen aus Namen des Typs Attributmenge Methoden Object Types - Vereinbarung: create type Typ_Adresse as object ( Strasse varchar2(30), Nummer integer, Zusatz varchar2(3), PLZ integer, Ort varchar2(30) ); Object Type Typ_Adresse kann z.B. durchgängig in den DBs der FH für die Speicherung von Adressen verwendet werden Prinzip der Wiederverwendung Hinzufügen oder Modifizieren von Attributen impliziert ausschließlich Änderungen an der Objektdefinition Object Types können in weiteren Objekttypen als Wertebereich eingesetzt werden: create type Typ_Student as object ( Nachname varchar2(40), Vorname varchar2(40), Matrikelnr varchar2(7), Adresse Typ_Adresse ); zyklischer Verweis durch ref-Attribute. Zur Auflösung durch DDL-Compiler ist Forward-Deklaration nötig: create type Typ_XXX; Object Types in Tabellen als Objekttabellen als Attributbereiche Objekttabellen create table T_Student of Typ_Student ( Matrikelnr primary key); Attributbereiche create table T_Student_Heimat ( Matrikelnr varchar2(7), Anschrift T_Anschrift, Matrikelnr primary key); Einfügen: insert into T_Student_Heimat values ('1234567',Typ_Adresse('Strasse',5,'',47110,'Irgendwo') ); - 80 - Vorlesung Datenbanken 2 - A. Achilles Konstruktormethoden werden nicht explizit definiert, vielmehr automatisch bei Anlegen eines neuen Objekttyps erzeugt Zugriff durch Punkt-Operator select T.Matrikelnr, T.Adresse.Ort from T_Student_Heimat T where T.Adresse.PLZ between 40000 and 41200; Methoden für Objekttypen create type Typ_Student_FH as object ( student Typ_Student, member function semester return number, pragma RESTRICT_REFERENCES (semester, WNDS) ); lediglich Typ-Definition der Methode Implementierung erfolgt unabhängig unter Ausnutzung von PL/SQL pragma RESTRICT_REFERENCES dient zum Kontrollieren der Seiteneffekte: Referenzen auf Tabellen und Package-Variablen Methoden für Objekttypen create type body Typ_Student_FH as member function semester return number is maxsem number; begin select max(semester) into maxsem from T_Belegung; return (maxsem); end; end; vorausgesetzt, T_Belegung ist eine geeignete Sicht auf die Fächerbelegung für den jeweiligen Studenten Anforderung an Methoden: die pragma-Anweisung beschränkt die Referenzen auf Tabellen und Package-Variablen damit werden die Seiteneffekte der Methoden eingeschränkt Einsatz von Methoden select T.Student.Name, T_Student_FH.semester() from T_Student_FH where T.Student.Matrkelnr = 47110 Get- und Set-Methoden bei echter Kapselung würden diese Methoden benötigt, jedoch unterstützt Oracle8 dies noch nicht Vergleichsmethoden damit Oracle auf Gleichheit/Ungleichheit testen kann, müssen entsprechende Funktionen bereitgestellt werden dazu gibt es zwei Arten der Festlegung: map member function Vergleichswert return number; order member function Ordnung(x in Typ_...) return integer; Die Map-Methode erzeugt für ein Objekt einen Datenwert, der zur Sortierung verwendet werden kann Die Order-Methode vergleicht zwei Objekte und liefert für < einen negativen Wert = den Wert 0 > einen positiven Wert - 81 - Vorlesung Datenbanken 2 - A. Achilles mögliche Implementationen map member fucntion Vergleichswert return number is begin return Matrikelnr; end; order member function Ordnung( x in Typ_Student_FH ) return integer is begin return Matrikelnr - x.Matrikelnr; end; Kollektionstypen arrays nested tables Kollektionstypen: Arrays create type Werte_array as varray(anzahl) of number; Kollektionstypen: Nested Tables create type Typ_Adressen_Tabelle as table of Typ_Adresse; Kollektionstypen: Nested Tables create table T_Student_Neu ( PK_Matrikelnr varchar2( 7) primary key, Name varchar2(40), Adressen Typ_Adressen_Tabelle) nested table Adressen store as Studenten_Adressen_Liste; Anzahl mit count abfragbar, kann dann in for benutzt werden Realisierung: zwei Tabellen, verbunden über system-generierte ID Einfügen durch "Entschachtelung": Selektieren mittels Cursor: insert into the ( select Adressen from T_Studenten_Neu where PK_Matrikelnr = ... ) values (...) /* Hier stehen die Werte der Adresse */ select T.PK_Matrikelnr, T.Name, cursor ( select * from table (T.Adressen) ) from T_Studenten_Neu T; Referenzen Konzept der Objektidentifikation: Datentyp ref als Referenz auf Row-Objekte noch ausstehend: Objektidentität vollständige Kapselung Vererbung - 82 -