HSLU T&A, Semester 4, FS.13 DMG Datenmanagement Modulzusammenfassung Datenmanagement & Relationale Algebra c The Software Bakery Bruno Leupi, Tobias Maestrini, Edy Wermelinger 26. Februar 2014 Eidg. Dipl. Techniker in Informatik Bruno Leupi ist Student bei der Hochschule Luzern sowie Softwareentwickler für die Firma Schindler Aufzüge AG. E-Mail: [email protected] Internet: leupibr.no-ip.info Maresciallo Luogotenente (mit akademischer Grundausbildung) Tobias Maestrini studiert mit Bruno Leupi. Er ist promovierter Sekundarlehrer und gescheiterter Jazzpianist sowie gegroundeter Pilot, mit besonderer Vorliebe für Kryptisches und Fundamentales. E-Mail: [email protected] Internet: www.tobias-maestrini.ch Edy Wermelinger studiert mit Tobias Maestrini. Er arbeitet als grosser Compilerbauer und ist verantwortlich für jene technischen Meilensteine, welche in den Monaten des Frühjahrs 2013 für Aufsehen gesorgt hatten: Edy Wermelinger hat mit seinem EduardUno, dem EduardoPRO und dem Eduarden die Geschichte der Compiler grundlegend revolutioniert. Edy Wermelinger ist Mitglied der International Unified Compiler Builder Association (IUCBA), Mitgründer der Common LogServer Interface Group (CLoSIG) sowie Mitautor zahlreicher renommierter Standardwerke für Datentypen. E-Mail: [email protected] Internet: www.werminet.ch Zu diesem Skript. Dieses Skript stützt sich auf die Vorlesungen im Fach DMG bei Th. Olnhoff während des Frühlingssemesters 2013 und verarbeitet die dort gehörten Inputs mit ausgewählten Aspekten aus dem Lehrbuch "‘Datenbanksysteme – Eine Einführung"’ von A. Kemper und A. Eickler. Die Kapitelüberschriften korrespondieren mit den entsprechenden Kapiteln im Lehrbuch. Dieses Skript wird vorzugsweise auf säure- und chlorfrei hergestelltem Papier gedruckt. Inhaltsverzeichnis 1 2 Was soll ein DBMS leisten? 8 1.1 Datenmodellierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.2 Das relationale Datenmodell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.2.1 9 Datenbankentwurf 10 2.1 Phasen des Datenbankentwurfs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.2 Entity/Relationship-Modellierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.3 Funktionalitäten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.3.1 3 Datenabstraktion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . n-stellige Beispiel-Beziehung . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.4 Notationen für Funktionalitäten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.5 Generalisierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.6 Konsolidierung von Teilschemata oder Sichtenintegration . . . . . . . . . . . . . . . . . 13 Das relationale Modell (incl. Algebra) 3.1 14 Relationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.1.1 Binäre Relationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.1.2 Unterschiede und Gemeinsamkeiten zu Funktionen . . . . . . . . . . . . . . . . 15 3.2 Eigenschaften von Relationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.3 Kombination und Zusammensetzung von Relationen . . . . . . . . . . . . . . . . . . . 16 3.4 Darstellung von Relationen durch Matrizen . . . . . . . . . . . . . . . . . . . . . . . . 17 3.5 Äquivalenzrelationen und -klassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.6 n− stellige Relationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.7 Operationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.8 Typ-kompatible Relationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.8.1 3.8.2 3.8.3 3.8.4 3.9 Vereinigung ∪ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Durchschnitt ∩ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Differenz \ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Kreuzprodukt × . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 3.8.5 Selektion σ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 3.8.6 Projektion Π . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.8.7 Umbenennung ρ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.8.8 Verbund ./ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.8.9 Division ÷ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Transformationsregeln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.9.1 Übersicht Relationenalgebra . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 4 Relationale Anfragesprachen (SQL) 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 6.3 Referentielle Integrität . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 Datenbank-Trigger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 DB-Prozeduren (Stored Procedures) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 39 Funktionale Abhängigkeiten [171ff] . . . . . . . 6.1.1 Schlüssel . . . . . . . . . . . . . . . . . Normalisierung . . . . . . . . . . . . . . . . . . Normalisierung mit Boyce-Codd (BCNF) [190ff] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Physische Datenorganisation 7.1 7.2 7.3 7.4 7.5 7.6 24 24 24 24 26 26 27 28 28 28 29 29 30 30 32 32 32 32 34 36 Relationale Entwurfstheorie 6.1 7 Einfache Datendefinition in SQL . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 Online-Ressource (Link) . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.2 Anlegen von Tabellen . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.3 Referentielle Integrität in SQL . . . . . . . . . . . . . . . . . . . . . . Veränderungen am Datenbestand . . . . . . . . . . . . . . . . . . . . . . . . . Anfragen über mehrere Relationen . . . . . . . . . . . . . . . . . . . . . . . . Aggregatfunktionen und Gruppierung . . . . . . . . . . . . . . . . . . . . . . Geschachtelte Anfrage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verwertung der Ergebnismenge einer Unteranfrage . . . . . . . . . . . . . . . Auswertung bei NULL-Werten . . . . . . . . . . . . . . . . . . . . . . . . . . Das «case»-Konstrukt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . JOINs in SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Rekursion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.10.1 Rekursionskonstrukt mittels WITH ... UNION ALL ... SELECT Veränderungen am Datenbestand . . . . . . . . . . . . . . . . . . . . . . . . . Sichten (Views) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . JDBC: Java Database Connectivity . . . . . . . . . . . . . . . . . . . . . . . . 4.13.1 Schritte in JDBC zur Erstellung einer DB-Abfrage . . . . . . . . . . . 4.13.2 Daten einfügen mittels verschiedener Statements . . . . . . . . . . . . Datenintegrität 5.1 5.2 5.3 6 24 Hintergrundspeicher . . . . . . . . B-Bäume . . . . . . . . . . . . . . B+ -Bäume («Clustered Index») . . B*-Bäume («non-clustered Index») Beispiele . . . . . . . . . . . . . . Statisches Hashing . . . . . . . . . 7.6.1 Vorteile . . . . . . . . . . . 7.6.2 Nachteile . . . . . . . . . . 39 39 39 40 41 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 42 43 44 45 47 48 48 8 Anfragebearbeitung / -Optimierung 8.1 Logische Optimierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 8.1.1 8.2 8.3 9 Heuristische Anwendungen der Transformationsregeln . . . . . . . . . . . . . . 51 Physische Optimierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 8.2.1 Selektivität . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 8.2.2 Übersetzung der logischen Algebra . . . . . . . . . . . . . . . . . . . . . . . . 52 „Tuning“ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Transaktionsverwaltung 9.1 50 54 Transaktionsverwaltung mit Fehlerbehandlung . . . . . . . . . . . . . . . . . . . . . . . 54 9.1.1 Wichtige Eigenschaften von Transaktionen [wichtig] . . . . . . . . . . . . . . . 54 9.1.2 Komponenten Transaktionsverwaltung . . . . . . . . . . . . . . . . . . . . . . . 55 10 Fehlerbehandlung 56 10.1 Die (zweistufige) Speicherhierarchie . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 10.1.1 Ersetzung von Seiten und Änderungen von Transaktionen . . . . . . . . . . . . 56 10.2 Protokollierung von Änderungsoperationen . . . . . . . . . . . . . . . . . . . . . . . . 57 10.2.1 Das WAL-Prinzip („Write Ahead Log“-Prinzip) . . . . . . . . . . . . . . . . . . 58 10.3 Wiederanlauf nach einem Fehler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 11 Transaktionsverwaltung mit Mehrbenutzersynchronisation 59 11.1 Fehler bei unkontrolliertem Mehrbenutzerbetrieb [S. 316] . . . . . . . . . . . . . . . . . 59 11.2 Serialisierbarkeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 11.3 Sperrbasierte Synchronisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 11.3.1 Verhalten der Transaktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 11.4 2-Phase-Commit Transaktionsverarbeitung . . . . . . . . . . . . . . . . . . . . . . . . . 62 11.5 Abstürze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 11.5.1 Absturz eines Koordinators → Hauptproblem des 2PC-Verfahrens . . . . . . . . 62 11.5.2 Absturz eines Agenten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 12 Sicherheitsaspekte 63 12.1 Zugriffskontrolle in SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 12.1.1 Identifikation und Authentisierung . . . . . . . . . . . . . . . . . . . . . . . . . 63 12.1.2 Autorisierung und Zugriffskontrolle . . . . . . . . . . . . . . . . . . . . . . . . 63 12.1.3 Zugriffskontrolle durch Sichten (VIEW) . . . . . . . . . . . . . . . . . . . . . . 63 12.2 Schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 12.3 Kryptographie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 13 Objektorientierte Datenbanken / Übung mit Java-Persistence-API (Objektorientierte Sicht auf relationale DB) 65 13.1 Klassenbeschreibungen einer relationalen Datenbank 13.1.1 Definition von Objekttypen . . . . . . . . . . 13.2 Abfragen, Statements und Transaktionen in OQL . . 13.3 Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Java Persistence API 14.1 Beschreibungsmittel und Klassen 14.1.1 Annotations-1 . . . . . . 14.1.2 Annotations-2 . . . . . . 14.1.3 Annotations-3 . . . . . . 14.1.4 Annotations-4 . . . . . . 14.1.5 Annotation-5 . . . . . . 14.1.6 Persistence.xml . . . . . 14.1.7 EntityManager . . . . . 65 66 67 68 70 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Verteilte Datenbanken 15.1 Fragmentierung . . . . . . . . . . . . 15.1.1 Horizontale Fragmentierung . 15.1.2 Vertikale Fragmentierung . . . 15.2 Allokation . . . . . . . . . . . . . . . 15.3 Transparenz . . . . . . . . . . . . . . 15.3.1 Fragmentierungstransparenz . 15.3.2 Allokationstransparenz . . . . 15.3.3 Lokale Schema-Transparenz . 15.4 Beispielaufgabe aus dem Unterricht . 15.5 Sperren von Replikationen . . . . . . 15.5.1 Quorum-Consensus Verfahren 15.6 Replikationsarten . . . . . . . . . . . 15.6.1 Snapshot Replikation . . . . . 15.6.2 Transaktionale Replikation . . 15.6.3 Merge- Replikation . . . . . . 70 70 71 71 71 72 72 72 74 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 OLTP, Data Warehouse, Data Mining 16.1 OLTP: Online Transaction Processing . . . . . . . . . . . . . . . . . . 16.1.1 OLAP: Online Analytical Processing – das Gegenteil von OLTP 16.2 Data Warehouse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.2.1 Stern-Schema . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.2.2 Verdichtung der Daten zu Datenwürfeln . . . . . . . . . . . . . 74 75 76 77 78 78 79 79 79 80 80 80 81 81 81 82 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 82 83 83 84 17 XML-Datenmodellierung (mit Java-Bibliotheken, Fokus XQuery) 17.1 HTML-Datenmodell . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.1.1 XML-Datenmodell . . . . . . . . . . . . . . . . . . . . . . . . 17.2 Schemabeschreibung . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.3 Anfragesprachen, Fokus: XQuery . . . . . . . . . . . . . . . . . . . . 17.3.1 XML-Anfragesprache XQuery und FLWOR-Regel . . . . . . . 17.3.2 XQuery-Implementation mit CONTAINS . . . . . . . . . . . . 17.4 Java API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.4.1 Java: simple API for XML (SAX) . . . . . . . . . . . . . . . . 17.4.2 Java: DOM-Interface for XML DOM = Document Object Model 86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 86 87 88 88 90 90 90 93 1 Was soll ein DBMS leisten? hohe Performance einfache Abfragemöglichkeiten Transaktionssicherheit referenzielle Integrität Daten sind nur an einem bestimmten Ort gespeichert und abhängige andere Daten (Referenzen) werden bei einer Modifikation mitmodifiziert («Referenzen sind stimmig») Redundanzfreiheit und Vermeidung von Inkonsistenzen Informationen sind redundanzfrei enthalten Datenschutz definierte Benutzer können entsprechende Berechtigungen ausführen Ausfallsicherheit bei einem Serverausfall gibt es ein entsprechendes Recovery, das auf den Zustand vor dem Ausfall zurückgeführt werden kann Mehrbenutzerbetrieb parallele Zugriffe mehrerer Benutzer sind möglich Sicherheitsprobleme sollen vermieden werden Entwicklungskosten für Anwendungsprogramme in einem angepassten Mass halten 1.1 Datenmodellierung Ein Abbild einer realen Welt wird in einem Schema abgebildet: Reale Miniwelt ⇒ Konzeptuelles Schema (ER-Schema1 ) Datenmodellierung Ausschnitt der Realen Miniwelt Modell-Ebene: DB-Ebene: Manuelle/intellektuelle D Modellierung M G Konzeptuelles Schema (ER-Schema) Halbautomatische Transformation Relationales Schema Netzwerk Schema Objektorientiertes Schema Abbildung 1: Datenmodellierung bzw. Abbildung der realen Welt auf ein ER-Schema 1 8 Entity Relationship Schema © A. Kemper / A. Eickler c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 7 1.2 Das relationale Datenmodell Das relationale Modell 3. Umsetzung konzeptuelles in logisches Schema Beispiel: Modellierung einer Anwendung Umsetzung konzeptuelles in logisches Schema MatrNr Studenten N Professoren hören M Vorlesungen N 1 lesen PersNr Name ....... Rang ....... VorlNr 3 Raum Überführung des Konzeptuellen Schemas in ein Logisches Schema (in der VL: Relationales Modell) Studenten hören Vorlesungen MatrNr Name MatrNr VorlNr VorlNr Titel 24002 Xenokrates 26120 5001 5001 Grundzüge 25403 Jonas 24002 5001 5041 Ethik 26120 Fichte 24002 4052 5049 Mäeutik 26830 Aristoxenos ... ... 4052 Logik 28106 Carnap 5216 Bioethik 29555 Feuerbach ... ... ... ... Katrin Seyr Seite 7 1.2 Das relationale Datenmodell2 Begriff. Auf den Arbeiten von E.F. Codd von 1970 basierendes Datenmodell, mit dem Beziehungen zwischen Daten in Form von Relationen bzw. in Tabellenform beschrieben werden. Grundlage fast aller neueren Datenbanksysteme (z.B. DB2, Oracle, Ingres, Sybase) Vorteile. hohe Flexibilität, leichte Handhabung, einfache Datenbankabfragen Nachteil. Effizienzprobleme bei grossen Datenvolumen 1.2.1 Datenabstraktion Der Abstraktionslevel einer Datenbank besagt, dass eine DB immer die gleiche Logische Ebene bzw. verschiedene externe Sichten einer physikalisch existierenden Realsituation zeigt, auch wenn sich die Physische Ebene ändert: Sicht 1 Sicht 2 Sicht n Logische Ebene (Datenbankschema) Physische Ebene (Hintergrundspeicher) Ein Vorteil des Modells liegt darin, dass für die «weiter oben liegenden» (Applikations-) Schichten sich nichts ändert – auch dann nicht, wenn sich auf der darunter liegenden Datenstruktur etwas verändert. 2 http://wirtschaftslexikon.gabler.de/Archiv/55871/relationenmodell-v8.html c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 9 2 Datenbankentwurf 2.1 Phasen des Datenbankentwurfs Der konzeptuell saubere Entwurf sollte die Voraussetzung aller DB-Anwendungen sein. Die Erstellung eines ER-Modells beschreibt eine gestufte Vorgehensweise: InformationsAnforderungen Anforderungsanalyse Konzeptueller Entwurf ER-Modell FunktionsAnforderungen Implementationsentwurf Tabellen DBMSCharakteristika Physischer Entwurf Speicherstrukturen Beschreibung der Datenbankobjekte in einer Tabelle: • Attribute definieren: Typ Länge Wertebereich Identifizierend als Primärschlüssel einsetzbar? Definiertheit «NOT NULL»-Eigenschaft (SQL) Wiederholung wieviele Objekte dieses Datentyps sind in einer Beziehung möglich? (vgl. «Col- lection») 2.2 Entity/Relationship-Modellierung • • • • • 10 Entity (Gegenstands- / Entitätstyp) Relationship (Beziehungstyp) Attribut (Eigenschaft) Schlüssel (Identifikation) Rolle c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 2.3 Funktionalitäten 2.3 Funktionalitäten Man kann Beziehungstypen (Relationships R) zwischen den Entitätstypen (E) hinsichtlich ihrer Funktionalität charakterisieren. Es gibt Funktionalitäten vier verschiedene Assotiationstypen: ... E1 c: can = 0 oder 1 R R E1 E1 x E2 ... E2 mc: multiple can = 0 bis viele E2 c : c mc : c c : mc D M G mc : mc © A. Kemper / A. Eickler 10 Die Ovale repräsentieren die Entitätstypen E1 und E2 , die kleinen Quadrate innerhalb der Ovale stellen die Entities dar und die verbindenden Linien repräsentieren eine Instanz der Beziehung R. Beispiel 1: Ehe – ein Beziehungstyp Mann ⇔ Frau ⇒ c ⇔ c Beispiel-Beziehung: betreuen 2.3.1 n-stellige Beispiel-Beziehung Aus der dreistelligen Beziehung zwischen den Entitytypen Studenten, Professoren und Seminarthemen gehen folgende Teilbeziehungen hervor: c Studenten mc betreuen c Professoren Seminarthemen Note betreuen : Professoren × Studenten → Seminarthemen betreuen : Seminarthemen × Studenten Seminarthemen → Professoren betreuen : Professoren x Studenten betreuen : Seminarthemen x Studenten D M G Professoren Im ER-Modell mit Funktionalitätsangaben beschränkt man sich sich auf 2-stellige BeziehunA. Kemper / A. Eickler 13 schafft gen („best practice“). 3-stellige bzw n-stellige©Beziehungen sind nicht anzustreben! Abhilfe dann die Einführung einer zusätzlichen Beziehungsentität (siehe nächste Grafik). c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 11 Charakterisierung von Beziehungstypen Umwandlung n-stelliger Beziehungen 2.4 Notationen für Funktionalitäten Beispiel für die Umwandlung einer dreistelligen Beziehung in drei zweistellige Beziehungen: Titel Titel empfiehlt-P-V Vorlesung Professor empfiehlt ➜ Professor Vorlesung empfiehlt-V-B Name Buch Name Fach Fach empfiehlt-P-B ISBN „Unsere“ Notationen für Funktionalitäten – Erläuterungen auf weiteren Folien Buch ISBN Ziel: Von der dreistelligen Beziehung (links) zur zweistelligen (rechts). Nur bei 2er Beziehungen Bei 3er und höheren Beziehungen: es wird eine Beziehungsentität 2.4 Notationen fürDesign Funktionalitäten DB:III-80 Conceptual eingeführt Immer mit den Unterscheidungen (Information Engineering Standard): c can, 0..1, entspricht 1 im Buch 1 one oder eins, 1..1, entspricht existenzabhängig im Buch mc multiple can, 0..*, entspricht N oder M oder P im Buch m multiple, 1..*, entspricht N oder M oder P im Buch c STEIN 2004-2012 D M G Beispiel 2: Bestellwesen Im folgenden wird mit den c-, 1-, mc-, m-Funktionalitäten gearbeitet. Mit diesen Angaben kann man etwas strenger unterscheiden als mit den 1 Angaben im Buch. macht Kunde Funktionalitäten werden auch Beziehungstypen, Kardinalitäten oder Multiplizitäten genannt – viele ..täten! mc Produkt mc Menge m Bestellung 26 mc mit 1 Zahlungsart 2.5 Generalisierung3 Das Prinzip der Generalisierung wird eingesetzt, um eine übersichtlichere und natürlichere Strukturierung der Entity-Typen zu erzielen. Gemeinsame Eigenschaften (Attribute und Beziehungen) ähnlicher EntityTypen werden „herausfaktorisiert“ und einem gemeinsamen Obertyp zugeordnet. 3 12 http://www2.tcs.informatik.uni-muenchen.de/lehre/lehrerausbildung/db_ermodell.pdf c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger Uni Duisburg-Essen Fachgebiet Informationssysteme 2.6 Prof. Dr. N. Fuhr Konsolidierung von Teilschemata oder Sichtenintegration es unterschiedliche Strategien, wobei sich die folgende am engsten an die E-RModellierung hält: Die beteiligten Entity-Typen sind dann Untertypen des jeweiligen Obertyps. Eigenschaften, die nicht • Für jeden Entitätstypen E in der Generalisierungshierarchie gibt es eine allen Untertypen gemeinsam sind, beim entsprechenden Untertyp. Relation mit denbleiben Schlüsselattributen des Obertypen und Wir den verwenden Attributen für die Kennvon E zeichnung die Bezeichnung is-a mit dem Raute-Symbol. Fachgebiet WissMitarbeiter RaumNr Rang is_a UniAngestellter Professor Name PersNr UniAngestellte : {[PersNr, Name, RaumNr]} Professoren : {[PersNr, Rang]} WissMitarbeiter : {[PersNr, Fachgebiet]} Eine Alternative wäre die Überführung des abgeleiteten Entitätstypen E in eine Relation, die als Attribute alle Attribute des Obertypen sowie die Attribute von 2.6 Konsolidierung von Teilschemata oder Sichtenintegration E besitzt. In dieser Variante würden in der Relation des Obertyps nur Instanzen gespeichert, die zu keinem der Subtypen gehören. Bei grösseren Anwendungen ist es nicht praktikabel, den konzeptuellen Entwurf (Ausschnitt der realen UniAngestellte : {[PersNr, Name, RaumNr]} Welt in die DB-Modell übertragen) in einem Guss durchzuführen – sinnvoll ist die Aufteilung in verKonsolidierung, Sichtenintegration Professoren : {[PersNr, Name, RaumNr, Rang]} konzipiert werden. Dabei entstehen schiedene Anwendersichten, welche vorerst unabhängig von einander WissMitarbeiter : {[PersNr, Name, RaumNr, Fachgebiet]} natürlich Modellierungsproblematik Überlagerungen: Zusammenführen von Relationen Sicht 1 Die direkte Überführung wie oben beschrieben liefert oft nicht die bestmöglichen Sicht 5 Relationen. Oft kann man nun noch Relationen zusammenführen. Allgemein globales Schema gilt: Relationen mit dem gleichen Schlüssel kann man zusammenfassen (aber auch Konsolidierung - redundanzfrei Ausschnitt der nur diese). widerspruchsfrei Sicht 2 realen Welt - Synonyme bereinigt Ein binärer Beziehungstyp R zwischen Entitätentypen E und F, an dem minde- Homonyme bereinigt stens einer der beiden beteiligten Entitätstypen (sagen wir E)- mit ... Funktionalität Sicht 4 1 teilnimmt, kann mit der E entsprechenden Relation zusammengeführt werden. Sicht 3 Dazu führt man eine Relation mit folgenden Attributen ein: • die Attribute von E • die Primärschlüsselattribute von F Die nach der Konzeption folgende Konsolidierung bedeutet die Zusammenfassung einzelner Sichten • die Attribute R zu einem globalen Schema, dasderu.Beziehung a. redundanzund widerspruchsfrei ist. Widersprüche können sein: • unterschiedliche Benennung gleicher Sachverhalte (Synonyme) • gleiche Praktikum BenennungDatenbanken unterschiedlicher / DB2Sachverhalte (Homonyme) Seite 3 von 5 3: Relationenschemata, 1. ein Normalform c STEIN 2004-2012 DB:III-96 Woche Conceptual Design • Sachverhalt einmal als Entity-Typ und andermal als Beziehungstyp modelliert (struktureller Widerspruch) • widersprüchliche Funktionalitätsangaben • widersprüchliche Datentypen, widersprüchliche Schlüsselattribute c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 13 3 Das relationale Modell (incl. Algebra) Das relationale Datenmodell stammt aus den siebziger Jahren. Es besteht aus der mengenorientierten Verarbeitung der Daten und ist sehr einfach strukturiert: es gibt im Wesentlichen nur flache Tabellen – Relationen –, in denen die Zeilen den Datenobjekten entsprechen. Die in den Tabellen (Relationen) gespeicherten Daten werden durch entsprechende Operatoren mengenorientiert verknüpft und verarbeitet. 3.1 Relationen Merke: Eine Relation ist das Kreuzprodukt von zwei (oder mehreren) Mengen (A × B). A = {1, 2, 3}; B = {a, b} A × B = {(1, a), (1, b), (2, a), (2, b), (3, a), (3, b)} |A| : Kardinalität von A = Anzahl El. von A |A| = 3; |B| = 2; |A × B| = 6 = 3 · 2 = |A||B| Allgemein: |A1 × A2 × · · · × An | = n Y k=1 |Ak | (a, 1) 6∈ A × B 3.1.1 Binäre Relationen Binäre Relationen bestehen aus zwei Tupeln! R⊂A×B Eine Relation in einer Menge A ist eine Teilmenge von A × A = A2 Beispiel 3: Menge aller Teilmengen einer Relation Wie viele Relationen gibt es in einer endlichen Menge A? 2 Lösung: 2|A| (Potenzmenge) 14 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 3.1 Relationen Beispiel 4: Relation zweiter Punkte mittels gerichtetem Graphen Sei A = {1, 2, 3, 4} und R = {(a, b)|a, b ∈ A ∧ a|b}, d.h die Menge der Paare (a,b) für die gilt: a|b. Stellen Sie die Relation durch einen gerichteten Graphen dar. Lösung: R = {(1, 1), (1, 2), (1, 3), (1, 4), (2, 2), (2, 4), (3, 3), (4, 4)} 1 2 3 4 gerichtete Knoten und gerichtete Kanten ⇒ gerichteter Graph gerichtete Kante von a nach b falls a|b Beispiel 5: Relationen in Z Betrachte folgende Relationen auf der Menge der ganzen Zahlen Z. R1 = {(a, b)|a, b ∈ Z ∧ a ≤ b} R2 = {(a, b)|a, b ∈ Z ∧ (a = b ∨ a = −b)} R3 = {(a, b)|a, b ∈ Z ∧ a = b + 1} Z R1 (reflexiv, transitiv) R2 (reflexiv, symmetrisch, transitiv) R3 Z Z × Z = Z2 3.1.2 Unterschiede und Gemeinsamkeiten zu Funktionen • f (x) von einer Menge A nach einer Menge B ordnet jedem x ∈ A genau ein Element y = f (x) ∈ B zu. • Jede Funktion f : A → B ist eine Relation aber nicht jede Relation eine Funktion. c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 15 3.2 Eigenschaften von Relationen B G(f ): Graph von f ist eine f (a) = b (a, f (a)) Rel. weil Teilmenge A von A × B ∈A ∈B 3.2 Eigenschaften von Relationen • Die Relation R auf A heisst reflexiv, falls ∀x ∈ A((x, x) ∈ R). Nur R1 und R2 des vorherigen Beispieles sind reflexiv. Reflexivität im gerichteten Graph ist ersichtlich indem jeder Punkt auf sich selber zeigt. • Die Relation R auf A heisst symmetrisch, falls ∀x, y ∈ A((x, y) ∈ R → (y, x) ∈ R). • Die Relation R auf A heisst transitiv, falls ∀x, y, z ∈ A((x, y) ∈ R ∧ (y, z) ∈ R → (x, z) ∈ R). Falls es einen Weg von x nach y und von y nach z gibt, dann gibt es auch einen von x nach z. x (x, y) ∈ R a (x, z) ∈ R b y z (y, z) ∈ R A c 3.3 Kombination und Zusammensetzung von Relationen Merke: Da Relationen R1 und R2 von A nach B beides Teilmengen von A × B sind, ist die Vereinigung R1 ∪ R2 , der Durchschnitt R1 ∩ R2 und die Differenzen R1 \R2 , R2 \R1 , sowie das Komplement R1 wohl definiert. Zusammensetzung von Relationen. Ist R eine Relation von der Menge A in die Menge B und ist S eine Relation von B nach C; dann ist die Zusammensetzung von R und S die Relation. S ◦ R = {(a, c) ∈ A × C|∃b ∈ B((a, b) ∈ R ∧ (b, c) ∈ S)} Beispiel 6: Zusammensetzung von Relationen Was ist die Zusammensetzung S ◦ R der Relationen R und S wobei R eine Relation von A = {a, b, c} nach B = {a, b, c, d} mit R = {(a, a), (a, d), (b, c), (c, a), (c, d)} ist und S eine Relation von B nach C = {z, a, b} mit S = {(a, z), (b, z), (c, a), (c, b), (d, a)}? 16 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 3.4 A Darstellung von Relationen durch Matrizen C B a R a S z b a b c c b d S ◦ R = {(a, z), (a, a), (b, a), (b, b), (c, z), (c, a)} Potenzen Rn , n = 1, 2, 3 . . . einer Relation R in A werden rekursiv wie folgt definiert: R1 = R und Rn = Rn−1 ◦ R. Potenz einer Relation. A a A a A a A a b b b b c c c c d d d d R R2 = {(a, a), (b, a), (c, a), (d, b)} R3 = {(a, a), (b, a), (c, a), (d, a)} = R4 = R5 = R6 = Rn Eine Relation R ist genau dann tranisitiv, falls: ∀n ∈ N+ (Rn ⊂ R) 3.4 Darstellung von Relationen durch Matrizen Definition Ist R eine Relation von A = a1 , a2 , . . . , am nach B = b1 , b2 , . . . , bn , dann stellt die Matrix Mr = [mij ] mit ( 1, falls(ai , bj ) ∈ R mij 0, falls(ai , bj ) 6∈ R Beispiel 7: Darstellung von Relationen durch Matrizen (I) Sei A = {1, 2, 3} und B = {1, 2} und R die Relation, die (a, b) enthält, falls a > b. Wie lautet dann die zugehörige Matrix MR ? c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 17 3.5 Äquivalenzrelationen und -klassen Allgemein: b2 . . . bj .. a1 . .. a2 . .. .. . . ai . . . . . . . . . mij an b1 bn Zur Aufgabe: A/B 1 2 1 0 0 2 1 0 3 1 1 Beispiel 8: Darstellung von Relationen durch Matrizen (II) Stellen Sie die Relation R = {(2, 2), (2, 3), (2, 4), (3, 2), (3, 3), (3, 4)} mit R = 1, . . . , 4 in einer Matrix dar. Stellen Sie auch R2 (welches oben berechnet wurde) mit Hilfe einer Matrix dar. 0 0 0 0 0 1 1 1 MR = 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 MR2 = MR◦R = MR MR = 0 1 1 1 0 0 0 0 3.5 Äquivalenzrelationen und -klassen Definition Eine Relation R auf einer Menge A heisst Äquivalenzrelation falls sie reflexiv, symmetrisch und transitiv ist. Beispiel: Wir definieren auf der Menge der Zeichenketten des Alphabets die Relation R = {(a, b)|l(a) = l(b)}, wobei die Länge der Zeichenkette a mit l(a) bezeichnet wird. Zeige, dass R eine Äquivalenzrelation ist und bestimme die Äquivalenzklassen. Reflexiv: Ja!; Symmetrisch: Ja! l(x) = l(y) ⇔ (x, y) ∈ R l(y) = l(x) ⇔ (y, x) ∈ R Transitiv: (x, y) ∈ R ⇔ l(x) = l(y) ∧ (y, z) ∈ R ⇔ l(y) = r(z) ⇔ l(x) = l(z) ⇔ l(x, z) ∈ R 18 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 3.6 n− stellige Relationen Beispiel 9: Kongruenz modulo m Eine sehr wichtige Relation, welche in der Kryptographie Anwendung findet, ist die Kongruenz modulo m welche für m ∈ N\{0, 1} definiert ist durch: R = {(a, b)|a ≡ b(modm)} Das Kongruenzmodul ist reflexiv, symmetrisch und transitiv. 3.6 n− stellige Relationen Definition Eine n−stellige Relation R auf den Mengen A1 , A2 , · · · , An ist eine Teilmenge des Kreuzprodukts A1 × A2 × · · · × An , d.h R ⊂ A1 × A1 × · · · × An 3.7 Operationen Relationenkalkül ist eine formale Sprache, die definiert, welche Daten man erhalten will – nicht aber wie man sie erhält. SQL ist prozedural orientiert und ist bereits weniger deklarativ als der Relationenkalkül. Beide Sprachen sind abgeschlossen, d.h. die Ergebnisse der Anfragen sind wieder Relationen: Dies ermöglicht die beliebige Verkettung der betrachteten Operationen! 3.8 Typ-kompatible Relationen Definition Zwei Relationen R und S heissen typ-kompatibel, wenn R und S Teilmengen des selben Kreuzproduktes M1 × M2 × · · · × Mn von Mengen Mi (i = 1, 2, . . . , n) sind. Zwei Symmetrieklassen (also Äquivalenzklassen) von Relationen [R] und [S] heissen typ-kompatibel, wenn Relationen R0 [R] und S 0 ∈ [S] derart existieren, dass R0 typ-kompatibel zu S 0 ist. Kurz: Die Relationen besitzen das selbe Schema: sch(R) = sch(S) {R.A1 , R.A2 , . . . R.An } = {S.A1 , S.A2 , . . . , S.An } (Die Reihenfolge spielt keine Rolle!) c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 19 3.8 Typ-kompatible Relationen 3.8.1 Vereinigung ∪ Man schreibt R ∪ S. Das Schema der Vereinigung ist gleich dem Schema der beiden Relationen. sch(R) = sch(S) = sch(R ∪ S) A B 3.8.2 Durchschnitt ∩ Der Durchschnitt wird nicht benötigt, da R ∩ S = R\(R\S) = S\(S\R). A B 3.8.3 Differenz \ Die Differenz ist die Menge ohne die Schnittmenge einer anderen Menge. Lies: A ohne B A B 3.8.4 Kreuzprodukt × Das Kreuzprodukt zweier n- und m-stelliger Relationen R und S ist wieder eine Relation, welche das Schema sch(R) ∪ sch(S) besitzt. Dieses besitzt (n + m)-Tupel, wobei die ersten n Komponenten aus R und die letzten m Komponenten aus S stammen. Die Anzahl Zeilen beläuft sich auf |R| · |S| Zeilen. 3.8.5 Selektion σ Die Selektion σF (R) wählt diejenigen Tupel der Relationen R aus, d.h. selektiert sie, die das Selektionsprädikat F erfüllen. Der Selektionsoperator kann eine arithmetische Operation sein und ist ein unärer Operator! σAlter > 80 (Personen) 20 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 3.8 Typ-kompatible Relationen 3.8.6 Projektion Π Die Projektion ΠA (R) wählt die jenigen Attribute der Relation R aus, die in der Menge der Attributnamen A aufgeführt sind. Die Projektion filtert Zeilen (Tupel) heraus. ΠVorname, Name (Personen) 3.8.7 Umbenennung ρ Umbenennung Relation: ρS (R) Umbenennung Attribut: ρA1,new ←A1,old (R) = ρA1,old →A1,new (R) 3.8.8 Verbund ./ Aus zwei Relationen wird einen neue Relation. Jp (R, S) = R ./p S R ./a,b S = Πa,b,c,d (σR.a=S.a∧R.b=S.b (R × S)) Verbundarten Kreuzverbund Kartesisches Produkt der beiden Verbundrelationen. Θ - Verbund Bedingter Verbund R ./R.x<S.y S Equivalenz-Verbund Wie Θ-Join, nur muss die Bedingung eine Äquivalenz darstellen: R ./R.x=S.y S Natürlicher Verbund Wie Equi-Join, nur muss die Äquivalenz auf dem „gleichen“ Attribut sein: R ./ S = R ./R.x=S.x S 3.8.9 Division ÷ Die Division ist die Umkehrung des Kreuzprodukts. Wir berechnen S÷T. S T sno pno pno s1 s1 s1 s1 s2 s2 s3 s4 s4 p1 p2 p3 p4 p1 p2 p2 p3 p4 p2 p4 sno: Supplier Number; pno: Partnumber S = Lieferanten liefern Teile mit Teilenummer T = Teile (mit Nummern), die uns interessieren c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 21 3.8 Typ-kompatible Relationen Beispiel 10: Division – Welcher Lieferant kann ALLE (beide) Teilchen aus Tabelle T liefern? Lösung: S ÷ T Folgende „Zwischenschritte“ sind zur Bestimmung nötig: 1. Nur Lieferanten auflisten, welche Teile liefern: Πsno (S) sno s1 s2 s3 s4 2. Kreuzprodukt bilden. Damit sind in dieser neuen Menge alle möglichen Kombinationen zwischen Lieferanten, die Teile liefern, dargestellt (Diese Lieferanten liefern diese Teile). Πsno (S)×T sno pno s1 s1 s2 s2 s3 s3 s4 s4 p2 p4 p2 p4 p2 p4 p2 p4 3. Vom Kreuzprodukt die «Urmenge» S extrahieren. Nun bleiben jene Lieferanten und Teile übrig, welche NICHT in der «Urmenge» S enthalten waren (links), d.h. die TEILE NICHT LIEFERN konnten. Daraus sind für uns nur die Lieferanten von Interesse (rechts): (Πsno (S) × T )\S sno pno s2 s3 s4 p4 p4 p2 Πsno ((Πsno (S) × T )\S sno s2 s3 s4 4. Diese Menge («Teilenichtlieferer») ziehen wir von der Lieferantenliste (Schritt 1) nun wieder ab und somit bleiben jene Lieferer zurück, die also alle Teile liefern konnten: Πsno (S)\Πsno ((Πsno (S) × T )\S) = S ÷ T sno s1 22 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 3.9 Transformationsregeln 3.9 Transformationsregeln [S. 244/45] Join, Vereinigung, Schnitt und Kreuzprodukt sind kommutativ und assoziativ: R1 ./ R2 = R2 ./ R1 R1 ∪ R2 = R2 ∪ R1 R1 ∩ R2 = R2 ∩ R1 R1 × R2 = R2 × R1 R1 ./ (R2 ./ R3 ) = (R1 ./ R2 ) ./ R3 ) R1 ∪ (R2 ∪ R3 ) = (R1 ∪ R2 ) ∪ R3 ) R1 ∩ (R2 ∩ R3 ) = (R1 ∩ R2 ) ∩ R3 ) R1 × (R2 × R3 ) = (R1 × R2 ) × R3 ) Konjunktionen können aufgebrochen und nacheinander als Selektionen ausgeführt werden (auch umgek.): σp1 ∧p2 ∧···∧pn = σp1 (σp2 (. . . (σpn (R)) . . . )) Selektion kann an einer Projektion „vorbeigeschoben“ werden falls keine Attribut aus der Selektion entfernt werden: Πl (σp R)) = σp (Πl (R)) falls attr(p) ⊆ l Selektionen können an Joinop. oder Kreuzprodukten „vorbeigeschoben“ werden falls zum Join nur ein Attribut verwendet: σp1 (R1 ./ R2 ) = σp1 (R1 ) ./ R2 Selektionen und Kreuzprodukten als Equi-Join: σR1 .A1 =R2 .A2 (R1 × R2 ) = R1 ./R1 .A1 =R2 .A2 R2 3.9.1 Übersicht Relationenalgebra π, σ, ×, , ∪, −, ∩, ÷, , , π A2 A1 ↑ πA2 ,A3 ↑ R A2 A3 A4 , ,... σ A1 A3 , A1 A2 A2 ↑ σΦ ↑ R × A3 A4 A3 A4 R.A1 σto=from (Connection) S.B1 S.B2 R.A1 R.A2 ↑ × A1 πloc (Airport) R.A2 ... R ↑ B1 S B2 A1 Airport × Connection Airport c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger S.B2 R.A2 =S.B1 # $ A2 S.B1 R # $ A2 B1 code=from S B2 Connection 23 4 Relationale Anfragesprachen (SQL) Entität E1 hat eine 1 oder c Beziehung zur Entität E2 → Der Verweis basiert auf Primärschlüssel von Tabelle (E2) und wird in Tabelle (E1) als Fremdschlüssel bezeichnet. 1:1 oder 1:c-Beziehungen in SQL modellieren • Ist auf beiden Seiten einer Beziehung der Beziehungstyp 1 oder c: so bekommt entweder Tabelle (E1) oder Tabelle (E2) den Fremdschlüssel → keine Join-Tables erstellen! • Achten Sie auf möglichst wenig NULL-Werte (undefiniert)! 4.1 Einfache Datendefinition in SQL • • • • • • • character (n), char (n) character varying (n), varchar (n) numeric (p,s) [p = Anzahl Stellen, s = Nachkommastellen], integer blob oder raw für sehr große binäre Daten clob für sehr große String-Attribute date für Datumsangaben xml für XML-Dokumente Anlegen von Tabelle 4.1.1 Online-Ressource (Link) http://www.1keydata.com/de/sql/ 1 2 3 4 5 4.1.2 Anlegen von Tabellen create table Professoren( PersNr integer not null, Name varchar (30) not null, Rang character (2) ); 4.1.3 Referenzielle Integrität in SQL4 In Bezug auf Datenbanken werden Zustände als konsistent bezeichnet, wenn sie die Integritätsbedingungen erfüllen. Integritätsbedingungen beschreiben Annahmen, die über die Daten getroffen werden, beispielsweise ein bestimmter Datentyp, ein Wertebereich oder eine Abhängigkeitsbeziehung zwischen zwei Objekten. 4 siehe auch Kapitel 5.1 24 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 4.1 Einfache Datendefinition in SQL Relationale Datenbanksysteme bieten die Möglichkeit, bei der Definition eines relationalen Schemas Integritätsbedingungen zu formulieren, deren Einhaltung von dem System garantiert wird. Ein typisches Beispiel für Integritätsbedingungen sind Schlüssel- und Fremdschlüsselbeziehungen: • Kandidatenschlüssel: unique • Primärschlüssel: primary key, dessen Attribute autom. mit NOT NULL spezifiziert werden • Fremdschlüssel: foreign key mit references-Angabe Werden Indizes angelegt, so garantieren diese die Einhaltung der referentiellen Integrität (vgl. zwei Tabellen, die sich referenzieren, z.B. Person (key: ID), Adresse (key: ID)). Dabei werden Indextabellen angelegt, welche die entsprechenden zusammengehörenden Tupel „gruppieren“ – und dadurch den Datenzugriff erheblich beschleunigen können (siehe Kapitel 7.2ff.). Es lässt sich spezifizieren, auf welche Art die Einhaltung gewährleistet bzw. wie auf Änderungen reagiert werden soll. Eine Änderung, die eine Integritätsbedingung verletzt, kann entweder ganz unterbunden werden oder aber weitere Änderungen zur Wiederherstellung der Integrität nach sich ziehen. Beispiel 11: Eine neue Tabelle erstellen mit Fremdschlüsselbeziehung REFERENCES 1 2 3 4 5 6 7 8 9 10 create table Vorlesung( VorlNr int [ identity /* MSSQL */ | auto_increment /* MySQL */ ] primary key, /*...*/ ); create table Pruefungen ( P_Id int identity primary key, VorlNr int not null references Vorlesung -- referenziert die Tabelle ’ Vorlesung’ (Fremdschluessel) [ ON DELETE | ON UPDATE ] [ CASCADE | SET NULL | NO ACTION ] ); • ON DELETE CASCADE = beim Löschen des Referenz-Datensatzes wird der davon abhängige Datensatz in dieser Tabelle (Fremdschlüssel mit REFERENCES-Klausel) ebenso gelöscht. Dies kann nur bei einem Fremdschlüssel ausgelöst werden, nicht aber bei einem Primärschlüssel. • ON DELETE SET NULL = beim Löschen des Referenz-Datensatzes wird in der Tabelle das Feld des Fremdschlüssels mit NULL überschrieben und damit die Referenz auf den Fremddatensatz gelöscht. • ON DELETE NO ACTION = verhindert, dass ein referenzierter Datensatz beim Löschen auch aus der Referenz-Tabelle gelöscht wird (d.h. der entsprechende Datensatz in der Referenz-Tabelle kann erst gelöscht werden, wenn es keine Referenzen mehr auf ihn gibt). Beispiel 12: Mehrere Tabellen mit Fremdschlüsseln erstellen c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 25 4.2 1 2 3 4 5 Veränderungen am Datenbestand create table Studenten( MatrNr integer primary key, Name varchar(30) not null, Semester integer check Semester between 1 and 13 ), 6 7 8 9 10 11 12 create table Professoren( PersNr integer primary key, Name varchar(30) not null, Rang character(2) check (Rang in (’C2’, ’C3’, ’C4’)), Raum integer unique ); 13 14 15 16 17 18 create table hoeren( MatrNr integer references Studenten on delete cascade, VorlNr integer references Vorlesungen on delete cascade, primary key(MatrNr, VorlNr) ); 19 20 21 22 23 24 create table voraussetzen( Vorgaenger integer references Vorlesungen on delete cascade, Nachfolger integer references Vorlesungen on delete cascade, primary key(Vorgaenger, Nachfolger) ); 4.2 Veränderungen am Datenbestand Beispiel 13: Löschen von Tupeln (DELETE) 1 DELETE FROM Studenten WHERE Semester > 13; Beispiel 14: Verändern von Tupeln (UPDATE) 1 2 UPDATE Studenten SET Semester= Semester + 1; SELECT DISTINCT Rang FROM Professoren; 4.3 Anfragen über mehrere Relationen Beispiel 16: Welcher Professor liest "Mäeutik"? (WHERE ...AND) Q In der relationalen Algebra: Name, Titel (σPersNr = gelesenVon V Titel = ’Mäeutik’ (Professoren × Vorlesungen)) 26 Beispiel 15: Duplikateliminierung beim Auslesen (SELECT DISTINCT) 1 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 4.4 1 2 3 Aggregatfunktionen und Gruppierung SELECT Name, Titel FROM Professoren, Vorlesungen WHERE PersNr = gelesenVon AND Titel = ’Maeeutik’ ; Beispiel 17: JOIN und COUNT 1 2 3 4 5 -- Vorlesungen des jeweiligen Studenten, \dabei. SELECT s.Name as Student, v.Titel as Vorlesung FROM Studenten s INNER JOIN hoeren h ON s.MatrNr = h.MatrNr INNER JOIN Vorlesungen v ON h.VorlNr = v.VorlNr; 6 7 8 9 10 11 -- Anzahl Vorlesungen pro Student, \dabei. SELECT s.Name as Student, COUNT(*) as Vorlesungen FROM Studenten s INNER JOIN hoeren h ON s.MatrNr = h.MatrNr GROUP BY s.Name; 4.4 Aggregatfunktionen und Gruppierung Abfragen werden sehr häufig gruppiert, weil nicht nur einzelne Informationen, sondern auch Zusammenfassungen bzw. Auswertungen gewünscht werden. Diese Funktion übernehmen die Aggregatfunktionen. ACHTUNG: alle in der SELECT-Klausel aufgefuehrten Attribute (ausser die aggregierten) müssen auch in der GROUP BY-Klausel aufgefuehrt werden. Beispiel 18: Aggregatfunktionen AVG, SUM, GROUP BY 1 2 SELECT AVG (Semester) FROM Studenten; 3 4 5 6 7 -- PRO GRUPPE werden die Semesterwochenstunden aufsummiert SELECT gelesenVon, SUM (SWS) FROM Vorlesungen GROUP BY gelesenVon; Beispiel 19: Ergebnis durch Bedingungen mittels HAVING einschränken 1 2 3 4 5 SELECT gelesenVon, Name, SUM (SWS) FROM Vorlesungen, Professoren WHERE gelesenVon = PersNr and Rang = ’C4’ GROUP BY gelesenVon, Name HAVING AVG (SWS) >= 3; HAVING ist eine Bedingung, die auf aggregierte Werte angewendet werden kann. Der Befehl dient dazu, nicht alle Ergebnisse der Auswahl in die Ausgabe zu übernehmen, sondern nur diejenigen, die c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 27 4.5 Geschachtelte Anfrage den zusätzlichen Bedingungen entsprechen. Die WHERE Bedingung kann nämlich auf gruppierte Werte (GROUP BY) nicht angewendet werden. 4.5 Geschachtelte Anfrage 1 2 3 4 SELECT PersNr, Name, ( SELECT SUM (SWS) FROM Vorlesungen WHERE gelesenVon=PersNr ) AS Lehrbelastung FROM Professoren; 4.6 Verwertung der Ergebnismenge einer Unteranfrage Beispiel 20: Verschachtelte SELECT-Abfragen 1 2 3 4 5 6 7 8 -- ACHTUNG: Das innere SELECT-Statement muss immer komplett ausfuehrbar sein! Es beinhaltet die eigentliche Abfrage. SELECT tmp.MatrNr, tmp.Name, tmp.VorlAnzahl FROM ( -- inneres SELECT-Statement definieren und als ’tmp’ festhalten: SELECT s.MatrNr, s.Name, count(*) AS VorlAnzahl FROM Studenten s, hoeren h WHERE s.MatrNr=h.MatrNr GROUP BY s.MatrNr, s.Name) tmp WHERE tmp.VorlAnzahl > 2; -- best. Tupel aus innerer Abfrage auswaehlen Beispiel 21: Existenzquantor (NOT) EXISTS (NOT) EXISTS stellt eine Abfrage in Beziehung mit einer Unterabfrage (→ Attributverknüpfung) und liefert einen Wert zurück, falls die Unterabfrage mindestens eine Zeile enthält: 1 2 3 4 5 6 SELECT p.Name FROM Professoren p WHERE NOT EXISTS ( SELECT * FROM Vorlesungen v WHERE v.gelesenVon = p.PersNr ); -- Attributverknuepfung wird hier erstellt 4.7 Auswertung bei NULL-Werten Nullwerte = unbekannter Wert. In arithmetischen Ausdrücken werden Nullwerte propagiert, d.h. sobald ein Operand null ist, wird auch das Ergebnis null. Dementsprechend wird z.B. NULL + 1 zu NULL ausgewertet – aber auch NULL * 0 wird zu NULL ausgewertet. Logische Ausdrücke werden nach der boole’schen Logik (Wahrheitstabellen) berechnet. In einer WHEREKlausel wird ein Vergleich auf NULL mit dem IS-Operator umgesetzt: 28 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 4.8 1 Das «case»-Konstrukt SELECT * FROM Studenten WHERE Semester IS null; 4.8 Das «case»-Konstrukt Bei logischen Entscheidungen nach einem CASE-Statement wird immer nur die erste qualifizierende when-Klausel ausgeführt. Beispiel 22: Entscheidungen mittels CASE ...WHEN 1 2 3 4 5 6 7 SELECT MatrNr, ( CASE WHEN Note < WHEN Note < WHEN Note < WHEN Note < ELSE ’nicht END) 1.5 THEN ’sehr gut’ 2.5 THEN ’gut’ 3.5 THEN ’befriedigend’ 4.0 THEN ’ausreichend’ bestanden’ 4.9 JOINs in SQL Um Tabellen sinnvoll miteinander zu verknüpfen (= verbinden, engl. join), wurde die JOIN-Klausel für den SELECT-Befehl mit folgender Syntax eingeführt5 : Beispiel 23: Syntax von JOIN 1 2 3 SELECT <spaltenliste> FROM <haupttabelle> [<join-typ>] JOIN <verknuepfte tabelle> ON <bedingung> SQL kennt folgende JOINs: • cross join Kreuzprodukt • natural join natürlicher Join. Erweiterung des Cross Joins, dabei wird automatisch die Ergebnismenge der beiden Tabellen gefiltert. Diese Einschränkung basiert auf gleichen Spaltennamen. • (inner) join auch Equi-Join genannt, ist eine Verknüpfung innerhalb zweier Tabellen, bei denen als Bedingung die Werte der Verknüpfungs- bzw. Vergleichsspalten immer gleich sein müssen (zu verknüpfende Spaltennamen müssen dazu angegeben werden). Auch als Theta-Join möglich: funktioniert gleich wie vorheriges Beispiel, ausser dass die Bedingungsfelder nicht mehr unbedingt gleich sein müssen sondern auch ungleich sein können. • left, right oder full outer join äusserer Join • union join Vereinigungs-Join 5 http://de.wikibooks.org/wiki/Einführung_in_SQL:_Arbeiten_mit_JOIN (28.04.2013) c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 29 4.10 Rekursion Beispiel 24: mehrere Verknüpfungen direkt hintereinander 1 2 3 4 SELECT <spaltenliste> FROM <haupttabelle> [<join-typ>] JOIN <zusatztabelle1> ON <bedingung1> [<join-typ>] JOIN <zusatztabelle2> ON <bedingung2> [<join-typ>] JOIN <zusatztabelle3> ON <bedingung3> 4.10 Rekursion Grundfrage: «Welche Kurse müssen vor dem Besuch von ’Der Wiener Kreis’ besucht werden?» Beispiel 25: Rekursion (händisch) – oder die direkten Vorgänger von «Der Wiener Kreis» 1 2 3 4 5 6 -- Es kommen die Datensaetze 5041 und 5043 heraus: SELECT v1.Vorgaenger FROM voraussetzen v1, voraussetzen v2, Vorlesungen v WHERE v1.Nachfolger = v2.Vorgaenger -- ’1. Rekursionsebene’ AND v2.Nachfolger = v.VorlNr -- ’2. Rekursionsebene’ AND v.Titel=’Der Wiener Kreis’ → Für n Rekursionsebenen müssen auf diese Weise n Statements gemacht werden. Der Wiener Kreis 5259 Wissenschaftstheorie 5052 Bioethik 5216 Erkenntnistheorie 5043 Ethik 5041 Mäeutik 5049 Grundzüge 5001 4.10.1 Rekursionskonstrukt mittels WITH ... UNION ALL ... SELECT Die optionale WITH-Klausel bildet einen möglichen Start einer SELECT-Anfrage. Mit ihr können temporäre Hilfssichten definiert werden, auf die dann in der Anfrage selber zugegriffen werden kann. Damit sollen Anfragen übersichtlicher, strukturierter gestaltet werden bzw. rekursive Anfragen können programmiert werden. Die tatsächliche Ausformulierung des entsprechenden SELECTs ist allerdings zumindest gewöhnungsbedürftig. Hilfreich ist es, sich an diese Fragen zu halten: 30 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 4.10 Rekursion Vorgehen bei der Formulierung des Rekursionskonstruktes 1. Welche Spalten sollen in meiner Ergebnismenge auftauchen und/oder werden für die Rekursionsbedingung benötigt ? 2. Wie lautet der SELECT für den Satz, von dem die Rekursion ausgehen soll ? 3. Wie lautet die Rekursionsbedingung ? Statt n Rekursionsebenen händisch durchzulaufen wie im Beispiel 25 gibt es eine elegante Lösung, welche auf dem REKURSIONS-Konstrukt aufbaut. Es beinhaltet die Verbindung UNION ALL ... SELECT: 1 2 3 4 5 6 7 8 -- temporaere Sicht festlegen: WITH common_table ( spaltenliste ) AS ( SELECT ... -- Ursprungsselect UNION ALL -- Rekursionsbeginn SELECT ... -- Rekursionsselect ) -- Ausfuehren der definierten Abfrage: SELECT spaltenliste FROM common_table WHERE ... Beispiel 26: Rekursion über die „tmpTbl“ mittels WITH ... UNION ALL ... SELECT 1 2 3 4 5 6 7 8 9 10 11 12 -- temporaere Sicht tmpTbl mit der WITH-Klausel angelegt (Initialisierung): WITH tmpTbl (vorgaenger, nachfolger, position) AS ( -- URSPRUNGSSELECT: SELECT vorgaenger, nachfolger, 1 FROM voraussetzen WHERE nachfolger = 5259 -- REKURSIONSBEGINN: UNION ALL -- REKURSION Diese Sicht tmpTbl ist rekursiv definiert, da sie selbst in der Definition vorkommt (im 2ten SELECT; dieses wird wiederholt ausgefuehrt, bis sich keine Zusaetze mehr ergeben): SELECT v.vorgaenger,v.nachfolger, tmpTbl.position + 1 FROM voraussetzen v JOIN tmpTbl ON tmpTbl.vorgaenger = v.nachfolger ) -- Aus dieser Sicht werden dann die gewuenschten Tupel extrahiert (das 3te SELECT, das auf tmpTbl basiert). Ausfuehren der Abfrage: SELECT DISTINCT vorgaenger FROM tmpTbl Hier wird dann nun die gesamte Tabelle REKURSIV ausgelesen und der Wert der Position im Falle einer Stufenänderung um 1 erhöht. Der letzte Eintrag erhält dann den höchsten Positions-Wert (allenfalls ist dieser mit einem desc-Order umgekehrt zu sortieren). c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 31 4.11 Veränderungen am Datenbestand 4.11 Veränderungen am Datenbestand Vorgehen: 1. die Kandidaten für die Änderung werden ermittelt und «markiert» 2. die Änderung wird an den in Schritt 1. ermittelten Kandidaten durchgeführt Beispiel 27: Verschachtelte Abfrage mit IN (Mengenabfrage; mindestens ein Wert muss vorliegen) 1 2 3 4 5 DELETE FROM voraussetzen WHERE Vorgaenger IN ( SELECT Nachfolger FROM voraussetzen ); 4.12 Sichten (Views) Sichten sind ein wichtiges Konzept, um eine DBS an die Bedürfnisse unterschiedlicher Benutzergruppen anpassen zu können. Somit zeigen «Sichten» einen definieren Ausschnitt des gesamten Modells. Beispiel 28: Sicht mit zwei Spalten («Name» und «GueteGrad») als Rückgabewert 1 2 3 4 5 6 -- Statistische Sicht: CREATE VIEW PruefGuete(Name, GueteGrad) AS ( SELECT prof.Name, AVG(pruef.Note) FROM Professoren prof JOIN pruefen pruef ON prof.PersNr = pruef.PersNr GROUP BY prof.Name, prof.PersNr HAVING COUNT(*) > 50 ) 4.13 JDBC: Java Database Connectivity Zugriff auf Datenbanken via JDBC: Zugriff auf Datenbanken via JDBC Web-Anbindung von Datenbanken via Servlets/JDBC Browser Internet Webserver VorlesungsVerzeichnis.html Servlet-Engine Servlet VrlVrz Servlet VrlVrz Servlet VrlVrz JDBC (Java Database Conn.) Datenbank © A. Kemper / A. Eickler 73 4.13.1 Schritte in JDBC© A.zur Erstellung einer DB-Abfrage Kemper / A. Eickler 72 1. notwendige/n JDBC-Treiber laden: Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 32 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 4.13 JDBC: Java Database Connectivity 2. Connection aufbauen: Connection conn = DriverManager.getConnection("jdbc:sqlserver:// localhost\dbSchema[:Port];Database=db", "user", "pwd"); 3. Statement-Objekt generieren: Statement stmt = conn.createStatement(); 4. SQL-Anfragen absetzen bzw. ResultSet erzeugen: ResultSet rset = stmt.executeQuery( "SQL-Statement"); 5. Ergebnismenge überprüfen bzw. iterieren: rset.next(); Beispiel 29: kompletter JAVA-Code zur Initialisierung und Auswertung von SQL-Statements 1 2 3 import java.sql.*; import java.io.*; public class ResultSetExample { 4 public static void main(String[] argv) { Statement sql_stmt = null; Connection conn = null; 5 6 7 8 // Verbindungsversuch: try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); conn = DriverManager.getConnection("jdbc:sqlserver://localhost\\ dbSchema[:Port];Database=db", "user", "pwd"); sql_stmt = conn.createStatement(); } catch (Exception e) { System.err.println("Folgender Fehler ist aufgetreten: " + e); System. exit(-1); } // DB-Abfrage ausfuehren und Verbindung schliessen: try { ResultSet rset = sql_stmt.executeQuery( "SELECT avg(Semester) from Studenten"); rset.next(); // Iterator ansetzen und pruefen, ob Ergebnis 9 10 11 12 13 14 15 16 17 18 19 20 21 22 // ACHTUNG: IMMER Objekt als Rueckgabewert --> getDouble(1)! System.out.println("Durchschnittsalter: " + rset.getDouble(1)); rset.close(); } catch(SQLException se) { System.out.println("Error: " + se); } 23 24 25 26 27 28 } 29 30 } c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 33 4.13 JDBC: Java Database Connectivity 4.13.2 Daten einfügen mittels verschiedener Statements executeQuery() executeUpdate() execute() Gewählt beim Auslesen von Datensätzen, d.h. bei SELECT-Statements. Erzeugt ein ResultSet als Rückgabe. Eingesetzt bei Datensatzmodifikationen, z.B. DROP TABLE, DROP DATABASE, INSERT into TABLE, UPDATE TABLE, DELETE from TABLE. Erzeugt einen int-Wert als Rückgabewert, welcher die Anzahl der von der Änderung betroffenen Tupel definiert. Diese Methode dient der generellen Ausführung von SQL-Statements. Erzeug einen boolean-Wert: TRUE signalisiert das Resultat in der Form eines ResultSet. Beispiel 30: JAVA-Code zum Ausführen eines INSERT / UPDATE-Statements Statement stmt = conn.createStatement(); 1 2 // INSERT mit execute: gibt boolean zurueck. boolean isok = stmt.execute("INSERT into Studenten(name, personalNummer) values(’Dagobert’,1532)"); 3 4 5 6 7 // UPDATE mit executeUpdate: gibt int zurueck. int anzahlUpdates = stmt.executeUpdate("UPDATE Studenten SET name = ’ Dagobert’ WHERE personalNummer = 1532"); Beispiel 31: Prepared Statement 1 2 3 4 5 6 7 PreparedStatement stmt; stmt = con.preparedStatement("Insert into Mitarbeit(Mitarbeiter, ..., ..., ...,)" + " values (?, ?, ?, ?)"); stmt.setInt(1, mitarbeiterID); ... stmt.setDate(4, beginDatum); return stmt.execute(); Beispiel 32: Rückgabe der neu generierten ID bei INSERT-Statement Statement stmt = conn.createStatement(); 1 2 // INSERT mit executeUpdate: gibt int zurueck. int n = stmt.execute("INSERT into Studenten(name, personalNummer) values (’Dagobert’,1532)", Statement.RETURN_GENERATED_KEYS); ResultSet rs = stmt.getGeneratedKeys(); // neu generierter Schluessel 3 4 5 34 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 4.13 6 7 JDBC: Java Database Connectivity rs.next(); // Iterator positionieren int genKey = rs.getInt(1); // Wert als int auslesen c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 35 5 Datenintegrität 5.1 Referentielle Integrität6 Die Attributwerte eines Schlüssels identifizieren ein Tupel eindeutig innerhalb einer Relation. Wir reden von einem Fremdschlüssel wenn der Schlüssel einer Relation als Attribut einer in einer anderen Relation vorkommt. Dabei gelten die folgenden Eigenschaften: Referentielle Integrität R und S sind zwei Relationen mit dem Schema R und S, κ ist Primärschlüssel von R. Dann ist α ein Fremdschlüssel in S und es gilt für alle Tupel s ∈ S: 1. s.α enthält entweder nur Nullwerte oder nur Werte ungleich Null. 2. wenn s.α keine Nullwerte enthält, dann existiert ein Tupel r ∈ R mit s.α = r.κ. Die Erfüllung dieser Eigenschaften nennt man referentielle Integrität. 5.2 Datenbank-Trigger Als Trigger (deutsch: „Auslöser“) bezeichnet man in SQL eine Anweisungsfolge (eine Abfolge von Aktionen), die ausgeführt wird, wenn eine verändernde Anweisung auf einer bestimmten Tabelle automatisch vom DBMS ausgeführt werden soll. Ein Trigger ist in folgenden Situationen nützlich: • Werte in einer Zeile einer Tabelle sollen festgelegt werden (wird vor allem benutzt, wenn es keine AutoInc-Spalte gibt). • Werte sollen vor dem Speichern auf ihre Gültigkeit geprüft werden. • Veränderungen in der Datenbank sollen automatisch protokolliert werden. • Die Regeln der referenziellen Integrität sollen mit Hilfe der Fremdschlüssel-Beziehungen überwacht werden. Merke: Man kann Trigger entweder so schreiben, dass sie für jedes zu ändernde Tupel einmal (FOR EACH ROW) oder für jedes verändernde SQL-Statement einmal (FOR EACH STATEMENT, dieser Trigger ist aber nur mit AFTER-Trigger möglicha ) ausgeführt werden. a 6 wird auch aufgerufen, wenn kein Tupel vom DELETE- oder UPDATE-Statement betroffen war siehe auch Kapitel 4.1.3 36 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 5.2 Datenbank-Trigger Beispiel 33: Row-Level Trigger BEFORE UPDATE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 -- CREATE TRIGGER Anweisung mit dem Triggernamen ’name’: CREATE TRIGGER name -- Trigger wird aufgerufen BEVOR (NACHDEM) die Bed. aus der Tabellendef. ueberprueft BEFORE [ AFTER ] update [ insert | delete ] -- Aufruf bei Operation on Professoren -- bezieht sich auf die angegebene Tabelle FOR EACH ROW -- Triggercode fuer jede veraenderte Zeile when (old.Rang is not null) -- Behandlung beginnt hier: BEGIN -- :OLD --> haelt das aktuelle (zu modifizierende) Tupel -- :NEW --> haelt das einzufuegende (neue) Tupel if :OLD.Rang = ’C3’ and :NEW.Rang = ’C2’ then :NEW.Rang := ’C3’; end if; if :old.Rang = ’C4’ then :new.Rang := ’C4’ end if; if :new.Rang is null then :new.Rang := :old.Rang; end if; end Wichtig: der mittels Trigger kontrollierte Tupel wird bei einer COUNT-Abfrage mitgezählt! Dies bedeutet, dass allfällige Zählroutinen dies berücksichtigen müssen. Beispiel 34: Row-Level Trigger AFTER INSERT und Umbenennung der Übergangsvariablen NEW 1 2 3 4 5 6 7 CREATE TRIGGER new_movie AFTER INSERT ON schauspieler REFERENCING NEW AS n -- Uebergangsvariable ’NEW’ umbenennen FOR EACH ROW UPDATE filmeProSchauspieler SET anzahl_filme = anzahl_filme + 1 WHERE n.name = filmeProSchauspieler.name Beispiel 35: Trigger in MS-SQL MS-SQL kennt keine Row-Level Trigger. Ein entsprechendes Statement lautet: 1 2 3 4 5 CREATE TRIGGER name ON [ table | view ] [ FOR | AFTER | INSTEAD OF ] [ INSERT | UPDATE | DELETE ] AS sqlStatement c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 37 5.3 DB-Prozeduren (Stored Procedures) 5.3 DB-Prozeduren (Stored Procedures) DB-Prozeduren sind eine Art von Funktionen. Sie werden vom DBA (oder vom Benutzer) erstellt und genauso wie alle anderen Datenbankobjekte (Tabellen, Views usw.) in einer Datenbank abgelegt. Jede DB-Prozedur beinhaltet sowohl SQL- als auch prozedurale Anweisungen. Jeder DB-Prozedur können Daten als Werteparameter zugewiesen werden. Die Übergabe wird beim Prozeduraufruf durchgeführt. Innerhalb einer DB-Prozedur können SQL-Anweisungen verwendet werden, um Datenwerte einer Datenbank abzufragen bzw. zu modifizieren. Beispiel 36: DB-Prozedur (Stored Procedure) 1 2 3 4 5 CREATE PROCEDURE mkDays(@start date, @anz int) as BEGIN -- Deklaration von Variablen mittels ’@’ declare @i int, @nextDay date select @i=1, @nextDay=@start 6 7 8 9 10 11 12 13 14 15 while (@anz>=@i) begin if (datepart(weekday,@nextDay) in (7,1)) -- Saturday, Sunday insert into kalender(datum, istfrei) values(@nextDay,1) else insert into kalender(datum, istfrei) values(@nextDay,0) select @i = @i + 1, @nextDay=dateadd(day,1,@nextDay) end -- Ende der Schleife end -- Ende der Prozedur GO -- Erstellung forcieren 38 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 6 Relationale Entwurfstheorie 6.1 Funktionale Abhängigkeiten [171ff] Merke: Eine Relation wird durch Attribute oder Attributwerte definiert. Bestimmen einige dieser Attribute bzw. -werte eindeutig die Werte anderer Attribute oder Attributwerte, so spricht man von funktionaler Abhängigkeit. Sie wird oft mit FD (engl. functional dependency) abgekürzt und wie folgt dargestellt: α→β Aus dem Attributwert von A ergibt sich also eindeutig der Attributwert von B. Beispiel 37: Zwei funktionale Abhängigkeiten (PLZ und AHV-Nummer) In der Tabelle „Ort“ sind die Attribute „Ort“ und „Kanton“ funktional abhängig vom Attribut „PLZ“, da jeder Ort mit einer bestimmten PLZ verknüpft ist. Es können nicht zwei verschiedene Orte mit der selben PLZ existieren. Damit wird jeder PLZ eindeutig ein Ort zugewiesen: {PLZ} → {Ort, Kanton} Ort und Kanton sind funktional abhängig von ihrer Postleitzahl. {Ort, Kanton} → {PLZ} Die Postleitzahl ist auch funktional abhängig von Ort und Kanton. {AHV-Nummer} → {Name, Vorname, Geburtsdatum, . . . } Die gleiche AHV-Nummer müsste immer die gleiche Person liefern. . . 6.1.1 Schlüssel Bestimmt eines oder einige Attribute einer Relation eindeutig die Werte aller Attribute der Relation, so spricht man von einem Schlüssel. Jedes Tupel dieser Relation ist damit eindeutig durch die Werte des/der Schlüssel-Attribute(s) bestimmt. 6.2 Normalisierung Die Normalisierung bezweckt die redundanzfreie Speicherung von Informationen innerhalb Tabellen der Datenbasis. Dies wird durch die entsprechende Zuweisung der Attribute zu den einzelnen Tabelle erreicht. 1. Normalform: alle Tabellenattribute weisen nur einfache Attributwerte (keine Dopplungen pro Attribut) auf (auch Nullwerte sind erlaubt). 2. Normalform: Tabelle ist schon in der 1. NF und jedes nicht zum ID-Schlüssel gehörende Attribut ist voll abhängig vom ganzen ID-Schlüssel (und nicht nur von Teilen davon). c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 39 6.3 Normalisierung mit Boyce-Codd (BCNF) [190ff] 3. Normalform: Tabelle ist schon in der 2. NF. Jedes Attribut darf nur vom ID-Schlüssel abhängig sein und daneben existieren untereinander keine weiteren funktionalen Abhängigkeiten! 6.3 Normalisierung mit Boyce-Codd (BCNF) [190ff] Das Ziel der Boyce-Codd Normalform (BCNF) besteht darin, dass Informationseinheiten (Fakten) nicht mehrmals, sondern nur genau einmal gespeichert werden. Eine Tabelle ist in der BCNF, falls für jede funktionale Abhängigkeit α → β gilt: Datenmanagement 1. alle Attribute haben atomare Wertebereiche (d.h. die einzelnen Werte sind z.B. keine Listen, keine Mengen, keine Strukturen) 2. für jede funktionale Abhängigkeit α → β in Tabelle (T) gilt auch: α hat Schlüsseleigenschaft Diskussion-2 Tabelle Vorlesungsanlass Titel, SWS, gelesenVon sind funktional abhängig von VorlNr. VorlNr hat Schlüsseleigenschaft (Primärschlüssel) → Tabelle ist in BCNF. Vorlesung «entartet» zu Vorlesungsanlass, pro Titel sind SWS und gelesenVon identisch (meine Konsequenz bei NICHTERFÜLLUNG BCNF: Normalisierungs-Verfahren. Annahme hier!) -> von Verstoss gegen BCNF Eine Tabelle T, die gegen (2.) verstösst, wird aufgeteilt in 2 Tabellen T1 (T ohne β) und T2 (mit α und β). V 1.1 40 © Hochschule Luzern, Datenmanagement 7 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 7 Physische Datenorganisation 7.1 Hintergrundspeicher Die RAID-Technologie (redundant Array of inexpensive Disks) nutzt aus, dass man anstelle eines einzigen (entsprechend grossen) Laufwerks effizienter mehrere (entsprechend kleinere und billigere) Laufwerke parallel betreiben kann. Dabei arbeiten die verteilten Laufwerke durch einen entsprechenden RAID-Controller nach aussen transparent wie ein einziges logisches Laufwerk. RAID 1: Spiegelung der Daten. Datensicherheit durch Redundanz aller Daten (Engl. mirror). Lastba- lancierung beim Lesen: z.B. kann Block A von der linken oder der rechten Platte gelesen werden. RAID 1:Aufgrund Spiegelung der Redundanz(mirroring) steht nur die Hälfte der «Gesamtspeichermenge» zur Verfügung. A B A B C D C D Datensicherheit: durch Redundanz aller Daten (Engl. mirror) RAIDSpeicherbedarf 5: Striping von Blöcken, Verteilung der Paritätsblöcke. Die Daten werden auf verschiedenen Doppelter Datenspeichern verteilt dieABlöcke E linken – F – G – H). Sogenannte Paritätsblöcke (z.B. Lastbalancierung beim Lesen: z.B.(siehe kann z.B. Block von der oder der rechten Platte gelesen werden PE−H ) speichern eine Prüfsumme (durch XOR-Verknüpfung der einzelnen Bitstrings dazugehö Aber beim Schreiben müssen beideder Kopien geschrieben werden x-y render Blöcke) auf einem verteilten Datenspeicher: Kann aber parallel geschehen Dauert also nicht doppelt so lange wie das Schreiben nur D eines Blocks M RAID 5: Striping von Blöcken, Verteilung der Paritätsblöcke P A E B F © A. Kemper / A. Eickler I M J PM-P C PI-L G N D PE-H G K 7 O PA-D H L P Sobald ein Datenspeicher ausfällt, können die darauf lagernden Daten wieder hergestellt werden, weil sich die Lastbalancierung ursprünglichen Bitstrings der RAID abhängigen Blöcke aufgrund der Paritätsblöcke wieder Bessere als bei 4 rekonstruieren Sofern abereingesetzt zwei Platten defekt sind, sind die betroffenen Daten nicht mehr Wird in derlassen. Praxis häufig rekonstruierbar. Guter Ausgleich zwischen Platzbedarf und Leistungsfähigkeit Datenbankpuffer: Datenmanagement zwischen Haupt- und D M Hintergrundspeicher. G Alle Operationen auf Daten müssen innerhalb des durchgeführt werden. Dabei kann © A. Kemper / A. Hauptspeichers Eickler 8 also nicht direkt auf den Seiten des Hintergrundspeichers gearbeitet werden; ein Datenbankpuffer übernimmt die clevere Verwaltung des Datentransfers zwischen Haupt- (temporäre Speicherung) und Hintergrundspeicher (persistente Speicherung). c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 41 7.2 B-Bäume 7.2 B-Bäume7 Normale Binärbäume sind immer balanciert und wurden als Suchstruktur für den Hauptspeicher konzipiert und lassen sich nicht effektiv als Speicherstruktur auf Seiten des Hintergrundspeichers abbilden. Deshalb braucht es Mehrwegbäume, deren Knoten einer Seite des Hintergrundspeichers entsprechen. Eigenschaften eines B-Baumes Jeder Knoten hat in einer Datensatz-Seite mindestens k und höchstens 2k Einträge. Somit hat der Baum immer eine garantierte Auslastung von ≥ 50% (d.h. es gibt keinen Knoten, der weniger als 50% an Einträgen haben darf): Jeder Eintrag besteht aus Suchschlüssel, Verweis (auf die nächste Seitennummer) und Daten. Die Einträge werden – basierend auf ihrem Wert im Suchschlüssel (bzw. dem Primärschlüssel des Datensatzes) – in einem entsprechenden Knoten versorgt. Jeder Knoten hat also eine Referenz zu einem nächsten Knoten, der wiederum Einträge hält (z.B. im linken Knoten werden Werte, die kleiner sind als der Suchschlüssel des darauf referenzierenden Eintrags abgelegt; im rechten jene, die grösser sind). Dabei können Einträge von Knoten dynamisch und immer wieder umplatziert werden bzw. ihren Knoten wechseln – je nachdem, welche Werte die Suchschlüssel der neu einzufügenden Knoten haben. Da jeder Eintrag nebst Suchschlüssel und Verweis auch alle Daten speichert, kann die benötigte Speichermenge, die dafür in einem Knoten gebraucht wird, sehr gross werden. Jeder Suchschlüssel kommt dabei genau an in einem Eintrag vor. 7 42 siehe auch Weblink: http://wikis.gm.fh-koeln.de/wiki_db/Datenbanken/B-Baum c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 7.3 B+ -Bäume («Clustered Index») 7.3 B+ -Bäume («Clustered Index»)8 Eigenschaften eines B+ -Baumes Der B+ -Baum besteht aus Basisdaten und Indexstruktur. Er ist ein besonderer B-Baum. In einem B+ -Baum wird NUR der Suchschlüssel eines Eintrags gespeichert (vgl. Analogie: Datenstruktur im Telefonbuch [Ort → Name → Eintrag]). Die vollständigen Tabellensätze werden sortiert nach dem Primärschlüssel in den Blattknoten gespeichert (und gehören aber auch zum Baum, siehe Abbildung 3!). Diese Blattknoten bezeichnet man auch als Basisdaten. Innerhalb eines Blattknotens (Block/Page) sind die Sätze (Einträge) physisch sortiert nach dem Primärschlüssel, was sich durch eine entsprechende Verkettung aller Blattknoten ergibt. Zudem besitzt der Knoten einen «internen Schlüssel», welchen man TID, Tupel Identifier, nennt. Der TID ist ein INTERNER ZEIGER in einem DB-System auf eine entsprechende Datensatz-Seite (siehe Abbildung). Verschiebung von einer Seite auf eine andere Bei der nächsten Verschiebung wird der „Forward“ auf Seite 4711 geändert (kein Forward auf Seite 4812) D M G © A. Kemper / A. Eickler 108 Abbildung 2: Tupel Identifier und Pages in B+ -Bäumen Dies ist ein Konzept, welches auch bei variabler Länge der Datensätze (Einträge) ihre Gültigkeit behält: sollten die Datenelemente (Einträge) tatsächlich umgelagert werden müssen (d.h. ein Knoten hat in der Seite keinen Platz mehr), so kann der Tupel auf einen neuen TID zeigen (siehe Grafik rechts in obiger Abbildung). 8 siehe auch Weblink: http://wikis.gm.fh-koeln.de/wiki_db/Datenbanken/B-Plus-Baum c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 43 7.4 B*-Bäume («non-clustered Index») <---------------------Indexstruktur------------------> Basisdaten <-------------------------------------B+-Baum--------------------------------------> Die Zugriffseinheiten von Indexstruktur und Basisdaten sind Blöcke/ Pages (oben blau + und gelb eingefärbt). Die Blöcke der Indexstruktur haben hier 2 bis 4 Einträge, die Blöcke der Basisdaten enthalten jeweils 2 Sätze. Sehr unrealistische Zahlen, aber geeignet für die Visualisierung des Aufbauprinzips. Normalerweise enthalten die Blöcke der Indexstruktur mehrere 100 Einträge – sehr viel mehr als vollständige Sätze in die Blöcke der Basisdaten passen! Die Blöcke der Basisdaten sind hier „in Reihenfolge“ dargestellt – wünschenswert, aber selten. Die logische Reihenfolge ist durch die Verkettung (geknickte Pfeile) sichergestellt. Abbildung 3: Strukturen von B -Bäumen 7.4 B*-Bäume («non-clustered Index») Eigenschaften eines B*-Baumes Datenmanagement: Visualisierung B+- und B*-Baum 2/8 Der B*-Baum besteht nur aus der Indexstruktur. Daher kann es mehrere B*-Bäume für eine Tabelle geben. Ein B*-Baum ermöglicht jeweils schnelle, gezielte Suche anhand von einem Attribut der Tabelle – möglich auch: anhand einer Attributkombination. Die letzte Ebene des B*-Baumes (Blattknoten-Ebene) hat für jeden Datensatz einen Verweis in die Basisdaten – geordnet nach den Attributwerten (im Beispiel nach Kurzname). Die Basisdaten gehören nicht zum B*-Baum (siehe Abbildung 4)! Im B+ -Baum hatten wir zudem eine Einschränkung auf das Primärschlüsselattribut, jetzt kann es ein beliebiges anderes Attribut sein. 44 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 7.5 <--------------------B*-Baum----------------------> Beispiele Basisdaten (s.o.) ( ) Blattknoten-Ebene, ihre Blöcke sind verkettet. Abbildung 4:sind Strukturen Die beiden Bäume Die Blöcke als Zugriffseinheiten wiederzusammen: gelbvon bzw. B*-Bäumen blau gefärbt. Die Blöcke des B*-Baumes haben hier 2 bis 3 Einträge – wieder sehr unrealistisch, normalerweise (weit) über 100! Die Verkettung der Basisdaten ist hier nicht gezeigt (irrelevant). Es ist auch nicht ausgeführt, dass jeder Satz referenziert wird, jeder Block der Basisdaten also mehrmals referenziert wird, wenn er mehrere Sätze enthält. Eine entsprechende Darstellung würde zu einem Pfeilwirrwarr (Durcheinander) führen. Aber die Blattknoten-Ebene enthält genau so viele Einträge wie es Sätze in den Basisdaten gibt (hier 22). Datenmanagement: Visualisierung B+- und B*-Baum 4/8 Abbildung 5: Vergleich von von B+ und B*-Bäumen 7.5 Beispiele Beispiel 38: Sequentielle Suche im B-Baum Wie viele Indexblöcke müssen sequentiell durchsucht werden bei einer Suche nach Name? Wir kennen folgende Angaben: – Anzahl Datensätze = 106 – Bytes pro Datensatz = 256 – Grösse eines Indexblocks = 4 KB Datenmanagement: Visualisierung B+- und B*-Baum 5/8 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 45 7.5 Beispiele Es folgt daraus: Anzahl = Anzahl DS · Bytes/DS Blockgrösse = 106 · 256 Bytes/Datensatz 4KB = 620 500 Beispiel 39: Höhe eines im B∗ -Baumes bei einer Suche Wie hoch muss ein B∗ -Baum sein bei einer Suche nach Name? Wir kennen folgende Angaben: – Anzahl Datensätze = 106 – Grösse eines Indexblocks = 4 KB – Länge eines Namens = 20 B – Länge der Verweise im Indexblock = 4 B – Total Länge pro Index = 20B + 4B = 24B – Füllgrad Indexblock (Annahme): 80% Es folgt daraus: Einträge Indexblock = 4KB 24B · 8 10 = 136 Die Höhe des B∗ -Baumes ergibt sich aus dem Umstand, dass 136 × 136 × 136 = 1363 ≥ 106 . Somit lässt sich sagen, dass der Baum eine Höhe von k = 3 haben muss, da k = 2 < log136 (106 ) < 3 . Allgemein: Höhe = logAnzahl Einträge pro Block (Anzahl Datensätze) . Beispiel 40: Anzahl der Blockzugriffe in einem B*-Baum Wir rechnen mit den Angaben aus dem vorherigen Beispiel: Anzahl Blockzugriffe = Baumhöhe + Zusätzlicher Block für den vollständigen Satz = 3 + 1 = 4. Allgemein: Anzahl Blockzugriffe = Baumhöhe + Zusätzlicher Block für den vollständigen Satz . Beispiel 41: Anzahl der nötigen Blöcke in einem B*-Baum (mit Verweisen) Wir kennen folgende Angaben: – Anzahl Aufträge in der DB (Datensätze) = 106 – durchschnittliche Einträge pro Tag = 100 – Grösse eines Indexblocks = 1 KB – Länge eines Datums = 8 B – Länge der Verweise im Indexblock = 4 B – Total Länge pro Index = 8B + 4B = 12B – Füllgrad Indexblock (Annahme): 80% Einträge Indexblock = 1KB 12B · 8 10 = 67 Höhe = log67 (1’000’000) = 4 46 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 7.6 Die Verweise auf 100 Einträge passen in 100 67 Statisches Hashing = 2 Blöcke. Gesamtblockzahl = Anzahl versch. Blöcke + Baumhöhe + Anzahl Verweise = 100 + 4 + 2 = 106. Allgemein: Gesamtblockzahl mit Verweisen = Anzahl versch. Blöcke + Baumhöhe + Anzahl Verweise . 7.6 Statisches Hashing Beim Hashing wird mit Hilfe einer Hashfunktion der Schlüssel auf einen Behälter („Bucket“) abgebildet, der die dem Schlüssel zugehörigen Daten enthält. Formal: h : S → B, wobei S eine beliebig grosse Schlüsselmenge und B eine Anzahl an Behältern im Intervall [0 . . . n ist. Ein paar wichtige Begriffe (aus http://www.informatik.uni-jena.de/dbis/lehre/ws2010/ dbsem/Ausarbeitungen/a_StatischesHashing.pdf): Hashwert Ist das Ergebnis der jeweiligen Hashfunktion. Hashtabelle Ist eine Symboltabelle, die mit den Hashwerten indiziert ist. Kollision Tritt auf, wenn ein Paar von Schlüsseln den gleichen Hashwert besitzt. Das bedeutet: h(k) = h(k 0 ), selbst wenn k 6= k 0 . k und k 0 sind dann Synonyme und befinden sich in einer Kollisionsklasse. Kollisionsauflösung Wird auch Überlaufbehandlung genannt. Hier geht es um Verfahren zur Vermeidung von Kollisionen. Eine Methode für die Wahl einer Hashfunktion ist die Divisionsrestmethode – auch Restklassenbildung genannt. Mittels der Formel h(k) = k mod m werden hier die Hashwerte berechnet. Dabei ist k ein Schlüssel aus dem Schlüsselraum K und m istStatisches gegeben. Meist wird m als Primzahl gewählt, die nicht nah Hashing an einer Zweierpotenz liegt. Wäre m eine Zweierpotenz, dann würden in Bitdarstellung nur die niederen Divisionsrestverfahren mit der Faltungsmethode und erhöht dadurch die (log m) Bits von k betrachtet, was verhindert werden soll. Gleichverteilungseigenschaften. Andere Methoden sind das Multiplikationsverfahren, die Basistransformation oder die schon genannte Faltung. Abbildung 2: Divisionsrestmethode Besonders dann,4.1 wenn eine konkrete Perfektes HashingSchlüsselverteilung vorher nicht bekannt ist, wird das Divisionsrestverfahren empfohlen. Beim Perfekten Hashing [4] ist die Anzahl der zu hashenden Schlüssel vorab bekannt. Dies tritt z.B. bei einer Liste von Schlüsselwörtern einer Programmiersprache oder bei Namen von Methoden eines Objektes auf. Hier kann man die Hashfunktion vorher dementsprechend anpassen um eine optimale Verteilung bei der Speicherung der Datensätze zu sichern. Kollisionen der Hashwerte werden so gänzlich vermieden. c The Software Bakery | BrunoHashing Leupi, Tobias Edy Wermelinger Für perfektes [OW02]Maestrini, ordnet man einfach alle Schlüssel lexikographisch und bildet jeden einzelnen Schlüssel auf eine Ordnungsnummer ab (laufende Nummer als Primärschlüssel). 47 7.6 Statisches Hashing 7.6.1 Vorteile dabei werden die Restklassen definiert und die entsprechenden Schlüssel in der zugehörigen «RestklassenSchublade» (Bucket) referenziert. Bei einer Suche bzw. Vergleichen muss dann nur der entsprechende Bucket verglichen, statt die gesamte Tabelle durchforstet werden. 7.6.2 Nachteile Das Verfahren ist grundsätzlich eher problematisch, da die Verteilung auf die Restklassen nie eine Gleichverteilung der Datensätze ergibt (aufgrund von Löschvorgängen entstehen Lücken in den Primärschlüsseln, welche dann ungleich verteilt sein könnten – wie man in der Grafik sofort sieht): Statisches Hashing D M G © A. Kemper / A. Eickler 114 Beispiel 42: Berechnung der Restklassen bei Statischem Hashing Wieviele Restklassen werden benötigt? Wir kennen folgende Angaben: – Anzahl Datensätze = 106 – Grösse eines Blocks = 4 KB – Anzahl Sätze pro Block = 8 48 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 7.6 Man sieht sofort: Anzahl Blöcke = 106 8 Statisches Hashing = 1250 000 Damit haben wir den Divisor berechnet und können die Hashtabelle mod(1250 000) führen. c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 49 8 Anfragebearbeitung / -Optimierung Ein Optimierung wird wie in Abbildung 6 ausgeführt: Deklarative Anfrage Scanner Parser Sichtenauflösung Algebraischer Ausdruck AnfrageOptimierer Auswertungsplan (QEP) Codeerzeugung Ausführung Abbildung 6: Ablauf einer Anfrageoptimierung 8.1 Logische Optimierung Eine SQL-Anfrage erfolgt i.d.R. immer nach dem Muster: SELECT ...FROM ...WHERE ... Beispiel 43: SQL-Select und optimierte relationale Algebra (ohne Baum) SQL: SELECT Titel FROM Professoren, Vorlesungen WHERE Name = ’Popper’ and PersNr = gelesenVon; Relational: ΠTitel (σName = ’Popper’∧PersNr = gelesenVon (Professoren × Vorlesungen)) optimiert: ΠTitel (σPersNr = gelesenVon (σName = ’Popper’ (Professoren) × Vorlesungen)) Merke: Im ersten Schritt wird eine logische Optimierung durchgeführt. Grundsätzlich werden hierbei die Daten möglichst früh möglichst klein gemacht (σ möglichst nahe zu den Blättern). Achtung!: Π nicht direkt nach Blatt, Ansonsten gehen die B+-Strukturen verloren! 50 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 8.1 Logische Optimierung Beispiel 44: SQL-Select und optimierte relationale Algebra (mit Baum) SQL: SELECT DISTINCT s.Semester FROM Studenten s, hören h, Vorlesungen v, Professoren p WHERE Name = ’Sokrates’ and v.gelesenVon = p.PersNr and v.VorlNr = h.VorlNr and h.MatrNr = s.MatrNr; Relational: ΠSemester (σName = ’Sokrates’∧gelesenVon = Professoren.PersNr∧... (Studenten×hören×Vorlesungen×Professoren)) • Vergleich der beiden Statements: Πs.Semester • Πs.Semester σp.Name=! Sokrates! ∧v.gelesenVon... s.MatrNr=h.MatrNr × × × v.VorlNr=h.VorlNr p.PersNr=v.gelesenVon σp.Name= Abbildung 7: Baumdarstellung vor (links) und nach (rechts) der Optimierung 8.1.1 Heuristische Anwendungen der Transformationsregeln Opimierungsheuristik Aufbrechen von Selektionen (→ alle σ-Operationen nacheinander schreiben) Verschieben der Selektionen soweit wie möglich nach unten im Operatorbaum Zusammenfassen von Selektionen und Kreuzprodukten zu (Index-)Joins Bestimmung der Reihenfolge der Joins in der Form, dass möglichst kleine Zwischenergebnisse entstehen 5. unter Umständen Einfügen von Projektionen 6. Verschieben von Projektionen soweit wie möglich nach unten im Operatorbaum 1. 2. 3. 4. c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 51 8.2 Physische Optimierung 8.2 Physische Optimierung Physische Optimierung heisst Auswahl der richtigen Operation. • • • • Nested-Loop Index-Join Hash-Join Sort/Merge-Join Das Kostenmodell stellt dazu Funktionen zur Verfügung, die den Aufwand, d.h. die Laufzeit, der Operatoren der physischen Optimierung abschätzen. Dafür sind verschiedene Parameter nötig, die in der Abbildung 8 dargestellt sind: Abbildung 8: Kostenmodell zur physischen Optimierung D M G 8.2.1 Selektivität Sind verschiedene Strategien anwendbar, so benötigt man zur Auswahl eine Kostenfunktion. Sie basiert © A. Kemper / A. Eickler 33 auf dem Begriff der Selektivität. • Die Selektivität eines Suchprädikats schätzt die Anzahl der qualifizierenden Tupel relativ zur Gesamtanzahl der Tupel in der Relation. • Beispiele: – die Selektivität einer Anfrage, die das Schlüsselattribut einer Relation R spezifiziert, ist 1/#R, wobei #R die Kardinalität der Relation R angibt. – Wenn ein Attribut A spezifiziert wird, für das i verschiedene Werte existieren, so kann die Selektivität als (#R/i)/#R oder 1/i abgeschätzt werden. 8.2.2 Übersetzung der logischen Algebra Hierbei werden die einzelnen Operatoren der logischen Algebra (siehe Beispiel 44) in eine äquivalente Darstellung der pysischen Algebra übersetzt. Es gelten folgende Übersetzungsmöglichkeiten für relationale Operationen: 52 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 8.3 „Tuning“ Abbildung 9: Mögliche Umsetzungen einiger relationaler Operatoren 8.3 „Tuning“ Optimieren von Tabellen/Indexen/Schlüsseln anhand aufgezeichneter Zugriffe: • Statistiken (Histogramme, etc.) müssen explizit angelegt werden • Anderenfalls liefern die Kostenmodelle falsche Werte • In Oracle . . . – analyze table Professoren compute statistics for table; – Man kann sich auch auf approximative Statistiken verlassen ∗ Anstatt compute verwendet man estimate • In DB2 . . . – runstats on table ... c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 53 9 Transaktionsverwaltung 9.1 Transaktionsverwaltung mit Fehlerbehandlung In den klassischen Transaktionssystemen: begin of transaction (BOT). Mit diesem Befehl wird der Beginn einer eine Transaktion darstellende Befehlsfolge gekennzeichnet. commit: Erfolgreicher Abschluss. Hierdurch wird die Beendigung der Transaktion eingeleitet. Alle Änderungen der Datenbasis werden durch diesen Befehl festgeschrieben, d.h. sie werden dauerhaft in die Datenbank eingebaut. rollback: Erfolgloser Abschluss. Dieser Befehl führt zu einem Selbstabbruch der Transaktion. Das Datenbanksystem muss sicherstellen, dass die Datenbasis wieder in den Zustand zurückgesetzt wird, der vor Beginn der Transaktionsausführung existiert. 9.1.1 Wichtige Eigenschaften von Transaktionen [wichtig] Transaktionen in Datenbanken sind charakterisiert durch die sogenannten ACID- Eigenschaften: Akronym: A — C — I — D Atomicity (Atomarität) Transaktion als kleinste, nicht mehr weiter zerlegbare Einheit; d.h. entweder werden alle Änderungen der Transaktion festgeschrieben oder gar keine. Consistency Konsistenter Zustand der DB nach Beendigung → ansonsten Zurücksetzung Isolation Jede Transaktion hat die DB „für sich allein“; parallele Transaktionen bzw. Zugriffe sind nicht möglich bzw. dürfen sich nicht gegenseitig beeinflussen Durability (Dauerhaftigkeit) Änderungen erfolgreicher Transaktionen dürfen nie verloren gehen, d.h. diese müssen persistent geschrieben werden. Dabei werden mit commit alle Änderungen festgelegt; mit rollback indes zurückgesetzt. Beispiel 45: Beispieltransaktion auf Basis des Universitätsschemas: 1 2 3 4 5 6 BEGIN TRANSACTION; -- Transaktion beginnen insert into Professoren values (2141, ‘Meitner‘, ‘C4‘, 205); insert into Vorlesungen values (5275, ‘Kernphysik‘, 3, 2141); COMMIT; -- oder ROLLBACK 54 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 9.1 Transaktionsverwaltung mit Fehlerbehandlung 9.1.2 Komponenten Transaktionsverwaltung Die Transaktionsverwaltung besteht aus zwei grossen Komponenten: • Mehrbenutzersynchronisation (→ siehe Kapitel 11) • Recovery: Gewährleistung der Atonalität und Dauerhaftigkeit (→ siehe Kapitel 10.1.1) Abbildung 10: Transaktionsverwaltung Für eine allfällige Erklärung der Zustandsübergänge: siehe Lehrbuch Kapitel 9.7, S. 291f. c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 55 10 Fehlerbehandlung 10.1 Die (zweistufige) Speicherhierarchie Ein DB-Verwaltungssystem bearbeitet Daten innerhalb des sogenannten Datenbankpuffers (siehe Box im Kapitel 7.1). Dieser ist Teil des Hauptspeichers und ist in Seitenrahmen segmentiert, welche genau eine Seite fassen können. Das heisst, alle Tupel (Datensätze) – im Beispiel A, B, C, D – müssen auf persistent speicherbare Seiten abgebildet werden – im Beispiel PA , PB und PC : A! " D PA C! A! ! PC D C PB B Abbildung 11: Speicherhierarchie Eine Transaktion benötigt im Allgemeinen mehrere Datenseiten, die sich entweder schon (zufällig) im Puffer befinden oder aber noch eingelagert werden müssen. Für die Dauer eines Zugriffs bzw. eines Updates wird die jeweilige Seite im Puffer fixiert („FIX“), damit sie nicht von anderen Operationen aus dem Puffer verdrängt werden kann. Danach wird sie wieder freigegeben und kann also ersetzt werden. 10.1.1 Ersetzung von Seiten und Änderungen von Transaktionen Dabei gelten zwei Strategien in Bezug auf aktive (noch nicht festgeschriebene) Transaktionen: • steal: die nicht fixierte Seite ist prinzipiell ein Kandidat für die Ersetzung, falls neue Seiten eingelagert werden müssen. • ¬ steal: Bei dieser Strategie wird die Ersetzung von Seiten, die von einer noch aktiven Transaktion modifiziert wurden, ausgeschlossen. Die von einer abgeschlossenen Transaktion verursachten Änderungen – d.h. alle von ihr modifizierten Seiten – können dann auf zwei weitere Arten in die Datenbasis übertragen werden: • force: Änderungen werden zum Transaktionsende auf den Hintergrundspeicher geschrieben • ¬ force: geänderte Seiten können im Puffer verbleiben Daraus ergibt sich folgende Übersicht in Bezug auf ein Recovery der Daten (z.B. bei fehlerhafter Transaktion): 56 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 10.2 ¬ force force • kein Redo • Undo steal ¬ steal Protokollierung von Änderungsoperationen • Redo • Undo • kein Redo • kein Undo • Redo • kein Undo Tabelle 1: Recovery der Daten Redo: alle noch nicht in die Datenbasis eingebrachten Änderungen können nachvollzogen werden nach der Transaktion Undo: alle durch nicht abgeschlossene Transaktion noch nicht in die Datenbasis eingebrachten Änderungen können rückgängig gemacht werden 10.2 Protokollierung von Änderungsoperationen Die materialisierte Datenbasis enthält meist nicht einen konsistenten Zustand (siehe vorheriger Abschnitt: Daten können z.B. vom Puffer noch nicht in die Datenbasis propagiert worden sein, . . . ). Deshalb wird eine Log-Datei angelegt, um Zusatzinformationen für mögliche Änderungsoperationen anzulegen. Die Log-Einträge weisen folgende Struktur auf: [LSN, TransaktionsID, PageID, Redo, Undo, PrevLSN] • LSN (Log Sequence Number) eindeutige Kennung des Log-Eintrags • TransaktionsID Transaktion, welche die Änderung durchgeführt hat • PageID Kennung der Seite, auf der die Änderungsoperationen vollzogen wurden • Redo gibt an, wie die Änderung nachvollzogen werden kann • Undo beschreibt, wie die Änderung rückgängig gemacht werden kann • PrevLSN Zeiger auf den vorhergehenden Log-Eintrag der jeweiligen Transaktion. Der Log-Eintrag wird geschrieben, bevor eine Änderungsoperation angelegt wird. Die Einträge werden im Log-Puffer (Hauptspeicher) zwischengelagert. Der Log-Puffer ist meist als Ringpuffer ausgelegt (gleichmässige Auslastung, da an einem Ende dauernd geschrieben, am anderen dauernd ausgelesen werden kann), siehe Bild rechts. Spätestens sobald er voll ist, muss er auf den Hintergrundspeicher geschrieben werden. AP1 % & ... ( APn ' " ! " ! $ • ) # • • • • #40 • & ! #41 # $ #20 ' ( " • • #10 • • • % • c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 57 10.3 Wiederanlauf nach einem Fehler 10.2.1 Das WAL-Prinzip („Write Ahead Log“-Prinzip) Das Prinzip kommt beim Schreiben der Log-Einträge in den Speicher zur Anwendung: • Bevor eine Transaktion festgeschrieben (committed) wird, müssen alle „zu ihr gehörenden“ LogEinträge ausgeschrieben werden. • Bevor eine modifizierte Seite ausgelagert werden darf, müssen alle Log-Einträge, die zu dieser Seite gehören, in den temporären Speicher und das Log-Archiv ausgeschrieben werden. 10.3 Wiederanlauf nach einem Fehler Nach einem Fehler mit Verlust des Hauptspeicherinhalts muss der Fehler nach dem folgendem Recoverykonzept gelöst werden (drei Phasen): 1. Analyse: • Die temporäre Log-Datei wird von Anfang bis zum Ende analysiert, • Ermittlung der Winner-Transaktionen • Ermittlung der Loser-Transaktionen 2. Wiederholung der Historie: • alle protokollierten Änderungen werden in der Reihenfolge ihrer Ausführung in die Datenbasis eingebracht. 3. Undo der Loser: • Die Änderungsoperationen der Loser-Transaktionen werden in umgekehrter Reihenfolge ihrer ursprünglichen Ausführung rückgängig gemacht. Winner-Transaktionen: alle COMMIT-Einträge im Log Loser-Transaktionen: alle Einträge im Log, zu denen KEIN COMMIT GEFUNDEN werden kann 58 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 11 Transaktionsverwaltung mit Mehrbenutzersynchronisation Unter Mehrbenutzerbetrieb versteht man die gleichzeitige (nebenläufige, parallele) Ausführung mehrerer Programme (bzw. in unserem Kontext Transaktionen). 11.1 Fehler bei unkontrolliertem Mehrbenutzerbetrieb [S. 316] Verlorengegangene Änderungen (lost update). Änderungen eines Datensatzes, die während einer bereits ablaufenden Transaktion parallel gestartet werden, werden überschrieben durch die zeitlich früher gestartete Transaktion und sind dann verloren. Phantomproblem. Zwei identische Statements – welche nicht über eine Transaktion geschützt sind – liefern nicht dasselbe Ergebnis (weil man ja nicht wissen kann, was dazwischen passiert ist): Abbildung 12: Zwei Tabellen in einer Transaktion, die dem Phantomproblem unterliegt Es tritt auf, wenn während der Abarbeitung der Transaktion T2 eine andere Transaktion T1 (zeitlich jüngere Transaktion) diese beeinflusst. Als Folge davon ist das Ergebnis – trotz gleicher ausgeführter Aktion in T2 – ein unterschiedliches. 11.2 Serialisierbarkeit Merke: Die serialisierbare Ausführung entspricht einer Menge von Transaktionen (TA) einer kontrollierten, nebenläufigen, verzahnten Ausführung. Eine Kontrollkomponente sorgt dafür, dass dabei keine Fehler entstehen. Bei einer serialisierbaren Ausführung mehrerer Transaktionen muss die zeitlich jüngere TA warten, bis die ältere TA komplett beendet ist. Somit können sich Transaktionen nicht gegenseitig beeinflussen. c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 59 11.2 Serialisierbarkeit Als serialisierbar bezeichnet man in Transaktionssystemen also eine Historie (= zeitliche Anordnung der einzelnen verzahnt ausgeführten Elementaroperationen einer Menge nebenläufiger Transaktionen), die nacheinander ausgeführt zum selben Ergebnis führt wie eine serielle Historie über dieselben Transaktionen (https://de.wikipedia.org/wiki/Serialisierbarkeit) – oder frei nach OlnSerialisierbarkeit hoff (11.04.2013): „zwei parallele Transaktionen, die sich gegenseitig nicht ’wehtun’“. dabei eine exklusive Sperrung: Historie Es istgilt „äquivalent“ zu einer seriellen HistorieZwei verzahnte Überweisungs-Transaktionen dennoch parallele (verzahnte) Ausführung möglich Serialisierbare Historie von T1 und T2 Schritt 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. T1 BOT read(A) T2 BOT read(C) write(A) write(C) read(B) write(B) commit Schritt T1 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. BOT read(A,a1) a1 := a1 – 50 write(A,a1) T3 BOT read(A,a2) a2 := a2 – 100 write(A,a2) read(B,b2) b2 := b2 + 100 write(B,b2) 12. read(A) write(A) commit © A. Kemper / A. Eickler commit 13. read(B,b1) 14. bD1 := b1 + 50 15. 16. D M G Mwrite(B,b ) 1 G commit/rollback 6 © A. Kemper / A. Eickler 9 Man beachte die rechtsstehende Tabelle dabei: bei einem „commit“ (Schritt 16) würde T1 dort bestätigt und damit auch T3 als „gültige Transaktion“ definiert – man hätte nichts gemerkt. Bei einem „rollback“ wäre dies aber nicht der Fall und T1 und T3 befänden sich in nicht gleichen Zuständen (T1 wird zurückgesetzt, T3 ist bereits abgeschlossen und hat das Datenobjekt A aus T1 beansprucht!); d.h. das Argument der Serialisierbarkeit würde dann verletzt. Damit ist das rechte Beispiel nicht serialisierbar. Abbildung 13: Serialisierbarkeit T1 Datenbank-Scheduler " Ein Datenbank-Scheduler gewährleistet – vereinfacht gesagt – die „vernünftige“ Ausführung verschiedener Einzeloperationen der Transaktionen unter Einhaltung der Kriterien der Serialisierbarkeit. T2 " T3 " Tn " " " ! " 60 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 11.3 Sperrbasierte Synchronisation 11.3 Sperrbasierte Synchronisation Bei der sperrbasierten Synchronisation wird während des laufenden Betriebs sichergestellt, dass die resultierende Historie serialisierbar bleibt. Welche Operationen lassen sich gegenseitig zu? Es gelten dabei folgende Arten von Sperren (bzw. Modi): S shared, read lock, Lesesperre Eine Transaktion kann ein Datenobjekt lesen. Wenn Ti eine S-Sperre für einen Zugriffszeitpunkt A besitzt, kann Ti read(A) ausführen. Mehrere Transaktionen können gleichzeitig eine S-Sperre auf demselben Objekt A besitzen. X exclusive, write lock, Schreibsperre Eine Transaktion kann ein Datenobjekt verändern. Ein write(A) darf aber nur eine Transaktion ausführen, die eine X-Sperre auf A hat. Man unterscheidet weiter bezüglich der Dauer einer Sperre: • Eine kurze Sperre wird von einer Transaktion auf einem Datenobjekt nur während des Zugriffs gehalten und danach gleich wieder freigegeben. • Eine lange Sperre wird im Verlauf einer Transaktion angefordert und dann bis zum Ende der Transaktion gehalten. Die Freigabe erfolgt erst beim Bestätigen oder Verwerfen der Transaktion. 11.3.1 Verhalten der Transaktionen Eine Prädikatsperre (P-Sperre) betrifft alle von der Änderung betroffenen Datensätze bei einer einer Modifikation (insert, update oder delete). Isolationslevel Sperre(n) Verhalten READ COMMITTED Lesen: kurze Lesesperren Schreiben: lange exklusive P-Sperren kann nur Daten lesen, die andere Transaktionen bestätigt haben. Mehrmaliges Lesen möglich, kann zu Problemen führen. SERIALIZABLE Lesen: lange (nicht-)exklusive P-Sperren Schreiben: lange exklusive P-Sperren Schutz der gesamten TA durch lange Sperren Die Verträglichkeit von Sperranforderungen mit bereits existierenden Sperren (auf demselben Objekt durch andere Transaktionen) kann man in einer Verträglichkeitsmatrix bzw. Kompatibilitätsmatrix zusammenfassen (NL = No Lock; d.h. keine Sperre): SERIALIZABLE: READ COMMITTED: NL S X S ja ja nein X ja nein nein NL S X S ja ja ja X ja ja nein c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 61 11.4 2-Phase-Commit Transaktionsverarbeitung 11.4 2-Phase-Commit Transaktionsverarbeitung Die EOT (End-of-Transaction)-Behandlung von globalen Transaktionen stellt in verteilten DBMSUmgebungen (VDBMS) ein Problem dar (da die Stationen eines VDBMS unabhängig voneinander „abstürzen“ können bzw. die Konsistenz der Tabellen nicht mehr gewährleistet ist). Problemlösung: Zweiphasen-Commit-Protokoll oder auch 2PhaseCommit (2PC). ! A1 " A2 K # A3 $ A4 ! A1 # & %K " " A2 # A3 # & %K " $ A4 Abbildung 14: Nachrichtenaustausch beim 2PC-Protokoll (Beispiel mit 4 Agenten) Zur Grafik: Der Commit-Koordinator (K) schickt ein Prepare-Statement (PREPARE) an alle Agenten (A) und wartet auf deren Feedback (FAILED / READY). Falls bei einem Agenten die Bestätigung ausbleibt wird das COMMIT abgebrochen (COMMIT/ABORT), ansonsten bestätigt (ACK). Das 2PC-Verfahren. . . • wird vom sogenannten Koordinator K überwacht • gewährleistet, dass die n Agenten (= Stationen im VDBMS) A1 , . . . , An , die an einer Transaktion beteiligt waren, entweder alle von Transaktion T geänderten Daten festschreiben oder alle Änderungen von T rückgängig machen 11.5 Abstürze 11.5.1 Absturz eines Koordinators → Hauptproblem des 2PC-Verfahrens • Absturz vor dem Senden einer COMMIT-Nachricht → Rückgängigmachung der Transaktion durch Versenden einer ABORT-Nachricht. • Absturz nachdem Agenten ein READY mitgeteilt haben → Blockierung der Agenten. 11.5.2 Absturz eines Agenten Antwortet ein Agent innerhalb eines Timeout-Intervalls nicht auf die PREPARE-Nachricht, gilt der Agent als abgestürzt; der Koordinator bricht die Transaktion ab und schickt eine ABORT-Nachricht an alle Agenten. 62 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 12 Sicherheitsaspekte 12.1 Zugriffskontrolle in SQL Der SQL-92 Standard stellt keine Normen für Authentisierung und Auditing (verifiziert die Richtigkeit und Vollständigkeit der Autorisierungsregeln und kann Schäden rechtzeitig erkennen) auf. Es existiert nur ein Befehl zur Vergabe von Rechten (GRANT) und einer zum Entzug derer (REVOKE). 12.1.1 Identifikation und Authentisierung Beispiel 46: neuen User erfassen mittels CREATE USER 1 2 CREATE USER eickler -- weitere Befehle absetzen fuer Passwort, etc. 12.1.2 Autorisierung und Zugriffskontrolle Beispiel 47: Zugriff ermöglichen (SELECT / UPDATE zulassen) mittels GRANT 1 2 3 -- SELECT auf Tabelle ’Professoren’ zulassen fuer User ’eickler’ GRANT SELECT on Professoren to eickler; 4 5 6 7 8 -- UPDATE auf Tabelle ’pruefen’ zulassen fuer User ’eickler’ GRANT UPDATE (MatrNr, VorlNr, PersNr) on pruefen to eickler; Beispiel 48: Entzug von Rechten (des UPDATE-Statements) mittels REVOKE 1 2 3 REVOKE UPDATE (MatrNr, VorlNr, PersNr) on pruefen FROM eickler CASCADE; -- durch ’CASCADE’ werden kaskadierend alle Rechte zurueckgenommen 12.1.3 Zugriffskontrolle durch Sichten (VIEW) Es besteht die Möglichkeit, Rechte von einer bestimmten Bedingung oder Aggregation von Daten abhängig zu machen. Dies wird mittels Sichten realisiert, die danach einem bestimmten User bzw. einer bestimmten Usergruppe zugewiesen werden. c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 63 12.2 Schema Best präktiss bei Zugriffsbeschränkungen Immer zuerst VIEW definieren und dann GRANT für die entsprechenden User bzw. Usergruppe (siehe nächstes Beispiel). Beispiel 49: Änderungsbeschränkung mit GRANT auf bestimmten Daten (VIEW) 1 2 3 4 CREATE VIEW ErstSemestler AS SELECT * FROM Studenten WHERE Semester = 1 WITH CHECK OPTION; -- WITH CHECK OPTION verhindert, dass hier mit INSERT oder UPDATE ein anderer Wert als 1 bei Semester eingetragen werden koennte (siehe GRANT nachfolgend) 5 6 7 8 GRANT select, update, insert ON ErstSemestler TO tutor; 12.2 Schema Ein Schema ist eine Unterstruktur der DB (mySql: DB = Schema). Tabellen in unterschiedlichen Schemata können den gleichen Namen haben. 12.3 Kryptographie Die meisten Datenbankanwendungen werden in einer verteilten Umgebung betrieben – sei es als Client / Server-System oder als „echte“ verteilte Datenbank. In beiden Fällen ist die Gefahr des unlegitimierten Abhörens sowohl innerhalb eines LAN als auch im WAN gegeben und kann technisch fast nicht ausgeschlossen werden. Merke: Die Verschlüsselung einer DB ist Sache des Administrators. Das DBMS stellt dies nicht standardmässig zur Verfügung. Dabei sollten folgende Ebenen des Datenschutzes berücksichtigt werden: siehe Grafik rechts. 64 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 13 Objektorientierte Datenbanken / Übung mit Java-Persistence-API (Objektorientierte Sicht auf relationale DB) ER-Modellierung rel. DB-Schema OO-Schema XML-Schema unstrukturierte Daten SQL: -DDL -DML JDBC Phys. Strukturen (Bäume) Transaktionen Verteilung ODL OQL XSchema/DTD XQuery Skriptsprache in BigData „Analysen: hochverteiltelte Auswertungen“ 13.1 Klassenbeschreibungen einer relationalen Datenbank Einige Objekte aus der Universitätswelt id1 class Professoren { attribute long PersNr; attribute string Name; attribute string Rang; }; id2 VorlNr: Titel: SWS: gelesenVon: Hörer: Nachfolger: Vorgänger: PersNr: Name: Rang: resisiertIn: hatGeprüft liest: Profesoren 2137 „Kant“ „C4“ id9 {...} {id2, id3} id3 VorlNr: Titel: Vorlesungen 5001 „Grundzüge “ 4 SWS: gelesenVon: Hörer: Nachfolger: Vorgänger: id1 {...} {...} {...} D M G © A. Kemper / A. Eickler Vorlesungen 4630 „Die 3 Kriterien“ 4 id1 {...} {...} {...} 7 Abbildung 15: Achtung Redundanzen (siehe Abhängigkeiten zwischen Professoren und Vorlesungen bzw. Professoren und Vorlesungen!) c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 65 13.1 Klassenbeschreibungen einer relationalen Datenbank 13.1.1 Definition von Objekttypen Beispiel 50: Modellierung mit „inverse“ 1 2 3 4 5 6 class Professoren { attribute long PersNr; ... // relationship [Tabelle] [Name] INVERSE [Verweis] relationship Raeume residiertIn INVERSE Raeume::beherbergt; }; 7 8 9 10 11 12 13 14 // Raeume mit Primaerschluessel ’RaumNr’: class Raeume (Key RaumNr) { attribute long RaumNr; attribute short Groesse; ... relationship Professoren beherbergt INVERSE Professoren::residiertIn }; inverse-Abhängigkeit Die beiden Beziehungen sind zueinander invers, d.h. sie drücken die gleichen Informationen aus (gleiche Infos in unterschiedlichen Feldern gespeichert). Falls die eine Relationship durch den Programmierer aktualisiert wird, so wird im referenzierten Objekt die Änderungen automatisch auch aktualisiert. Professoren residiertIn inverse Raum beherbergt Beispiel 51: Typeigenschaften: Extensionen EXTENT und Schlüssel key Die Extension (extent) ist die Menge aller Instanzen eines Objekttyps. Man kann dazu auch Schlüssel definieren, deren Eindeutigkeit innerhalb der Extension gewährleistet wird. Sie sind nicht brauchbar zur Referenzierung von Objekten, sondern gewährleisten die Integritätsbedingung. 1 2 3 4 5 6 7 class Studenten (EXTENT AlleStudenten KEY MatrNr) { attribute long MatrNr; attribute string Name; attribute short Semester; relationship set(Vorlesungen) hoert INVERSE Vorlesungen::Hoerer; relationship set(Pruefungen) wurdeGeprueft INVERSE Pruefungen::Pruefling; }; 66 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 13.2 Abfragen, Statements und Transaktionen in OQL Wichtig: Erst das Keyword extent ermöglicht ein Iterieren über eine Kollektion von Datensätzen! 13.2 Abfragen, Statements und Transaktionen in OQL Pfadausdrücke in OQL-Anfragen Beispiel 52: Abfrage in OQL über eine Collection select s.Name from s in AlleStudenten, v in s.hört where v.gelesenVon.Name = „Sokrates“; Visualisierung des Pfadausdruckes Studenten hört Vorlesungen gelesenVon Professoren Nam e ein längerer Pfadausdruck eineVorlesung.gelesenVon.residiertIn.Größe Achtung Collections! Vorlesungen Der direkte Zugang (z.B. bekannt aus Java) ist nicht möglich, sofern eine Kollektion angesproProfessoren chen werden muss. Es muss ein „Umweg“ über „Zwischenvariablen“ gegangen werden, z.B.: D Räume M v und s beschreiben nun direkt einzelne Elemente aus den Collections ’Vorlesungen’ bzw. ’Studenfloat G © A. Kemper / A. Eickler 29 ten’. Beispiel 53: Erzeugung von Objekten 1 2 3 4 5 // formale Argumente in Vorlesungen(...): VorlNr, Titel, SWS, gelesenVon Vorlesungen(5555, "Ethik II", 4, ( select p from p in AlleProfessoren where p.Name = "Sokrates")); -- referenziert Sokrates-Objekt Beispiel 54: Objekterzeugung und Ballung von Objekten (= Angabe zur Platzierung im Speicher [C++]) 1 2 //UniDB entspricht einem Connection-Objekt (DB-Verbidnung) Professoren Russel = new(UniDD) Professoren(2126, "Russel", "C4", ...); 3 4 5 // Popper-Objekt kommt auch in die DB von Russel - zudem wird es nahe bei Russel gespeichert (gleicher Block) Professoren Popper = new(Russel) Professoren(2133, "Popper", "C3", ...); Beispiel 55: Verschachtelte Transaktionen 1 2 3 4 5 6 7 public void Umziehen(Raum neuerRaum) { Transaction TAumziehen; // Transaktion (TA) definieren TAumziehen.start(); // TA starten ... if ( /*Fehler? */ ) TAumziehen.rollback(); // TA ruecksetzen ... c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 67 13.3 8 9 Beispiel TAumziehen.commit(); }; // TA bestaetigen / abschliessen Merke: Bei geschachtelten Transaktionen werden in SQL sowie OQL nach einem „rollback“ alle inneren Transaktionen zurückgesetzt. Dies beinhaltet auch jene, welche bereits ein „commit“ erhalten haben! 13.3 Beispiel Beispiel 56: Objektorientierte Datenbank Welche Person kann das Oberteil des Teiles mit der Nummer 5 produzieren? Diagramm: ID bestehtAus mc Teil AnzahlUnterteile mc mc gefertigtVon ID c Maschine ID mc m Person bedienbarVon Klassenbeschreibungen: 1 2 3 4 class Person(extent allePersonen) { attribute string Name; relationship set(Maschine) bedient inverse Maschine::bedienbarVon; } 5 6 7 8 9 10 class Maschine(extent alleMaschinen key Bez) { attribute string Bez; relationship set(Person) bedienbarVon inverse Person::bedient; relationship set(Teil) fertigt inverse Teil::gefertigtVon; } 68 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 13.3 Beispiel 11 12 13 14 15 16 class Stueckliste { Attribute int Anzahl; relationship Teil Oberteil inverse Teil::Oberteilstuecklisten; relationship Teil Unterteil inverse Teil::Unterteilstuecklisten; } 17 18 19 20 21 22 23 class Teil(extent alleT, key TeilNr) { Attribute int TeilNr; relationship Maschine gefertigtVon inverse Maschine::fertigt; relationship set(Stueckliste) Oberteilstueckliste inverse Stueckliste:: Oberteil; relationship set(Stueckliste) Unterteilstueckliste inverse Stueckliste:: Unterteil; } 24 25 26 27 28 29 30 // 1. Abfragemoeglichkeit (ueber Teile): select p from t in alleT, s in t.Oberteilstueckliste, // liefert Set --> s p in s.Oberteil.gefertigtVon.bedienbarVon // liefert Set --> p where t.TeilNr = 5; 31 32 33 34 35 36 37 38 // 2. Abfragemoeglichkeit (ueber select from p in allePersonen, m in p.bedient, // liefert Set t in m.fertigt, // liefert Set s in t.Unterteilstueckliste // where s.Unterteil.TeilNr = 5; Personen): --> m --> t liefert Set --> s c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 69 14 Java Persistence API Anwendung Persistence API Entity Manager Service Provider Interface Eclipse Link Oracle Hibernate ... Abbildung 16: Schichten Modell der Java Persistence API 14.1 Beschreibungsmittel und Klassen Annotations: Mapping der Klassen zu DB-Tabellen EntityManager: Zugriff auf persistente Objekte (Suchen, Speichern, Transaktionen, . . . ) persistence.xml: Treiber, DB-Connection, . . . 14.1.1 Annotations-1 • • • • • @Entity: Klasse ist persistent @Table(name=. . . ): Klasse wird auf Tabelle abgebildet @Column(name = . . . ) : Klassen- zu Tabellenattribut @Id: Primärschlüsselattribut @GeneratedValue(strategy=. . . ): automatische Generierung eines Attributwertes (Id) Beispiel 57: Entity-Klasse JVorlesungen.java import javax.persistence.*; @Entity @Table(name = "vorlesungen") public class JVorlesungen implements Serializable { @Id @GeneratedValue(strategy =GenerationType.IDENTITY) @Basic(optional = false) // null not allowed @Column(name = "vorlnr") private Integer jVorlnr; 1 2 3 4 5 6 7 70 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 14.1 8 9 Beschreibungsmittel und Klassen // Db-Feld vorlnr wird zu java-Feld jVorlnr ...} 14.1.2 Annotations-2 M-zu-1 Beziehung zwischen JVorlesungen und JProfessoren in JVorlesungen eine Referenz auf Professoren: • @JoinColumn(name = “gelesenVon“, referencedColumnName = “PersNr“) • @ManyToOne • private JProfessoren jGelesenVon; Umkehrung in der Klasse JProfessoren: • @OneToMany(mappedBy = “jGelesenVon“) • private Collection<JVorlesungen> jVorlesungen; 14.1.3 Annotations-3 mc-zu-mc Beziehung zwischen JStudenten und JVorlesungen In JStudenten: • @JoinTable(name = “hoeren“, joinColumns = {@JoinColumn(name = “matrnr“, referencedColumnName = “persnr“)}, inverseJoinColumns = {@JoinColumn(name = “vorlnr“, referencedColumnName = “vorlnr“)}) • @ManyToMany • private Collection<JVorlesungen> jVorlesungen; In JVorlesungen: • @ManyToMany(mappedBy = "jVorlesungen") • private Collection<JStudenten> jHoerer; 14.1.4 Annotations-4 Vererbungshierarchien in einer Tabelle (single table, joined tables als Alternative) c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 71 14.1 Beschreibungsmittel und Klassen In JPersonen: @Entity @Table(name = “Personen“) @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn( name = “DTYPE“, discriminatorType = DiscriminatorType.STRING) In Jassistenten extends JPersonen: @Entity @DiscriminatorValue(“assi“) Ein Eintrag in der Personen-Tabelle mit „assi“ in dtype ist ein Objekt der Klasse JAssistenten 14.1.5 Annotation-5 Zusätzliche Argumente für Beziehungen • in @One. . . ,@Many. . . CascadeType: Änderungen am referenzierten Objekt FetchType: Laden des referenzierten Objekte e.g. in der Klasse JProfessoren für die Collection jVorlesungen @OneToMany(mappedBy = “jGelesenVon“ , cascade=CascadeType.PERSIST, fetch=FetchType.EAGER) – liest der Prof p eine neue Vorlesung v (mit new erzeugt und zu p.jVorlesungen hinzugefügt), so wird bei Speicherung von p vorgängig v (automatisch) gespeichert – ein Prof-Objekt wird immer zusammen mit all „seinen“ Vorlesungen geladen. 1 2 3 4 5 6 7 1 2 14.1.6 Persistence.xml <persistence-unit name="appeUniPU" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse...</provider> ... Entity-classes .... <properties> Connection-properties, Log-property (zum Testen) </properties> </persistence-unit> 14.1.7 EntityManager EntityManagerFactory emf = Persistence.createEntityManagerFactory(" appeUniPU"); EntityManager em = emf.createEntityManager(); 3 72 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 14.1 Beschreibungsmittel und Klassen em.createQuery("select p from JProfessoren p"); // gibt JProfessorenCollection zurueck (Generics) // Query-Ausdruck ist (fast) OQL, immer Bezug auf Java-Namen 4 5 6 em.persist(entityObject): speichert ein neues Objekt (+referenzierte Objekte) em.merge(..) // aktualisiert ein Objekt in der DB 7 8 9 10 11 EntityTransaction ta = em.getTransaction(); // ta.begin(), ta.commit(), ta.rollback() Merke: • Veränderungen nur innerhalb von Transaktionen • Veränderungen werden (meist) erst mit dem Ende der Transaktion in die DB geschrieben erst dann ist eine IDENTITY-ID (auto_increment) verfuegbar - em.refresh(object)!! • Wenn die referenzierten Objekte „automatisch“ gespeichert werden sollen: cascade-Parameter in One. . . , Many. . . angeben! Parameter wird (bisher) nicht generiert!! • Laufzeitobjekte werden nicht automatisch aktualisiert, use em.refresh(object), sehr beachtenswert Tooling • Man kann die Entity-Klassen generieren lassen: siehe dazu JpaReadme.pdf • Alternative (für einen Datenbänkler verpönt!!) Entityklassen mit JPA-Annotationen programmieren in persistence.xml: Table Generation Strategy = Create beim Start des Programmes werden die Tabellen erzeugt („magic“ create table . . . ) c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 73 15 Verteilte Datenbanken9 Verteilte Datenbanksysteme stellen integrierte, geographisch verteilte Mehrrechner-Datenbanksysteme (wie in Abbildung 17) dar. Jede Station beinhaltet eine vollständige Instanz eines DBMS und kooperieren durch Nachrichtenaustausch über ein Kommunikationsnetz (LAN oder WAN) miteinander. S2 • S1 • • S3 Abbildung 17: Verteilte Datenbanken an verschiedenen Stationen Eine Herausforderung bei verteilten Datenbanken stellen Dateninkonsistenzen dar. Um dies zu umgehen, dazu dient das Sperren von Replikationen. Dabei kommt das Phase2-Commit Protokoll zum Einsatz. 15.1 Fragmentierung Fragmentierung Fragmente enthalten Daten mit gleichem Zugriffsverhalten – sie sind aber verteilt abgelegt. Dabei können sie entweder mit oder ohne Replikation (= ohne Redundanz) vorkommen. Es gelten dabei folgende Fragmentierungsmöglichkeiten: • horizontale Fragmentierung: Zerlegung der Relation in disjunkte Tupelmengen • vertikale Fragmentierung: Zusammenfassung von Attributen mit gleichem Zugriffsmuster (z.B. verschiedene Spalten auf versch. Servern lagernd) • kombinierte Fragmentierung: Anwendung horizontaler und vertikaler Fragmentierung auf dieselbe Relation Eine Anwendung greift auf verteilt gespeicherte Daten zu – und muss dabei aber eigentlich nur das globale Schema kennen. Darunter liegend werden die Daten fragmentiert und in verteilten Datenbanken abgelegt (Zuordnungsschema). Der User bzw. die Anwendung muss sich allerdings nicht darum bemühen 9 Dieses Kapitel verwendet zur Ergänzung Inhalte der Website http://dbs.uni-leipzig.de/buecher/mrdbs/mrdbs-3.html, davon insbesondere Zusammenfassungen aus den Kapiteln 4 & 5. 74 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 15.1 Fragmentierung zu wissen, wo die Daten liegen; der Zugriff erfolgt nach wie vor über das globale Schema. Um die korrekte Angabe des Zugriffsortes (lokales Schema) kümmert sich das VDBMS (siehe Abbildung 18). ... ... ... S1 ... Sn Abbildung 18: Fragmentierte Daten innerhalb eines globalen Schemas Der gesamte (d.h. unfragmentierte!) Datensatz muss immer rekonstruierbar sein. Dafür ist das VDBMS verantwortlich. 15.1.1 Horizontale Fragmentierung Die horizontale Fragmentierung ist die in existierenden Systemen bedeutendste Fragmentierungsform. Bei ihr wird eine globale Relation zeilenweise in disjunkte Teilmengen zerlegt. Die Zuordnung von Sätzen zu Fragmenten wird dabei i.a. über Selektionsprädikate (im Beispiel: Filiale) definiert. Abbildung 19: Einfache (primäre) horizontale Fragmentierung: die Selektionsprädikate beziehen sich ausschliesslich auf Attribute (im Beispiel: Filiale) der zu zerlegenden Relation. c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 75 15.1 Fragmentierung Die nachstehende Abbildung 20 zeigt die Fragmente R1 bis R3 einer Relation R mit zwei ZerlegungspräHorizontale Fragmentierung dikaten p1 und p2 : abstrakte Darstellung: R R1 R2 R3 Für 2 Prädikate p1 und p2 ergeben sich 4 Zerlegungen: R1 := p1 p2(R) R2 := p1 p2(R) R3 := p1 p2 (R) R4 := p1 p2 (R) n Zerlegungsprädikate p1,...,pn ergeben 2n Fragmente © A. Kemper / A. Eickler D M G 11 Abbildung 20: Horizontal fragmentierte Daten (schematisch) Eine entsprechende horizontale Fragmentierung wird auch innerhalb eines zentralen Systems unterstützt. Die Fragmente werden dann Partitionen genannt. 15.1.2 Vertikale Fragmentierung Die vertikale Fragmentierung zerlegt eine Relation spaltenweise durch Definition von Projektionen auf den Attributen der Relation. Die Forderungen nach Vollständigkeit und Rekonstruierbarkeit verlangen, das jedes Attribut in wenigstens einem Fragment enthalten ist. Abbildung 21: Die Kundenrelation einer Bankanwendung wurde Anwendung von Projektionen in zwei vertikale Fragmente KUNDE1 und KUNDE2 zerlegt. Der Primärschlüssel KNR ist in beiden Fragmenten enthalten, um die Gesamt-Relation durch JOIN-Bildung wieder rekonstruieren zu können. 76 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 15.2 Allokation Die Rekonstruktion der globalen Relation erfordert den natürlichen Verbund JOIN zwischen den einzelnen Fragmenten. Um diese JOIN-Berechnung verlustfrei vornehmen zu können, existieren verschiedene Ansätze, zum Beispiel: Vertikale Fragmentierung • jedes Fragment enthält den Primärschlüssel der Originalrelation • jedem Tupel der Originalrelation wird ein eindeutiges Surrogat (= künstlich erzeugter Objektindikator) zugeordnet, welches in jedes vertikale Fragment des Tupels mit aufgenommen wird abstrakte Darstellung: R R2 R1 © A. Kemper / A. Eickler Abbildung 22: Vertikal fragmentierte Daten (schematisch) Verteilte Datenbanken 15.2 Allokation D M G 14 Fragmentierung Beispielanwendung(2) Allokation Fragmente werden den Stationen zugeordnet. Eine Anwendung muss die Speicherorte fragmentierter Daten nicht kennen; stattdessen werden diese durch die Allokation wieder als „Einheit“ zur Verfügung gestellt. • Bei der Allokation werden nun die Fragmente Stationen zugeteilt (hier ohne Replikation) Station SVerw SPhysik SPhilo STheol Bemerkung Verwaltungsrechner Dekanat Physik Dekanat Philosophie Dekanat Theologie zugeordnete Fragmente {ProfVerw } {PhysikVorls, PhysikProfs} {PhiloVorls, PhiloProfs} {TheolVorls, TheolProfs} Die Allokation (Ortszuweisung) bestimmt nach der Datenfragmentierung, welchem Rechner jedes der Fragmente zugeordnet wird, wobei eine replizierte Allokation von Fragmenten möglich ist. In der Abbildung 23 wird so eine Zerlegung in 3 Fragmente vorgenommen, von denen für R1 und R3 eine 478 / 520 replizierte Allokation stattfindet: c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 77 15.3 Transparenz R R1 R11 S1 R21 R2 R12 R3 S2 R32 R33 S3 Abbildung 23: Beispiel einer Allokation • Die Menge der einem Rechner zugeordneten Fragmente einer globalen Relation ergeben dessen lokale Relation; z.B. umfasst die an Station S1 vorliegende lokale Relation die Fragmente R1 und R2 . Die • DB-Partition eines Rechners besteht aus der Menge seiner lokalen Relationen. 15.3 Transparenz Begriffsdefinition Grad der Unabhängigkeit, den ein VDBMS dem Benutzer beim Zugriff auf veteilte Daten vermittelt Die Anforderungen an Mehrrechner-DBMS sollen natürlich auch von Verteilten DBMS erfüllt werden, insbesondere hohe Leistungsfähigkeit, hohe Verfügbarkeit, Verteilungstransparenz sowie Unterstützung dezentraler (geographisch verteilter) Organisationsstrukturen. 15.3.1 Fragmentierungstransparenz Eine Relation der Datenbank sollte verteilt an mehreren Knoten gespeichert werden können. Die dabei zugrundeliegende Fragmentierung der Relation braucht der Anwender aber nicht zu wissen (im Beispiel wären die Tabellen Vorlesungen und Professoren jeweils in verschiedene Fragmente aufgeteilt): 1 2 select Titel, Name from Vorlesungen, Professoren where gelesenVon = PersNr Ohne Fragmentierungstransparenz dagegen müsste u.U. auf jedes der drei Fragmente explizit zugegriffen werden. 78 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 15.4 Beispielaufgabe aus dem Unterricht 15.3.2 Allokationstransparenz Die Benutzer müssen die Fragmentierung kennen, aber nicht den „Aufenthaltsort“ eines Fragments: d.h., dass wir dann eben wissen müssen, in welchen Fragmenten welche Spalten abgespeichert werden. Um den vollständigen Datensatz zu rekonstruieren, muss er wieder aus den Fragmenten zusammengestellt werden (vgl. JOIN der beiden Tabellen im folgenden Beispiel): 1 2 3 4 select sum (Gehalt) from ProfVerw, TheolProfs -- Spalten sind in versch. Tabellen verteilt where ProfVerw.PersNr = TheolProfs.PersNr and Rang = ’C4’; 15.3.3 Lokale Schema-Transparenz Der Benutzer muss zusätzlich zum Fragment auch noch den Rechner kennen, auf dem das Fragment liegt: 1 2 select Name from TheolProfs AT STheol where Rang = ’C3’; -- AT verweist auf die DB 15.4 Beispielaufgabe aus dem Unterricht Die Studenten-Tabelle bekommt noch das Attribut Abteilung und ist entsprechend verteilt (I-, E-,..,Station): Studenten s verteilt auf die Fragmente sI und sE und . . . . • Studenten-I sI liegen auf db-1 und db-2 (db-2 ist eine OO-DB) • Studenten-E sE liegen auf db-3 Sämtliche Studenten sollen aufgelistet werden. Schreiben Sie das select-statement, wenn (nur) gilt: Beispiel 58: transparente Fragmentierung 1 select * from S Beispiel 59: transparente Allokation 1 2 3 Select * from sI UNION select * from sE Beispiel 60: lokale Schematransparenz 1 2 3 Select * from sI AT db-1 union select * from sE AT db-3 Beispiel 61: Skizzieren Sie die Suchoperationen in einer Anwendung mit einer OO-DB (OQL) c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 79 15.5 1 2 3 Sperren von Replikationen select stud from stud in alleSI at db-2 union select stud from stud in alleSE at db-3 15.5 Sperren von Replikationen Angenommen, zu einem Datum A gäbe es mehrere Kopien A1, A2, ..., An , die auf unterschiedlichen Stationen liegen. Bei Änderungstransaktionen müssen aber alle bestehenden Kopien geändert werden. 15.5.1 Quorum-Consensus Verfahren10 Das gewichtete Voting (lat. Quorum Consensus) ist ein Verfahren, das die Datenintegrität bei replizierten Datenbanken gewährleisten soll. Dazu wird mit einem Quorum gearbeitet. Daten, die zu einer Partition gehören dürfen nur operieren, wenn sie das Quorum besitzen. Jeder Knoten des Systems erhält so ein Gewicht und besteht ein sogenanntes Lesequorum RT und ein Schreibquorum WT, das bei einem Zugriff erfüllt werden muss. Für das Setzen von RT und WT muss gelten: Gewichte , nur bei Mehrheit wird geschrieben W T = Summe aller 2 W T + RT > Summe aller Gewichte, so wird beim Lesen mindestens eine aktuelle Version gefunden Beim Schreiben eines Datums muss die Summe der Gewichte der beschriebenen Knoten das Schreibequorum erreichen. So wird nur bei Mehrheit aktualisiert und nur eine Partition kann Änderungen vornehmen, die Konsistenz der Datenbank bleibt erhalten. Die Knoten, die an dem Quorum teilnehmen werden aktualisiert, andere Knoten behalten ihren alten Wert. Beim Lesen muss das Lesequorum erreicht werden, es werden also im Allgemeinen mehrere Knoten gelesen. Beispiel 62: Schreibzugriff durch Master mit Ausfallmöglichkeit Gegeben seien 5 Knoten mit je einem Gewicht von 1. Setzt man RT = 1 und WT = 5, so bedeutet das, dass für eine Leseoperation nur ein Knoten zustimmen muss. Für einen Schreibzugriff muss man hingegen auf alle Ressourcen schreiben. Dieses System wäre allerdings nicht ausfallsicher. Man könnte hingegen auch WT = 4 setzen und RT = 2; hier wäre Schreiben beim Ausfall eines Knotens noch möglich. 15.6 Replikationsarten Replikation bezeichnet die mehrfache Speicherung derselben Daten an meist mehreren verschiedenen Standorten und die Synchronisation dieser Datenquellen. Nebst dem Quorum-Consensus Verfahren, gibt es noch folgende Replikationsarten. Diese sind jedoch nicht streng synchronisiert. 10 http://de.wikipedia.org/wiki/Gewichtetes_Votieren 80 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 15.6 Replikationsarten 15.6.1 Snapshot Replikation Die Daten werden auf allen Systemen verteilt. Bei einer Änderung wird nicht zuerst überprüft ob die Daten noch aktuell sind. Die Daten werden beispielsweise nur einmal Täglich synchronisiert. Hierbei wird wieder ein kompletter Snapshot auf das entfernte System geschrieben. Snapshot Replikation wird vorzugsweise benutzt wenn folgendes zutrifft: • • • • Daten ändern selten. Redundante, inkonsistente und veraltete Daten können über eine gewisse Zeit akzeptiert werden. Es werden nur wenige Daten repliziert. Es treten viele Änderungen, aber währen einer kurzen Zeitspanne auf. 15.6.2 Transaktionale Replikation Die Transaktionale Replikation beginnt normalerweise mit einem Snapshot der Datenbank. Änderungen bei der „Hauptdatenbank“ (Publisher) werden schnellst möglich an die Verteilte Station (Subscriber) weitergeleitet. Subscribers sollten Read-Only eingestellt sein. • • • • Subscriber sollen aktuell gehalten werden. Es wird eine geringe Latenz zwischen geänderten und gelesenen Datenständen erwartet. Der Publisher ändert Daten häufig. der Publisher ist eine non-SQL Datenbank, beispielsweise Oracle. 15.6.3 Merge- Replikation Im Gegensatz zur Snapshot Replikation werden bei der Merge- Replikation auch Änderungen auf dem Subscriber berücksichtigt. Diese Art wird hauptsächlich eingesetzt wenn folgendes zutrifft: • • • • Viele Subscribers ändern die gleichen Daten an verschiedenen Zeitpunkten. Subscribers müssen Daten offline ändern können und erst später synchronisieren. Jeder Subscriber benötigt eine andere Datenpartition. Häufiges ändern eines einzigen Eintrages bevor synchronisiert wird. Bestehen Konflikte müssen delektiert und gelöst werden können. Dies muss unter umständen manuell geschehen. c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 81 16 OLTP, Data Warehouse, Data Mining 16.1 OLTP: Online Transaction Processing im Dialogbetrieb ablaufende Massendatenverarbeitung in operativen DV-Systemen, bei der betriebswirtschaftliche Transaktionen direkt und prompt – also ohne nennenswerte Zeitverzögerung – erfasst und verarbeitet werden. Merke: OLTP (On-line Transaction Processing) is characterized by a large number of short on-line transactions (INSERT, UPDATE, DELETE). The main emphasis for OLTP systems is put on very fast query processing, maintaining data integrity in multi-access environments and an effectiveness measured by number of transactions per second. In OLTP database there is detailed and current data, and schema used to store transactional databases is the entity model (usually 3NF). (http://datawarehouse4u.info/OLTP-vs-OLAP.html) Das technische Hauptaugenmerk beim OLTP liegt auf der Transaktionssicherheit bei parallelen Anfragen und Änderungen, auf der Minimierung der Antwortzeit von Anfragen sowie auf einem möglichst hohen Durchsatz (Anzahl Transaktionen pro Zeiteinheit). Die Effizienz von OLTP-Systemen ist dabei von der Auswahl geeigneter Hardware (Datenbankserver, Netzwerkkommponenten wie LAN und WAN) und Software (Datenbankmanagementsystem) abhängig. Durch die Beachtung von Transaktionskriterien (siehe ACID, Kasten in Kapitel 9.1.1 auf Seite 54) wird sichergestellt, dass die Konsistenz der Datenbank (es können heutzutage auch mehrere verteilte sein) erhalten bleibt und Daten nie unvollständig oder inkonsistent gespeichert werden. (http://de.wikipedia.org/wiki/ Online_Transaction_Processing) 16.1.1 OLAP: Online Analytical Processing – das Gegenteil von OLTP OLAP-Auswertungen bilden die Grundlage für die Strategische Unternehmensplanung und beziehen ihre Daten entweder aus den operationalen Datenbeständen eines Unternehmens oder aus einem Data-Warehouse (Datenlager). Hierdurch wird verhindert, dass die Analysedaten mit den transaktionsorientierten Datenbeständen in Kontakt kommen, und die Leistungsfähigkeit beeinträchtigt wird. Ebenso ist die Leistung eines OLAP-Systems von der verwendeten Datenhaltungsform und deren Anbindung an den Analyse-Client abhängig. Merke: OLAP ist spezielles query processing! Dafür kann insbesondere SQL benutzt werden. In OLAP database there is aggregated, historical data, stored in multi-dimensional schemas (usually star schema). (http://datawarehouse4u.info/OLTP-vs-OLAP.html) 82 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 16.2 Data Warehouse Im Gegensatz zum Online-Transaction-Processing (OLTP) steht hier die Durchführung komplexer Analysevorhaben im Vordergrund, welche ein sehr hohes Datenaufkommen verursachen. Die OLAP zugrunde liegende Struktur ist ein OLAP-Würfel (englisch cube), der aus der operationalen Datenbank erstellt wurde. Dieser folgt einer multidimensionalen, datenpunktorientierten Logik im Gegensatz zur zeilenorientierten Logik beim Online-Transaction-Processing (OLTP). (http://de.wikipedia.org/ wiki/Online_Analytical_Processing) 16.2 Data Warehouse Data Warehouses sind „Super-Datenbanken“, welche vielfach aus vielen verschiedenen Datenbanken Sammlung und periodische bestehen. Sie sind speziell aufbereitet für ein schnelles von Daten: Auffrischung der Data Auslesen Warehouse-Daten OLTP-Datenbanken und andere Datenquellen OLAP-Anfragen Decision Support Data Mining D M G Data Warehouse (DW) © A. Kemper / A. Eickler 6 Abbildung 24: Sammlung und periodische Auffrischung der Data Warehouse-Daten Darin abgelegte Daten können durchaus inkonsistent (Verstoss gegen Kriterien der Redundanzfreiheit) vorkommen, da die Aktualisierung ein mühsamer Prozess darstellt (z.B. Extraktion aus den operativen DBs, Transformation ins DW-Schema, Laden in die DW-DB)11 . 16.2.1 Stern-Schema Das Sternschema ist eine besondere Form eines Datenmodells, dessen Ziel nicht die Normalisierung ist, sondern eine Optimierung auf effiziente Leseoperationen. Das Schema setzt sich aus einer nicht redundanzfreien Faktentabelle (z.B. „Verkäufe“) und mehreren Dimensionstabellen (z.B. „Kunden“, „Produkte“, . . . ) zusammen, welche abfragefreundlich um eine Faktentabelle sternförmig geordnet werden und sich bei diesem Schema auf genau eine Faktentabelle beziehen. (https:// de.wikipedia.org/wiki/Sternschema) 11 Bei einem redundanzfreien Aufbau von Datenbanken werden Datensatzabfragen durch JOINS verknüpft – was oftmals sehr aufwändig sein kann c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 83 16.2 Data Warehouse Redundanzen in der Faktentabelle werden – wie gesagt – akzeptiert , da dies oft viel einfacher zu organisieren ist als die Daten beispielsweise immer redundanzfrei (z.B. ohne Mehrfacheinträge gleicher Entitäten) zu verwalten12 : Abbildung 25: Stern-Schema mit sehr grosser Faktentabelle und mehreren Dimensionstabellen 16.2.2 Verdichtung der Daten zu Datenwürfeln Ein CUBE ist so etwas wie ein „mehrdimensionaler Datenwürfel“, der alle möglichen Gruppierungen von Datenabfragen (mittels GROUP BY-Klausel der verschiedenen Attribute) aggregiert und zusammenfasst. Mit der GROUP BY CUBE-Klausel können beliebige n-dimensionale Auswertungen aggregierter Daten zusammengestellt und in einer Matrix gehalten werden: Beispiel 63: Der „cube“-Operator 1 2 3 4 5 6 7 8 select p.Hersteller, z.Jahr, f.Land, sum(v.Anzahl) -- Daten aus Faktentabelle ’Verkaeufe v’ und den Dimensionstabellen holen: from Verkaeufe v, Produkte p, Zeit z, Filialen f -- verdichten mit der Faktentabelle ’Verkaeufe v’: where v.Produkt = p.ProduktNr and p.Produkttyp = ’Handy’ and v.VerkDatum = z.Datum and v.Filiale = f.Filialenkennung -- Ergebnisse zu einem Datenwuerfel verdichten (--> GROUP BY CUBE): GROUP BY CUBE (z.Jahr, p.Hersteller, f.Land); 12 Die „JOINEREI“ entfällt dadurch (Olnhoff,11.05.2013). 84 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 16.2 Data Warehouse Zur Veranschaulichung: Würfeldarstellung D M G © A. Kemper / A. Eickler c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 23 85 17 XML-Datenmodellierung (mit Java-Bibliotheken, Fokus XQuery) 17.1 HTML-Datenmodell Das HTML-Datenmodell besitzt kein Schema. Folglich können nur „Insider“ diese Listen interpretieren. Das Datenmodell ist nur für Datenaustausch geeignet, wenn separat auch eine Beschreibung mitgeschickt wird. HTML-Modell „Nur“ Darstellung. Relationales Modell „Nur“ Daten mit ihrer Bedeutung. 17.1.1 XML-Datenmodell Das XML-Datenmodell liegt irgendwo dazwischen. • Semi-strukturierte Daten – Teilweise schematisch (well-formed Einschränkung) – Wenn ein Schema vorhanden, dann muss es eingehalten werden 13 – Das Schema bleibt sprechend. Beispiel 64: XML-Datenmodell 1 <?xml version="1.0" encoding="ISO-8859-1"?> 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <shiporder orderid="889923" xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" xsi:noNamespaceSchemaLocation="shiporder.xsd"> <orderperson>John Smith</orderperson> <shipto> <name>Ola Nordmann</name> <address>Langgt 23</address> <city>4000 Stavanger</city> <country>Norway</country> </shipto> <item> <title>Empire Burlesque</title> <note>Special Edition</note> <quantity>1</quantity> <price>10.90</price> </item> <item> 13 valide Einschränkung bzgl. einem Xschema 86 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 17.2 18 19 20 21 22 Schemabeschreibung <title>Hide your heart</title> <quantity>1</quantity> <price>9.90</price> </item> </shiporder> 17.2 Schemabeschreibung Beispiel 65: XSD zum XML-Datenmodell 1 <?xml version="1.0" encoding="ISO-8859-1" ?> 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="shiporder"> <xs:complexType> <xs:sequence> <xs:element name="orderperson" type="xs:string"/> <xs:element name="shipto"> <xs:complexType> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="address" type="xs:string"/> <xs:element name="city" type="xs:string"/> <xs:element name="country" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="item" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="title" type="xs:string"/> <xs:element name="note" type="xs:string" minOccurs="0"/> <xs:element name="quantity" type="xs:positiveInteger"/> <xs:element name="price" type="xs:decimal"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="orderid" type="xs:string" use="required"/> </xs:complexType> </xs:element> </xs:schema> c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 87 17.3 Anfragesprachen, Fokus: XQuery 17.3 Anfragesprachen, Fokus: XQuery 17.3.1 XML-Anfragesprache XQuery und FLWOR-Regel XQuery ist eine Sprache mit der Anfragen an XML-Dokumente gestellt sowie Ergebnisdokumente generiert werden können. Dabei spielt XPath eine wichtige Rolle. Beispiel 66: Pfadausdrücke XPath document(“uni.xml“)/Fakultäten/Fakultät[FakName=“Physik“] //Vorlesung document(“uni.xml“)/Fakultäten/Fakultät[2]//Vorlesung document(“uni.xml“)/Fakultäten/Fakultät[FakName=“Physik“]/ ProfessorIn/Vorlesungen/Vorlesung document(“uni.xml“)//Vorlesung[Titel=“Mäeutik“]/@Voraussetzungen→/Titel Beispiel 67: XQuery Abfrage Selektiere PersNr und Name aller Professoren der Fakultät „Physik“ und sortiere nach deren Namen absteigend 1 2 3 4 5 6 7 8 -- Hinweis: "WHERE"-Klausel kann auf zwei verschiedene Arten erfolgen select unixml.query(’ for $p in //Fakultaet[FakName="Physik"]/ProfessorIn where $p/../FakName = "Physik" order by $p/Name[1] descending return <Prof><PersNr>{data($p/@PersNr)}</PersNr>{$p/Name}</Prof> ’) as prof from dbo.uniTb Ergebnis: 1 2 3 4 5 6 7 8 <Prof> <PersNr>2127</PersNr> <Name>Kopernikus</Name> </Prof> <Prof> <PersNr>2136</PersNr> <Name>Curie</Name> </Prof> Merke: Eine zentrale Rolle in XQuery spielen die sogenannten FLWOR-Ausdrücke (ausgesprochen: flower). FLWOR ist eine Abkürzung für die Konstrukte for, let, where, order by und return, und kann als 88 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 17.3 Anfragesprachen, Fokus: XQuery Analogie zu den (SELECT, FROM, WHERE) - Konstrukten in SQL betrachtet werden.a a http://de.wikipedia.org/wiki/XQuery#FLWOR-Ausdr.C3.BCcke c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 89 17.4 Java API Zusammengefasst: • XQuery basiert auf XPath • Formuliert mit FLWOR-Ausdruck: FOR – LET (Variablen definieren) – WHERE – ORDER – RETURN • Freudig: MSSqlServer-2012 unterstützt LET • Traurig: XQuery unterstützt → (Dereferenzierung) nicht, umständliche Formulierunt mit contains Wichtige Befehle: • $x//zzz: rekursive Suche nach zzz innerhalb $x • $x/zzz: Suche nach direktem Nachfolger zzz innerhalb $x • @hoert bedeutet: hoert ist ein Attribut • $s in //Student bedeutet: ist eine Variable, welche die Inhalte aller Studentenknoten der gesamten Datenstruktur (beliebige Tiefe!) temporär speichert • CONTAINS(haystack, needle): sucht nach needle in der Liste haystack • return $v/../../Name): liefert den Knoten Name zwei Elternelemente (Ebenen) höher als $v 17.3.2 XQuery-Implementation mit CONTAINS CONTAINS sucht innerhalb einer Werteliste nach einem bestimmten Wert. Beispiel 68: XQuery Abfrage mit CONTAINS Geben Sie die Namen der Professoren aus, die eine Vorlesung halten, die vom Studenten „Carnap“ besucht wird: 1 2 3 4 5 6 7 SELECT uniXml.query(’ for $v IN //Vorlesung, $s in //Student where $s//Name = "Carnap" and CONTAINS($s/@hoert, $v/@VorlNr) return $v/../../Name’) FROM irgendeinetabelle; 17.4 Java API 17.4.1 Java: simple API for XML (SAX) • Instanzierung eines SAXParser-Objekt p • Eine eigene Klasse h extends DefaultHandler p.parse(xml-datei, h) damit werden beim Parsen aufgerufen in h • startElement, endElement – mit aktuellem tag 90 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 17.4 Java API • characters mit aktuellen Werten • ... Beispiel 69: MySax.java 1 package mysax; 2 3 4 5 6 7 8 import import import import import import java.io.File; javax.xml.parsers.SAXParser; javax.xml.parsers.SAXParserFactory; org.xml.sax.Attributes; org.xml.sax.SAXParseException; org.xml.sax.helpers.DefaultHandler; 9 10 /* 11 kleines Beispielprogramm zur Demo für das SAX-Interface SAX = Simple API for XML relevante Methoden des DefaultHandlers werden überschrieben für die Suche in uni.xml nach for $r in //ProfessorIn where $r/Name = "Curie" return $r/Raum Die Raum-Nr kommt nach System.out Mein Suchverfahren mag umständlich sein. Wichtig zum gesamten Verständnis sind Verständnis und Nutzen der Methoden: startElement, endElement, characters Als Kommentare sind Ausgaben * für alle Aufrufe programmiert. */ // myXmlFile = "c:\\temp\\uni.xml": ist das Ihre Test-Datei?? public class MySax extends DefaultHandler { private static final String myXmlFile = "c:\\temp\\uni.xml"; String[] tagnames = new String[100]; // speichert Elementhierachie // root hat index=0 int tagIndex = 0; boolean b1Found = false; // Variable um Kontext für die Suche zu speichern boolean b2Found = false; 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 * * * * * * * * * 30 31 public static void main(String param[]) { 32 33 34 DefaultHandler handler = new MySax(); // damit werden IHRE Handler-Methoden aufgerufen (siehe @Override) 35 36 37 File datei = new File(myXmlFile); boolean laden = datei.canRead(); 38 39 if (laden) { c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 91 17.4 Java API try { SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setValidating(true); SAXParser saxParser = null; 40 41 42 43 44 saxParser = factory.newSAXParser(); 45 46 saxParser.parse(datei, handler); // Parsing und verarbeitung mit IHREN handler-Methoden 47 48 } catch (SAXParseException error) { System.out.println("\n+++Parse Error+++\nZeile: " + error.getLineNumber() + ", message=" + error.getMessage() + ", Datei: " + error.getSystemId()); } catch (Exception e) { System.out.println(e.getMessage()); } 49 50 51 52 53 54 55 56 57 58 59 60 } 61 62 } 63 64 @Override public void startElement(String namespaceURI, String sName, String qName, Attributes attrs) { tagIndex++; tagnames[tagIndex] = qName; // System.out.println("start:"+ qName); // die Attribute (tags + Werte sind auch verfügbar /* * for (int i=0;i<attrs.getLength();i++) { System.out.println( * "n="+attrs.getLocalName(i)+";v="+ attrs.getValue(i)); } */ } 65 66 67 68 69 70 71 72 73 74 75 76 @Override public void endElement(String namespaceURI, String sName, String qName) { // sName: short name when using namespaces, qName=tagName (with prefix) // System.out.println("end:"+ qName); tagIndex--; if (qName.compareTo("ProfessorIn") == 0) { b1Found = false; 77 78 79 80 81 82 83 92 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 17.4 Java API } 84 } 85 86 @Override public void characters(char[] ch, int start, int length) { String s = new String(ch, start, length); if (s.trim().length() > 0) // es werden auch leer-strings à 14 bergeben { // System.out.println(tagnames[tagIndex] + ":" + s); if (tagIndex <= 1) { b1Found = false; return; } if ((tagnames[tagIndex].compareTo("Name") == 0) && (tagnames[tagIndex - 1].compareTo("ProfessorIn") == 0) && s.compareTo("Curie") == 0) { b1Found = true; } else if ((tagnames[tagIndex - 1].compareTo("ProfessorIn") != 0)) { b1Found = false; } if (b1Found && (tagnames[tagIndex].compareTo("Raum") == 0)) { System.out.println("********" + s); } } } 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 } 17.4.2 Java: DOM-Interface for XML DOM = Document Object Model • • • • Gesamte Xml-Datei wird zu einem Document-Object doc Ein Pfadausdruck wird zum XPathExpression-Objekt expr expr.evaluate(doc, . . . ) gibt die gesuchten Elemente Nodes Nodes werden traversiert (u.a. getChildNodes) Beispiel 70: MyDom.java 1 2 3 4 5 6 7 8 /* kleines Beispielprogramm zur Demo f????r das DOM-Interface DOM = Document Object Model * Wir k??nnen direkt nach Unterb??umen suchen (NodeLists) * * hier die Suche in uni.xml nach for $r in //ProfessorIn where $r/Name = "Curie" return $r/Raum * Die Raum-Nr kommt nach System.out * compile-Aufruf mit einer XPath-expression ist entscheidend. * / * c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 93 17.4 9 10 Java API // Sie m??ssen myXmlFile (Test-Datei) anpassen?? package mydom; 11 12 13 14 15 16 17 18 19 20 import import import import import import import import import javax.xml.parsers.DocumentBuilder; javax.xml.parsers.DocumentBuilderFactory; javax.xml.xpath.XPath; javax.xml.xpath.XPathConstants; javax.xml.xpath.XPathExpression; javax.xml.xpath.XPathFactory; org.w3c.dom.Document; org.w3c.dom.Node; org.w3c.dom.NodeList; 21 22 23 public class MyDom { private static final String myXmlFile = "c:\\temp\\uni.xml"; 24 public static void doNodeList(NodeList nodes) { // gesamte Hierarchien werden ausgegeben (bis zu den Werten) try { // System.out.println("Anzahl Nodes = " + nodes.getLength()); for (int i = 0; i < nodes.getLength(); i++) { Node node = nodes.item(i); if (node.getNodeType() == Node.TEXT_NODE) { if (node.getNodeValue().trim().length() > 0) { System.out.println("Wert=" + node.getNodeValue()); } } else { System.out.println("N=" + node.getNodeName()); if (node.hasChildNodes()) { doNodeList(node.getChildNodes()); } } } } catch (Exception ex) { System.out.println(ex.getMessage()); } } 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 public static void main(String[] args) { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance() ; factory.setNamespaceAware(true); // never forget this! 49 50 51 52 94 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 17.4 DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(myXmlFile); XPathFactory xPF = XPathFactory.newInstance(); XPath xp = xPF.newXPath(); XPathExpression expr = xp.compile( //XPath-expression "//ProfessorIn[Name=\"Curie\"]/Raum/text()"); // without text () one more hierarchy // "//ProfessorIn[Name=\"Curie\"]/Raum"); Object result = expr.evaluate(doc, XPathConstants.NODESET); NodeList nodes = (NodeList) result; doNodeList(nodes); 53 54 55 56 57 58 59 60 61 62 } catch (Exception ex) { System.out.println(ex.getMessage()); } 63 64 65 66 } 67 68 Java API } c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 95 17.4 Java API Übersicht über alle Beispiele Beispiel 1: Ehe – ein Beziehungstyp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Beispiel 2: Bestellwesen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Beispiel 3: Menge aller Teilmengen einer Relation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Beispiel 4: Relation zweiter Punkte mittels gerichtetem Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Beispiel 5: Relationen in Z . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Beispiel 6: Zusammensetzung von Relationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Beispiel 7: Darstellung von Relationen durch Matrizen (I) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Beispiel 8: Darstellung von Relationen durch Matrizen (II) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Beispiel 9: Kongruenz modulo m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Beispiel 10: Division – Welcher Lieferant kann ALLE (beide) Teilchen aus Tabelle T liefern? . . . . 21 Beispiel 11: Eine neue Tabelle erstellen mit Fremdschlüsselbeziehung REFERENCES . . . . . . . . . . . 25 Beispiel 12: Mehrere Tabellen mit Fremdschlüsseln erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Beispiel 13: Löschen von Tupeln (DELETE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Beispiel 14: Verändern von Tupeln (UPDATE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Beispiel 15: Duplikateliminierung beim Auslesen (SELECT DISTINCT) . . . . . . . . . . . . . . . . . . . . . 26 Beispiel 16: Welcher Professor liest "Mäeutik"? (WHERE ...AND) . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Beispiel 17: JOIN und COUNT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Beispiel 18: Aggregatfunktionen AVG, SUM, GROUP BY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Beispiel 19: Ergebnis durch Bedingungen mittels HAVING einschränken . . . . . . . . . . . . . . . . . . . . . . . 27 Beispiel 20: Verschachtelte SELECT-Abfragen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Beispiel 21: Existenzquantor (NOT) EXISTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Beispiel 22: Entscheidungen mittels CASE ...WHEN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Beispiel 23: Syntax von JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Beispiel 24: mehrere Verknüpfungen direkt hintereinander . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Beispiel 25: Rekursion (händisch) – oder die direkten Vorgänger von «Der Wiener Kreis» . . . . . . . . 30 Beispiel 26: Rekursion über die „tmpTbl“ mittels WITH ... UNION ALL ... SELECT . . . . 31 Beispiel 27: Verschachtelte Abfrage mit IN (Mengenabfrage; mindestens ein Wert muss vorliegen) 32 Beispiel 28: Sicht mit zwei Spalten («Name» und «GueteGrad») als Rückgabewert . . . . . . . . . . . . . . 32 Beispiel 29: kompletter JAVA-Code zur Initialisierung und Auswertung von SQL-Statements . . . . . 33 Beispiel 30: JAVA-Code zum Ausführen eines INSERT / UPDATE-Statements . . . . . . . . . . . . . . . . . . 34 Beispiel 31: Prepared Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Beispiel 32: Rückgabe der neu generierten ID bei INSERT-Statement . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Beispiel 33: Row-Level Trigger BEFORE UPDATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Beispiel 34: Row-Level Trigger AFTER INSERT und Umbenennung der Übergangsvariablen NEW 37 Beispiel 35: Trigger in MS-SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Beispiel 36: DB-Prozedur (Stored Procedure) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 96 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 17.4 Java API Beispiel 37: Zwei funktionale Abhängigkeiten (PLZ und AHV-Nummer) . . . . . . . . . . . . . . . . . . . . . . . 39 Beispiel 38: Sequentielle Suche im B-Baum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 Beispiel 39: Höhe eines im B∗ -Baumes bei einer Suche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Beispiel 40: Anzahl der Blockzugriffe in einem B*-Baum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Beispiel 41: Anzahl der nötigen Blöcke in einem B*-Baum (mit Verweisen) . . . . . . . . . . . . . . . . . . . . 46 Beispiel 42: Berechnung der Restklassen bei Statischem Hashing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 Beispiel 43: SQL-Select und optimierte relationale Algebra (ohne Baum) . . . . . . . . . . . . . . . . . . . . . . . 50 Beispiel 44: SQL-Select und optimierte relationale Algebra (mit Baum) . . . . . . . . . . . . . . . . . . . . . . . . 50 Beispiel 45: Beispieltransaktion auf Basis des Universitätsschemas: . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Beispiel 46: neuen User erfassen mittels CREATE USER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Beispiel 47: Zugriff ermöglichen (SELECT / UPDATE zulassen) mittels GRANT . . . . . . . . . . . . . . . 63 Beispiel 48: Entzug von Rechten (des UPDATE-Statements) mittels REVOKE . . . . . . . . . . . . . . . . . . 63 Beispiel 49: Änderungsbeschränkung mit GRANT auf bestimmten Daten (VIEW) . . . . . . . . . . . . . . 64 Beispiel 50: Modellierung mit „inverse“ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 Beispiel 51: Typeigenschaften: Extensionen EXTENT und Schlüssel key . . . . . . . . . . . . . . . . . . . . . 66 Beispiel 52: Abfrage in OQL über eine Collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 Beispiel 53: Erzeugung von Objekten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 Beispiel 54: Objekterzeugung und Ballung von Objekten (= Angabe zur Platzierung im Speicher [C++]) 67 Beispiel 55: Verschachtelte Transaktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 Beispiel 56: Objektorientierte Datenbank . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 Beispiel 57: Entity-Klasse JVorlesungen.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 Beispiel 58: transparente Fragmentierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 Beispiel 59: transparente Allokation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 Beispiel 60: lokale Schematransparenz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 Beispiel 61: Skizzieren Sie die Suchoperationen in einer Anwendung mit einer OO-DB (OQL) . . . 79 Beispiel 62: Schreibzugriff durch Master mit Ausfallmöglichkeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 Beispiel 63: Der „cube“-Operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Beispiel 64: XML-Datenmodell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 Beispiel 65: XSD zum XML-Datenmodell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Beispiel 66: Pfadausdrücke XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Beispiel 67: XQuery Abfrage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Beispiel 68: XQuery Abfrage mit CONTAINS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 Beispiel 69: MySax.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 Beispiel 70: MyDom.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 c The Software Bakery | Bruno Leupi, Tobias Maestrini, Edy Wermelinger 97