Modularisierung von Software • Speicherung von Daten (Datenbank-Komponente, database, DB) • Verarbeitung von Daten (GeschäftsprozessKomponente, business process, BP) • Benutzung der Daten (Benutzer-Schnittstelle, user interface, UI) 1 • Suchen, fetch) Datenbanksystem, DBS Finden (retrieval, find, lookup, • Einfügen (insert) • Aktualisieren, Modifizieren (update, modify) • Löschen (delete, remove) von Daten und Information. CRUD, CDUR, RUDI 2 Information, Daten über alle unterscheidbaren Objekte eines Unternehmens und deren Beziehungen: • Entität (entity) • Beziehung (relationship) • Eigenschaft (property) 3 Komponenten eines DBS • Datenbank (DB) • Datenbankmanagementsystem (DBMS) • Benutzer 4 Datenbank • Die DB repräsentiert einen Aspekt der realen Welt, genannt Miniwelt oder Universe of Discourse (UoD). • Die DB ist eine logisch zusammenhängende Sammlung von Daten mit inhärenter Bedeutung. • Die Daten der DB werden für einen bestimmten Zweck gesammelt. 5 Datenbank • integrated • shared 6 Eigentliche Daten Primärdaten DB-Zustand DB-Extension DB-Ausprägung DB selbstbeschreibend Beschreibung der Daten Metadaten DB-Schema DB-Intension Katalog 7 DBMS • Definition der Daten in der DB • Speichern von Daten in der DB • Manipulation von Daten der DB • Darstellung von Daten der DB 8 Benutzer • Anwendungsprogrammierer (application programmers, system analysts) • Endbenutzer: Sie verkehren mit der Datenbank über ein Anwendungsprogramm oder direkt über das DBMS. • Daten-Administrator und Datenbank-Administrator: Der Daten-Administrator (DA, data administrator) trägt die zentrale Verantwortung für die Daten eines Unternehmens und fällt die strategischen Entscheidungen bezüglich der Daten. Der Datenbank-Administrator (DBA, database administrator) ist verantwortlich für die Implementation der Entscheidungen des DA. 9 Datenunabhängigkeit • program – data independence • program – operation independence 10 DBS – Architektur = Schema zur Beschreibung von DBS ANSI/SPARC – Modell ANSI/X3/SPARC ANSI/X3/SPARC Study Group on Data Base Management Systems 11 ANSI/SPARC – Modell Externe Ebene Externe Ebene Q Q Externe Ebene Q Q Q Q Konzeptuelle Ebene Interne Ebene 12 Beispiel Konzeptuelle Ebene Angestellter Name Nummer Abteilung Gehalt 13 Beispiel Interne Ebene Depardieux\t3264\tKlassiker\t4725.8\n Belmondo\t3914\tKomödie\t5207.26\n Delon\t372\tThriller\t7203\n Bronson\t11122\tWestern\t6134.32\n 14 Beispiel Externe Ebene Kennung 372 3264 3914 11122 Lohn 7.203,00 4.725,80 5.207,26 6.134,32 15 Beispiel Externe Ebene Name Depardieux Belmondo Bronson Delon Abteilung Kosten Klassiker 57 Komödie 63 Western 74 Thriller 87 16 Leistungen • Logische Datenunabhängigkeit • Physische Datenunabhängigkeit • Aber: Die Abbildungen zwischen den Ebenen werden durch Änderungen in den Ebenen berührt. 17 Konzeptuelle Ebene • konzeptuelle Sicht (conceptual view) ist eine Repräsentation des gesamten Informationsgehalts der DB. • konzeptuelle Datensätze (conceptual record) • konzeptuelles oder logisches Schemas (conceptual schema) • datenunabhängig • Zugriffsrechte und Integritätsregeln • high-level oder konzeptuelles Datenmodell 18 Interne Ebene • interne Sicht (internal view) ist eine Repräsentation der gesamten DB. • internen Datensätzen (internal record) • unendlich großer linearer Adressraum • internes Schema (Speicherstrukturdefinition) (internal schema, storage structure definition) • Repräsentations- oder Implementationsmodell (representational or implementation data model). • physisches Datenmodell (physical, low-level data model) 19 Externe Ebene • Die externe Ebene ist die Ebene des einzelnen Benutzers. • externe Sicht (external view) • externe Datensätze (external record), logische Datensätze (logical record) • externen Schemas (external schema) • Hierarchie von externen Schemata 20 Sprachen • DSL (data sublanguage) – enge (tightly coupled) Kopplung – lose (loosely coupled) Kopplung • Beispiel: SQL • Komponenten: – Datendefinitionssprache (data definition language, DDL + (CDL)) – Datenmanipulationssprache (data manipulation language, DML) 21 DDL – Sprachen • Prinzipiell hat jede Ebene ihre eigene Sprache. • Interne Ebene: DDL → SDL (storage definition language) • Externe Ebene: DDL → VDL (view definition language) • Konzeptuelle Ebene: DDL → DDL • SQL kann alles sein. Trend: Elimination von SDL-Anteilen 22 DML – Sprachen • high-level oder deklarative oder nichtprozedurale oder set-at-a-time oder Mengenorientierte Sprachen, die es erlauben DBOperationen in knapper Form interaktiv oder embedded auszudrücken. • low-level oder prozedurale oder record-at-atime oder Datensatz-orientierte Sprachen, die in einer Hostsprache eingebettet sein müssen. Hier werden einzelne Datensätze ermittelt und bearbeitet. 23 Benutzerfreundliches UI Menübasierte Oberfläche: Ein Angebot von Optionen (Menü) führt den Benutzer bei der Formulierung einer Anfrage. Beliebt sind Zeilen- und Pulldown-Menüs und die Verwendung von Funktionstasten für naive Benutzer. Graphische Oberfläche: Teile des DB-Schemas werden als Diagramm dargestellt. Der Benutzer kann Anfragen formulieren, indem er das Diagramm manipuliert. Kombiniert wird das i.a. mit Menüs. 24 Benutzerfreundliches UI Formularbasierte Oberfläche: Dem Benutzer wird ein Formular angeboten, das er auszufüllen hat, um entweder diese Daten zu speichern oder zu suchen. Formular-Spezifikations-Sprachen ermöglichen die leichte Entwicklung solcher formular-basierter Oberflächen für den naiven Benutzer zur Durchführung von Standard-Transaktionen (canned transaction). Natürlichsprachliche Oberfläche: Diese Oberflächen akzeptieren Anfragen, die in Englisch oder anderen Sprachen formuliert werden können. Dialoge helfen bei der Klärung von Missverständnissen. 25 Datenbankadministrator – DBA Daten-Administrator (DA): Hat zentrale Verantwortung für die Daten. Kennt die Bedeutung der Daten für das Unternehmen. Datenbank-Administrator (DBA): Ist eine informationstechnisch ausgebildete Person, die dafür verantwortlich ist, dass die Entscheidungen des DA implementiert werden. Richtet die Datenbank ein, vergibt die Zugriffsrechte nach den Richtlinien des DA. Er ist auch für die Leistungsfähigkeit des Systems verantwortlich. Dazu mag es erforderlich sein, eine Gruppe von Systemprogrammierern zu leiten. 26 Aufgaben des DBA • Definition des konzeptuellen Schemas: DA bestimmt die für das Unternehmen relevanten Entitäten, deren Eigenschaften und Beziehungen. Dieser Prozess heißt logisches oder konzeptuelles Datenbankdesign (logical or conceptual database design). Auf Grund dieses Designs wird der DBA unter Verwendung der konzeptuellen DDL das konzeptuelle Schema erstellen. • Definition des internen Schemas: Der DBA entscheidet, wie die Daten in der gespeicherten DB repräsentiert werden sollen. Physisches Datenbankdesign (physical database design). 27 Aufgaben des DBA • Betreuung der Benutzer: Der DBA sorgt dafür, dass einem Benutzer die Daten zur Verfügung stehen, die er benötigt. Unterstützt Erstellung externer Schemata. • Definition von Zugriffsrechten und Integritätsregeln • Definition von Datensicherungsmechanismen (backup und recovery): • Überwachung der Systemleistung: Anpassungen des internen Schemas • Reaktion auf sich ändernde Anforderungen an die DB: Hier kann es auch mal zu einem Eingriff in das konzeptuelle Schema kommen. 28 Datenbankmanagementsytem Alle Zugriffe auf die DB gehen über das DBMS. 1. Der Benutzer formuliert eine Anforderung an die DB unter Verwendung einer DSL. 2. Das DBMS fängt die Anforderung ab und analysiert sie. Dabei verwendet das DBMS das externe Schema des betreffenden Benutzers, die entsprechende Abbildung extern↔konzeptuell, das konzeptuelle Schema, die Abbildung konzeptuell↔intern und das interne Schema. 3. Das DBMS führt die notwendigen Operationen an der gespeicherten DB durch. 29 Funktionen des DBMS Datendefinition: Das DBMS muss in der Lage sein, Datendefinitionen, d.h. externe, konzeptuelle, interne Schemata im Quellcode zu akzeptieren und in einen geeigneten Objektcode zu übersetzen. Das DBMS hat Compiler für die verschiedenen DDLs. 30 Funktionen des DBMS Datenmanipulation: Zum Verarbeiten von DMLs muss das DBMS entsprechende Komponenten haben. DML-Anforderungen können geplant oder ungeplant sein. geplant: operative oder Produktionsanwendungen, compiled oder canned transaction ungeplant: Ad-hoc-Anforderung (Anwendungen der Entscheidungsfindung, decision support) 31 Funktionen des DBMS Datensicherheit und –integrität Transaktionsmanager (transaction manager) Datenlexikon (data dictionary) Datenkatalog, Metadaten, directory, catalog, data repository, data encyclopedia 32 File-Manager • Kreiert und löscht Files. • Weiß nichts über die interne Datensatzstruktur und kann daher keine Anforderungen bearbeiten, die eine Kenntnis der Datensatzstruktur voraussetzen. • Zugriffsrechte und Integritätsregeln werden typischerweise nicht unterstützt. • Parallele Zugriffe werden typischerweise nicht unterstützt. 33 Datenkommunikation • Datenkommunikationsmanager (data communications manager (DC manager)) • Botschaften (communication messages) • DB/DC–System (database/data-communications system) 34 Client/Server–Architektur zweiteilige Struktur • Der Server ist das DBMS selbst. • Clients sind die verschiedenen Anwendungen, die das DBMS benutzen. 35 Anwendungsprogramme • Anwendungen, die vom Benutzer geschrieben werden. • Anwendungen, die der DBS-Lieferant zur Verfügung stellt, sogenannte Werkzeuge oder Tools. 36 Werkzeuge, Tools • Interpreter/Compiler für Zugriffssprachen (query language processors) • Interpreter/Compiler für natürliche Sprachen (natural language processors) • Berichtsgeneratoren (report writers) • Graphische Teilsysteme (graphics subsystems) • Tabellenkalkulation (spreadsheets) • Statistische Pakete (statistical packages) • Anwendungsgeneratoren (application generators, 4GL processors) • CASE–Produkte 37 Dienstprogramme (utilities) • Ladeprogramme (load, reload) • Entladeprogramme (unload, dump) • Reorganisationsprogramme (reorganization) • Statistische Programme, die statistische Kenngrößen der DB (Filegrößen, Zugriffshäufigkeiten) ermitteln und analysieren. 38 Verteilte Abarbeitung (distributed processing), DBMS(-backend), Frontends. • Parallele Verarbeitung • Die Server-Maschine kann speziell für DBMS-Zwecke ausgerüstet werden (database machine). • Die Client-Maschinen können auf die jeweiligen Anwendungen zugeschnitten werden. • Die Anwendungen sind den betrieblichen Gegebenheiten entsprechend räumlich trennbar. 39 Verteilte Abarbeitung DB auf verschiedene Server-Maschinen verteilt: • Ein Client kann auf eine beliebige Anzahl von Servern zugreifen, aber nur auf einen zur Zeit. Der Benutzer muss wissen, auf welchem Server sich die von ihm gewünschten Daten befinden. Er kann mit einem Zugriff nicht Daten von verschiedenen Servern kombinieren. • Ein Client kann gleichzeitig auf eine beliebige Anzahl von Servern zugreifen. Ein Zugriff kann Daten von verschiedenen Servern kombinieren. Der Benutzer muss nicht wissen, wo sich die Daten befinden (transparenter Zugriff). Für ihn verhalten sich die vielen Server wie ein Server. Man spricht jetzt von einem verteilten DBS (distributed DBS). 40 Entwicklung von Datenbanken 1. Definition einer Daten-Norm 2. Problembeschreibung 3. Analyse: Identifikation von Entitäten, Eigenschaften, Beziehungen 4. Design: • Erstellung des Entity-Relationship-Modells • Umsetzung in Relationen oder Klassen oder . . . 5. Implementation 6. Erstellung von Anwendungen 41 E/R-Modell — Objektorientierung E/R-Modell objektorientiert andere Bezeichnungen Entität als Typ Klasse Typ Entität als Objekt Objekt Instanz, Ausprägung, Exemplar, identifizierbares Etwas Beziehung Assoziation Verknüpfung ”Hat-ein”–Beziehung (has-a) Aggregation, Komposition ”Benutzt-ein”–Beziehung (uses-a) Ähnlichkeit (is-like-a) Eigenschaft Attribut (abgeleitet) Methode Operation, Botschaft, Verhalten 42 E/R-Modell — Objektorientierung E/R-Modell objektorientiert andere Bezeichnungen Obertyp Basisklasse Oberklasse, Superklasse, Supertyp, Eltertyp, Obermenge ”Ist-ein”–Beziehung (is-a), Erweiterung, Vererbung, Substitution, Generalisierung / Spezialisierung Untertyp Abgeleitete Unterklasse, Subklasse, Subtyp, Klasse Kindtyp, Teilmenge 43 Faches in einem oder mehreren Semestern an mehreren Terminen und Orten. Die Veranstaltung hat eine eindeutige Nummer und eine Prüfungsleistung. Die in einem Semester angebotenen Fächer erhalten eine Veranstaltungsnummer, die nur für dieses Semester gilt. Dazu wird der jeweilige Dozent angegeben und die Art der Lehrveranstaltung (Vorlesung, Praktikum, Seminar) sowie ihr Umfang in Semesterstunden. Die Notenbildung kann durch eine oder mehrere Prüfungsleistungen erfolgen (Präsentation, Projektarbeit, Klausur, mündliche Prüfung), die in unterschiedlichen Prozentsätzen gewichtet werden. Jede Klausur oder mündlicge Prüfung findet zu einem festgelegten Datum in einem Raum zu einer Uhrzeit statt und wird durch mindestens einen Dozenten beaufsichtigt. Zusätzlich soll die Dauer der Klausur oder mündlichen Prüfung vermerkt werden. Bei mündlichen Prüfungen muss ein zweiter Dozent dabei sein. Ein Student hat eine eindeutige Matrikelnummer, einen Namen und einen Studiengang. Liste von Substantiven: Fach, FachNummer, Titel, Studiengang, Veranstaltung, Wirtschaftsinformatik, Angewandte Informatik, Netzwerk- und Medientechnik, Faecherblock, Consulting, Informatik Durchfuehrung, Semester, Termin, Ort, Dozent, Art der Lehrveranstaltung, Vorlesung, Praktikum, Seminar, Umfang, Semesterstunden Notenbildung, Pruefungsleistung, Pruefung Prozentsatz, Praesentation, Projektarbeit, Klausur, Dauer, Muendliche Pruefung, Datum, Uhrzeit, StudentIn, Matrikelnummer, Name Raum, Liste nach 1. Bearbeitung: Fach, Nummer, Titel, Studiengang, Fach[*] Lehrgang Veranstaltung[*] Veranstaltung, Nummer, Termin[*] Semester Umfang Wirtschaftsinformatik,44Angewandte Informatik, Netzwerk- und Medientechnik, Faecherblock, Fach[*] Con- ANR Abteilung AbtName 1 AName VorN MiN NaN Gehalt Adresse Monatsgehalt AbtAngest PName ArbeitetAn M Projekt Angestellter M M 1 Leitet M 1 M AngestAngeh M Vorname Angehöriger 45 LNR LName PName Status Lieferant M M Tag M Projekt M M Tagesprojekt LiefertTeilFürProj M Langzeitproj. Ende Entwickl.proj. 46 LiefertTeil M Teil M Laufzeit Start Stadt M Struktur Menge Entität (Entity) ”a thing which can be distinctly identified” • reguläre (starke, regular, strong) Diagramm: Rechteck mit Name der Entität • schwache (weak) Diagramm: verdoppeltes Rechteck mit Name 47 Beziehung (Relationship) ”an association among entities” • Teilnehmer (participants) • Grad (degree) • zwingend (total, mandatory) • freigestellt, partiell (optional, partial) • eineindeutig (one-to-one, 1:1) • einseitig eindeutig (one-to-many, 1:M) • komplex (many-to-many, N:M) 48 Beziehung (Relationship) Diagramm: Rhombus mit Name der Beziehung oder Doppelrhombus, wenn schwache Entitäten beteiligt sind. 49 Eigenschaft (Property) • eindeutig (unique, key) • einfach (simple) oder zusammengesetzt (composite) • ein- oder mehrwertig (single- or multi-valued) • abgeleitet oder nicht (derived or base) 50 Eigenschaft (Property) Diagramm: • Ellipse mit Namen der Eigenschaft • Eindeutige Eigenschaften werden unterstrichen • Doppelellipse bei mehrwertigen Eigenschaften • Punktierte Ellipse bei abgeleiteten Eigenschaften 51 Untertypen (Subtypes) • ”Ist-ein”-Typenhierachie • Obertyp (Vatertyp, parent type, supertype) Diagramm: Pfeil vom Untertyp zum Obertyp. 52 AName Abteilung VorN MiN NaN AbtName 1 Tagesprojekt AbtAngest Tag * Angestellter ANR {unique} Name: AName Gehalt Adresse[*] Monatsgehalt () * ArbeitetAn * Projekt PName Leitet 1 * * Langzeitprojekt * Start Ende Angehöriger Vorname Entwicklungsprojekt LiefertTeilFürProj * * * LiefertTeil * Teil * * Lieferant LNR {unique} LName Status Stadt Struktur Menge 53 ANR Abteilung AbtName 1 AName VorN MiN NaN Gehalt Adresse Monatsgehalt AbtAngest M PName ArbeitetAn M Projekt M 1 Leitet M Angestellter M 1 AngestAngeh M Angehöriger Vorname 54 LNR PName LName Status Lieferant M M Tag M M Projekt Tagesprojekt M LiefertTeilFürProj M Langzeitproj. Ende Entwickl.proj. LiefertTeil M Teil M Laufzeit Start Stadt M Menge Struktur 55 AName Abteilung VorN MiN NaN AbtName 1 Tagesprojekt AbtAngest Tag * Angestellter ANR {unique} Name: AName Gehalt Adresse[*] Monatsgehalt () * ArbeitetAn * Projekt PName Leitet 1 * * Langzeitprojekt * Start Ende Angehöriger Vorname Entwicklungsprojekt LiefertTeilFürProj * * * LiefertTeil * Teil * * Lieferant LNR {unique} LName Status Stadt Struktur Menge 56 Beziehung (Relationship) 3 Beziehung −− —∗ == ==∗ −− −− Entität (partiell -zu-eins, partial -to-one) Entität (partiell -zu-viele, partial -to-many) Entität (zwingend -zu-eins, total -to-one) Entität (zwingend -zu-viele, total -to-many) (Rolle) Entität (1-3,6) Entität (numerisch spezifizierte Multiplizität) 57 Eigenschaft (Property) 2 Entität ◦ Eigenschaft1 ◦ Eigenschaft2 (eindeutig) ◦ Eigenschaft3 (zusammengesetzt) ◦ TeileigenschaftA ◦ TeileigenschaftB ∗ Eigenschaft4 (mehrwertig) · Eigenschaft5 (abgeleitet) 58 Nichtgraphische Darstellung 2 Angestellter ◦ ANR ◦ AName ◦ Vorname ◦ Mittelname ◦ Nachname ◦ Gehalt · Monatsgehalt ∗ Adresse 59 Nichtgraphische Darstellung 3 AbtAngest −− Abteilung ==∗ Angestellter 3 3 AngestAngeh −− Angestellter ==∗ Angehöriger u Angehöriger ◦ Vorname 60 Nichtgraphische Darstellung 2 Projekt ◦ PName 2 Langzeitprojekt —. Projekt ◦ Laufzeit ◦ Start ◦ Ende 2 Entwicklungsprojekt —. Langzeitprojekt 61 Nichtgraphische Darstellung 3 ArbeitetAn —∗ Angestellter —∗ Projekt 3 Leitet −− Angestellter ==∗ Projekt 62 Mehrdimensionale Zugriffsstrukturen • KdB-Baum • Grid-File • Raumfüllende Kurven • R-Baum • Geometrische Zugriffsstrukturen 63 KdB-Baum • k-dimensionaler B-Baum: k Zugriffs-Attribute • Bereichsseiten mit b Schnittelementen • Satzseiten mit t Tupeln 64 Beispiel KdB-Baum k = 2 (2 Dimensionen) t = 1 (Satzseiten enthalten höchsten ein Tupel.) b = 2 (Bereichsseiten enthalten höchstens 2 Schnittelemente.) Datensätze mit numerischem und alphabetischem Attribut: 15 G | 45 G | 85 F | 15 D | 50 C | 15 A | 85 B | 60 H 65 KdB-Baum 66 KdB-Baum 67 KdB-Baum 68 Brickwall 1. Wir füllen einen zweidimensionalen KdB-Baum nacheinander mit zweidimensionalen Datensätzen bestehend aus einer ganzen Zahl und einem Großbuchstaben in Brickwall-Darstellung. 2. Jeder Schritt des Aufbaus der Brickwall (Historie der Zellteilung) muss verwaltet werden, um Datensätze zu finden, einzufügen oder zu löschen. 3. Die Brickwall besteht aus Quadern sehr unterschiedlicher Größe und hat daher eine unregelmäßige Struktur, die es nicht erlaubt, Hyperebenen oder Regionen für die Suche von Objekten zu definieren. 69 KdB-Baum leer H G F E D C B A 0 10 20 30 40 50 70 60 70 80 90 KdB-Baum: plus (15 G) H G F E D C B A 0 10 20 30 40 50 15 G 71 60 70 80 90 KdB-Baum: plus (40 G) H G F E D C B A 0 10 20 30 40 50 15 G 40 G 72 60 70 80 90 KdB-Baum: plus (80 F) H G F E D C B A 0 10 20 30 40 50 60 15 G 40 G 80 F 73 70 80 90 KdB-Baum: plus (10 D) H G F E D C B A 0 10 20 30 10 D 40 50 15 G 40 G 74 60 70 80 F 80 90 KdB-Baum: plus (20 A) H G F E D C B A 0 10 20 10 D 30 40 15 G 50 60 20 A 40 G 75 70 80 F 80 90 KdB-Baum: plus (50 C) H G F E D C B A 0 10 20 10 D 30 15 G 40 50 20 A 40 G 76 60 70 50 C 80 80 F 90 KdB-Baum: plus (90 B) H G F E D C B A 0 10 10 D 20 15 G 30 40 20 A 50 60 40 G 50 C 77 70 80 F 80 90 B 90 KdB-Baum: plus (55 E) H G F E D C B A 0 10 10 D 20 15 G 30 20 A 40 50 40 G 50 C 78 60 70 55 E 80 90 80 F 90 B KdB-Baum: plus ( 5 C) H G F E D C B A 0 5C 10 10 D 20 15 G 30 40 20 A 50 60 40 G 50 C 79 70 55 E 80 80 F 90 90 B KdB-Baum: plus (60 H) H G F E D C B A 0 5C 10 10 D 20 15 G 30 20 A 40 50 40 G 50 C 80 60 70 55 E 80 90 60 H 80 F 90 B KdB-Baum leer H G F E D C B A 0 10 20 30 40 50 81 60 70 80 90 KdB-Baum: plus (15 G) H G F E D C B A 0 10 20 30 40 50 15 G 82 60 70 80 90 KdB-Baum: plus (40 G) H G F E D C B A 0 10 20 30 40 50 15 G 40 G 83 60 70 80 90 KdB-Baum: plus (80 F) H G F E D C B A 0 10 20 30 40 50 15 G 40 G 80 F 84 60 70 80 90 KdB-Baum: plus (10 D) H G F E D C B A 0 10 20 30 40 50 10 D 15 G 40 G 80 F 85 60 70 80 90 KdB-Baum: plus (20 A) H G F E D C B A 0 10 20 30 40 50 10 D 15 G 20 A 40 G 80 F 86 60 70 80 90 KdB-Baum: plus (50 C) H G F E D C B A 0 10 20 30 40 50 10 D 15 G 20 A 40 G 50 C 80 F 87 60 70 80 90 KdB-Baum: plus (90 B) H G F E D C B A 0 10 20 30 40 50 60 10 D 40 G 15 G 80 F 20 A 50 C 90 B 88 70 80 90 KdB-Baum: plus (55 E) H G F E D C B A 0 10 20 30 40 50 60 10 D 40 G 15 G 55 E 20 A 80 F 50 C 90 B 89 70 80 90 KdB-Baum: plus ( 5 C) H G F E D C B A 0 10 20 30 5C 10 D 40 50 40 G 55 E 80 F 15 G 20 A 90 60 70 50 C 90 B 80 90 KdB-Baum: plus (60 H) H G F E D C B A 0 10 20 5C 10 D 30 40 50 60 15 G 40 G 20 A 60 H 50 C 90 B 91 70 55 E 80 F 80 90 Grid-File • Skala: Für jede Dimension gibt es ein Feld von Intervallen des Wertebereichs eines Zugriffs-Attributs. • Das Grid-Directory zerlegt den Datenraum in Grid-Zellen (kdimensionale Quader) gemäß den Intervallen der Skalen. Das Grid-Directory ist i.a. so groß, dass es normalerweise auf dem Sekundärspeicher liegt. Allerdings genügen wenige Zugriffe, um eine Zelle zu finden. Bei einer exact-match query genügt ein Zugriff. • Die Grid-Region besteht aus einer oder mehreren Grid-Zellen. Jeder Grid-Region ist eine Satzseite zugeordnet. Die Grid-Region ist ein kdimensionales konvexes Gebilde, d.h. jeder Datensatz auf der Geraden zwischen zwei Datensätzen derselben Region liegt ebenfalls in der Region. Regionen sind paarweise disjunkt. • Die Satzseiten (data bucket) enthalten die Datensätze und liegen auf dem Sekundärspeicher. 92 Beispiel Grid-File k = 2 (2 Dimensionen) t = 1 (Satzseiten enthalten höchsten ein Tupel.) Datensätze mit numerischem und alphabetischem Attribut: 15 G | 40 G | 80 F | 10 D | 50 C | 20 A | 90 B | 60 H | 93 Grid-File leer H G F E D C B A 0 10 20 30 40 50 94 60 70 80 90 Grid-File: plus (15 G) H G F E D C B A 0 10 20 30 40 50 15 G 95 60 70 80 90 Grid-File: plus (40 G) H G F E D C B A 0 10 20 30 40 50 15 G 40 G 96 60 70 80 90 Grid-File: plus (80 F) H G F E D C B A 0 10 20 30 40 50 60 15 G 40 G 80 F 97 70 80 90 Grid-File: plus (10 D) H G F E D C B A 0 10 20 30 10 D 40 50 15 G 40 G 98 60 70 80 F 80 90 Grid-File: plus (50 C) H G F E D C B A 0 10 20 10 D 30 40 50 60 15 G 40 G 50 C 99 70 80 F 80 90 Grid-File: plus (20 A) H G F E D C B A 0 10 20 10 D 30 15 G 40 50 20 A 40 G 100 60 70 50 C 80 80 F 90 Grid-File: plus (90 B) H G F E D C B A 0 10 10 D 20 15 G 30 40 20 A 50 60 40 G 50 C 101 70 80 F 80 90 B 90 Grid-File: plus (60 H) H G F E D C B A 0 10 10 D 20 15 G 30 20 A 40 50 40 G 50 C 102 60 70 60 H 80 90 80 F 90 B Grid-File leer H G F E D C B A 0 10 20 30 40 50 103 60 70 80 90 Grid-File: plus (15 G) H G F E D C B A 0 10 20 30 40 50 15 G 104 60 70 80 90 Grid-File: plus (40 G) H G F E D C B A 0 10 20 30 40 50 15 G 40 G 105 60 70 80 90 Grid-File: plus (80 F) H G F E D C B A 0 10 20 30 40 50 15 G 40 G 80 F 106 60 70 80 90 Grid-File: plus (10 D) H G F E D C B A 0 10 20 30 40 50 10 D 15 G 40 G 80 F 107 60 70 80 90 Grid-File: plus (50 C) H G F E D C B A 0 10 20 30 40 50 40 G 50 C 80 F 10 D 15 G 108 60 70 80 90 Grid-File: plus (20 A) H G F E D C B A 0 10 20 30 40 50 10 D 15 G 20 A 40 G 50 C 80 F 109 60 70 80 90 Grid-File: plus (90 B) H G F E D C B A 0 10 20 30 40 50 60 10 D 40 G 15 G 80 F 20 A 50 C 90 B 110 70 80 90 Grid-File: plus (60 H) H G F E D C B A 0 10 20 30 40 50 60 10 D 40 G 15 G 60 H 20 A 80 F 50 C 90 B 111 70 80 90 Grid-File: plus (65 E) H G F E D C B A 0 10 20 30 40 50 10 D 40 G 15 G 60 H 20 A 50 C 90 B 112 60 70 65 E 80 F 80 90 Grid-File: plus ( 5 C) H G F E D C B A 0 10 20 5C 20 A 30 40 50 60 10 D 40 G 15 G 60 H 50 C 90 B 113 70 65 E 80 F 80 90 Raumfüllende Kurven Problem: Abbildung k-dimensionales Universum auf einen ein-dimensionalen Bereich unter Erhaltung von Nachbarschaftsbeziehungen 114 115 R-Baum Der R-Baum wurde entwickelt zur Indexierung ausgedehnter Objekte im k-dimensionalen Raum. Der Index speichert für jedes Objekt seine MBB (minimal bounding box). Der MBB ist dann die Referenz auf das Objekt zugeordnet. 116 117 118 119 120 Beispiel R-Baum k = 2 (2 Dimensionen) pKnoten = 3 pBlatt = 3 p1 ... p10 repräsentieren punktförmige Objekte. m1 ... m10 repräsentieren ausgedehnte Objekte. 121 R-Baum: Einfügen von p1 : 90 80 70 60 50 40 30 p1 20 10 0 0 10 20 30 40 50 60 70 80 90 100 R-Baum p1 122 110 120 130 R-Baum: Einfügen von m1 : 90 80 m1 70 60 50 40 30 p1 20 10 0 0 10 20 30 40 50 60 70 80 90 100 R-Baum p1 m1 123 110 120 130 R-Baum: Einfügen von p2 : 90 80 m1 70 60 50 40 30 p2 p1 20 10 0 0 10 20 30 40 50 60 70 80 90 100 R-Baum p1 m1 p2 124 110 120 130 R-Baum: Einfügen von m2 : 90 R1 80 m1 70 60 m2 50 40 R2 p2 30 p1 20 10 0 0 10 20 30 40 50 60 70 80 90 100 R-Baum R1 R2 p1 m1 m2 p2 125 110 120 130 R-Baum: Einfügen von p3 : 90 R1 80 m1 70 60 m2 50 40 R2 p2 30 p3 p1 20 10 0 0 10 20 30 40 50 60 70 80 90 100 R-Baum R1 R2 p1 m1 m2 p2 p3 126 110 120 130 R-Baum: Einfügen von m3 : 90 R1 80 m1 70 60 m2 50 R2 40 30 m3 p2 p3 p1 20 10 0 0 10 20 30 40 50 60 70 80 90 100 R-Baum R1 R2 p1 m1 m2 p2 p3 m3 127 110 120 130 R-Baum: Einfügen von p4 : 90 R1 80 m1 70 60 m2 50 R2 40 30 R3 p2 m3 p3 p1 20 p4 10 0 0 10 20 30 40 50 60 70 80 90 100 R-Baum R1 R2 R3 p1 m1 m2 m3 p2 p3 p4 128 110 120 130 R-Baum: Einfügen von m4 : 90 R5R4 80 m1 70 60 m2 R1 50 R2 40 R6 m4 30 R3 p2 m3 p3 p1 20 p4 10 0 0 10 20 30 40 50 60 70 80 90 100 R-Baum R5 R6 R1 R4 R2 R3 p1 m4 m1 m2 m3 p2 p3 p4 129 110 120 130 R-Baum: Einfügen von p5 : 90 R5R4 80 m1 70 60 m2 R1 50 R2 40 R6 m4 30 R3 p2 m3 p3 R7 p5 p4 p1 20 10 0 0 10 20 30 40 50 60 70 80 90 100 R-Baum R5 R6 R1 R4 R2 R3 R7 p1 m4 m1 m2 m3 p2 p3 p4 p5 130 110 120 130 R-Baum: Einfügen von m5 : 90 R5R4 80 m1 70 60 m2 R1 50 R2 R6 40 m4 30 m3 R3 p2 m5 p3 R7 p5 p4 p1 20 10 0 0 10 20 30 40 50 60 70 80 90 100 R-Baum R5 R6 R1 R4 R2 R3 R7 p1 m4 m1 m2 m3 m5 p2 p3 p4 p5 131 110 120 130 R-Baum: Einfügen von p6 : 90 R5R4 80 m1 70 60 m2 R1 50 R2 R6 40 m4 30 m3 R3 p2 m5 20 R7 p3 p1 p4 p6 p5 10 0 0 10 20 30 40 50 60 70 80 90 100 R-Baum R5 R6 R1 R4 R2 R3 R7 p1 m4 m1 m2 m3 m5 p2 p3 p4 p5 p6 132 110 120 130 R-Baum: Einfügen von m6 : 90 R5R4 80 R6 R7 m1 70 m6 60 m2 R1 50 R2 40 m4 30 m3 R3 p2 m5 p3 p1 20 p4 p6 p5 10 0 0 10 20 30 40 50 60 70 80 90 100 110 R-Baum R5 R6 R1 R4 R2 R3 R7 p1 m4 m1 m2 m3 m5 p2 p3 p4 p5 p6 m6 133 120 130 R-Baum: Einfügen von p7 : R9 R8 p7 90 R5R4 80 m1 70 m6 60 m2 R1 50 R2 R6 40 m4 30 m3 R3 p2 m5 20 R7 p3 p1 p4 p6 p5 10 0 0 10 20 30 40 50 60 70 80 90 100 110 R-Baum R5 R6 R9 R1 R4 R2 R3 R7 p1 m4 m1 m2 m3 m5 p2 p3 p4 R8 p5 p6 m6 p7 134 120 130 R-Baum: Einfügen von m7 : R9 R8 90 p7 R5R4 80 m1 70 m6 60 m2 R1 m7 50 R2 R6 40 m4 30 m3 R3 p2 m5 20 R7 p3 p1 p4 p6 p5 10 0 0 10 20 30 40 50 60 70 80 90 100 110 R-Baum R5 R6 R9 R1 R4 R2 R3 R7 p1 m4 m1 m2 m3 m5 p2 p3 p4 R8 p5 p6 m6 p7 m7 135 120 130 R-Baum: Einfügen von p8 : R9 90 R10 p7 R5R4 80 R8 m1 70 m6 p8 60 m2 R1 m7 50 R2 R6 40 m4 30 m3 R3 p2 m5 20 R7 p3 p1 p4 p6 p5 10 0 0 10 20 30 40 50 60 70 80 90 100 110 120 R-Baum R5 R6 R9 R1 R4 R2 R3 R7 p1 m4 m1 m2 m3 m5 p2 p3 p4 R8 R10 p5 p6 m7 p8 m6 p7 136 130 R-Baum: Einfügen von m8 : R9 90 R10 p7 R5R4 80 R8 m1 70 m6 p8 60 m2 R1 m7 50 R2 R6 R7 40 m8 m4 30 m3 R3 p2 m5 p3 p1 20 p4 p6 p5 10 0 0 10 20 30 40 50 60 70 80 90 100 110 120 R-Baum R5 R6 R9 R1 R4 R2 R3 R7 p1 m4 m1 m2 m3 m5 p2 p3 p4 R8 R10 p5 p6 m8 m7 p8 m6 p7 137 130 R-Baum: Einfügen von p9 : R9 90 R10 p7 R5 R4 80 R8 m1 70 p9 60 m6 p8 m2 R1 m7 50 R2 R6 R7 40 m8 m4 30 m3 R3 p2 m5 p6 p3 p1 20 p5 p4 10 0 0 10 20 30 40 50 60 70 80 90 100 110 120 130 R-Baum R5 R6 R9 R1 R4 R2 R3 R7 p1 m4 m1 m2 p9 m3 m5 p2 p3 p4 R8 R10 p5 p6 m8 m7 p8 m6 p7 138 R-Baum: Einfügen von m9 : R9 R8 90 R5 R4 80 R10 p7 m9 m1 70 p9 60 m6 p8 m2 R1 m7 50 R2 R6 R7 40 m8 m4 30 m3 R3 p2 m5 p3 p1 20 p4 p6 p5 10 0 0 10 20 30 40 50 60 70 80 90 100 110 120 130 R-Baum R5 R6 R9 R1 R4 R2 R3 R7 p1 m4 m1 m2 p9 m3 m5 p2 p3 p4 R8 R10 p5 p6 m8 m7 p8 m9 m6 p7 139 R-Baum: Einfügen von p10 : R9 R8 90 R4 R5 80 70 m1 60 m2 p10 R1 R10 p7 m9 R11 p9 m6 p8 m7 50 R2 R6 R7 40 m8 m4 30 m3 R3 p2 m5 p3 p1 20 p4 p6 p5 10 0 0 10 20 30 40 50 60 70 80 90 100 110 120 130 R-Baum R5 R6 R9 R1 R4 R11 p1 m4 m1 m2 p10 R2 R3 R7 p9 m3 m5 p2 p3 p4 R8 R10 p5 p6 m8 m7 p8 m9 m6 p7 140 R-Baum: Einfügen von m10 : R9 R8 90 R4 R5 80 R10 p7 m9 R11 m10 70 m1 60 m2 p10 R1 p9 m6 p8 m7 50 R2 R6 R7 40 m8 m4 30 m3 R3 p2 m5 p3 p1 20 p4 p6 p5 10 0 0 10 20 30 40 50 60 70 80 90 100 110 120 130 R-Baum R5 R6 R9 R1 R4 R11 p1 m4 m1 m2 p10 R2 R3 R7 p9 m10 m3 m5 p2 p3 p4 R8 R10 p5 p6 m8 m7 p8 m9 m6 p7 141 Relationales DBS • oder Relationales System • beruht auf relationalem Modell – Datenrepräsentation durch Tabellen – Datenintegrität (atomare Zellen) – Datenmanipulation (select, project, join) 142 Operatoren select : extrahiert spezifische Zeilen aus einer Tabelle und generiert daraus eine neue Tabelle. project : extrahiert spezifische Spalten aus einer Tabelle und generiert daraus eine neue Tabelle. join : verbindet zwei Tabellen auf der Basis von gleichen Werten in gemeinsamen Spalten. 143 Beispiel Tabelle ABTEILUNG : ABTNR A1 A2 A3 ABTNAME BUDGET Marketing 10M Entwicklung 12M Forschung 5M Tabelle MITARBEITER : MNR M1 M2 M3 M4 MNAME Ibsen Rostand Wilde Canetti 144 ABTNR GEHALT A1 80K A1 84K A2 60K A2 70K Beispiel restrict Operation: select ABTEILUNG where BUDGET > 6M Resultat: ABTNR ABTNAME BUDGET A1 Marketing 10M A2 Entwicklung 12M 145 Beispiel project Operation: project ABTEILUNG over ABTNR, BUDGET Resultat: ABTNR BUDGET A1 10M A2 12M A3 5M 146 Beispiel join Operation: join ABTEILUNG and MITARBEITER over ABTNR Resultat: ABTNR A1 A1 A2 A2 ABTNAME BUDGET MNR Marketing 10M M1 Marketing 10M M2 Entwicklung 12M M3 Entwicklung 12M M4 147 MNAME GEHALT Ibsen 80K Rostand 84K Wilde 60K Canetti 70K Bemerkungen • Abgeschlossenheit (closure) • Mengenoperationen • Tabellen sind die logische (logical), besser konzeptuelle (conceptual) Struktur, nicht unbedingt die physikalische Struktur. Tabellen repräsentieren eine Abstraktion der physikalischen Speicherstruktur. 148 Bemerkungen • Der ganze Informationsgehalt einer relationalen DB wird nur in einer Art dargestellt, nämlich explizit als Datenwerte. Es gibt keine Zeiger auf andere Tabellen. • Alle Datenwerte sind atomar (atomic, scalar). Keine Gruppen von Werten (repeating group). ABTNR A1 A1 A2 A2 MNR M1 M2 M3 M4 ABTNR MNR A1 M1, M2 A2 M3, M4 149 Bemerkungen • Spezifische Integritätsregeln und relationale Integritätsregeln – Hat eine Tabelle einen Primärschlüssel (primary key), dann müssen die Datenwerte der entsprechenden Spalte eindeutig (unique) sein. – Hat eine Tabelle einen Fremdschlüssel (foreign key), dann dürfen dort nur Datenwerte stehen, die auch im Primärschlüssel einer Tabelle stehen. 150 Bemerkungen • Terminologie: Relation ist der mathematische Begriff für Tabelle. Relationale Systeme basieren auf dem relationalen Datenmodell, das eine abstrakte Theorie ist, die auf Mengenlehre und Prädikatenlogik aufbaut. Prinzipien des relationalen Modells von E. F. Codd 1969-70. Das relationale Modell verwendet nicht den Begriff Datensatz (record), sondern den Begriff Tupel (tuple). Wir verwenden hier die Begriffe Tabelle, Zeile, Spalte synonym zu den Theoriebegriffen Relation, Tupel, Attribut. • Das relationale Modell ist eine Theorie. Ein DBS muss nicht unbedingt alle Aspekte der Theorie abdecken. Es gibt auf dem Markt kein DBS, das das relationale Modell vollständig abdeckt. 151 Optimierung • Mit SQL definiert man das ”Was” (nicht-prozedural), nicht das ”Wie”. • Höheres Abstraktionsniveau als gängige Sprachen. • Optimierer (optimizer), eine DBMS-Komponente, die für das automatische Navigieren (automatic navigation system) verantwortlich ist, kümmert sich um das ”Wie”. 152 Katalog Tabelle TABLES : TABNAME COLCOUNT ROWCOUNT . . . ABTEILUNG 3 3 ... MITARBEITER 4 4 ... ... ... ... ... TABLES ... ... ... ... ... ... ... 153 Katalog Tabelle COLUMNS : TABNAME ABTEILUNG ABTEILUNG ABTEILUNG MITARBEITER MITARBEITER MITARBEITER MITARBEITER ... TABLES ... COLNAME ABTNR ABTNAME BUDGET MNR MNAME ABTNR GEHALT ... TABNAME ... ... ... ... ... ... ... ... ... ... ... ... 154 Basistabellen und Views • Basistabelle (base table): nicht abgeleitet, hat Namen, existiert ”wirklich”, d.h. ist Modell für real existierende Daten. • View: abgeleitet (derived table) von anderen Tabellen, virtuelle (virtual) Tabelle, Änderungen wirken sich auf die Basistabellen aus. 155 SQL CREATE TABLE ABTEILUNG ( ABTNR CHAR (2), ABTNAME CHAR (20), BUDGET INT, PRIMARY KEY (ABTNR) ); 156 SQL CREATE TABLE MITARBEITER ( MNR CHAR (2), MNAME CHAR (20), ABTNR CHAR (2), GEHALT INT, PRIMARY KEY (MNR), FOREIGN KEY (ABTNR) REFERENCES ABTEILUNG ); 157 SQL INSERT INTO ABTEILUNG (ABTNR, ABTNAME, BUDGET) VALUES (’A1’, ’Marketing’, 10M); 158 SQL Operation: restrict ABTEILUNG where BUDGET > 6M SQL: SELECT ABTNR, ABTNAME, BUDGET FROM ABTEILUNG WHERE BUDGET > 6M; 159 SQL Operation: project ABTEILUNG over ABTNR, BUDGET SQL: SELECT ABTNR, BUDGET FROM ABTEILUNG; 160 SQL Operation: join ABTEILUNG and MITARBEITER over ABTNR SQL: SELECT ABTEILUNG.ABTNR, ABTNAME, BUDGET, MNR, MNAME, GEHALT FROM ABTEILUNG, MITARBEITER WHERE ABTEILUNG.ABTNR = MITARBEITER.ABTNR; 161 SQL CREATE TABLE ZWISCHENERGEBNIS ( MNR CHAR (2) ); 162 SQL INSERT INTO ZWISCHENERGEBNIS (MNR) SELECT MNR FROM MITARBEITER WHERE ABTNR = ’A1’; 163 SQL UPDATE MITARBEITER SET GEHALT = GEHALT * 1.1 WHERE ABTNR = ’A1’; 164 SQL DELETE FROM MITARBEITER WHERE ABTNR = ’A2’; 165 SQL CREATE VIEW VIELVERDIENER AS SELECT MNR, MNAME, GEHALT FROM MITARBEITER WHERE GEHALT > 66K; 166 Regeln von Codd 1) The Information Rule: Alle Daten, die in einer Datenbank gespeichert werden, sind auf dieselbe Art dargestellt, nämlich durch Werte in Tabellen. 2) Guaranteed Access Rule: Jeder gespeicherte Wert muss über Tabellennname, Spaltenname und Wert des Primärschlüssels zugreifbar sein, wenn der zugreifende Anwender über hinreichende Zugriffsrechte verfügt. 3) Systematic Treatment of Null Values: Nullwerte müssen datentypunabhängig zur Darstellung fehlender Werte unterstützt werden. Systematisch drückt hierbei aus, dass Nullwerte unabhängig von demjenigen Datentyp, für den sie auftreten, gleich behandelt werden. 167 Regeln von Codd 4) Dynamic On-line Catalog Based on the Relational Model: Der Katalog soll auch in Form von Tabellen vorliegen. Der Katalog beschreibt die Struktur und die Integritätsregeln der in der Datenbank hinterlegten Tabellen. 5) Comprehensive Data Sublanguage Rule: Für das DBMS muss mindestens eine Sprache existieren, durch die sich die Tabellenstruktur definieren lässt. 6) View Updating Rule: Alle theoretisch aktualisierbaren Sichten müssen durch Aktualisierung der zugrundeliegenden Basistabellen änderbar sein. 168 Regeln von Codd 7) High-level Insert, Update, and Delete: Innerhalb einer Operation können beliebig viele Tupel bearbeitet werden, d.h. die Operationen werden grundsätzlich mengenorientiert ausgeführt. 8) Physical Data Independence: Änderungen an der internen Ebene dürfen keine Auswirkungen – außer Performanz – auf die Anwendungsprogramme haben. 9) Logical Data Independence: Änderungen des konzeptuellen Schemas dürfen keine Auswirkungen auf die Anwendungsprogramme haben, es sei denn, dass sie direkt von der Änderung betroffen sind. (Wegen ihnen sind die Änderungen vorgenommen worden.) 169 Regeln von Codd 10) Integrity Independence: Alle Integritätsregeln müssen ausschließlich durch die Sprache des DBMS definierbar sein. Ferner gilt: • Kein Attribut, das Teil eines Primärschlüssels ist, darf NULL sein. • Ein Fremdschlüsselattribut muss als Wert des zugehörigen Primärschlüssels existieren. 11) Distribution Independence: Die Anfragesprache muss so ausgelegt sein, dass Zugriffe auf lokal gehaltene Daten identisch denen auf verteilt gespeicherte Daten formuliert werden können. 170 Regeln von Codd 12) Nonsubversion Rule: Definiert ein DBMS neben der HighLevel Zugriffssprache auch eine Schnittstelle mit niedrigerem Abstraktionsniveau, dann darf durch diese keinesfalls eine Umgehung der definierten Integritätsregeln möglich sein. Rule 0: (Zusammenfassung aller zwölf Regeln) Alle Operationen für Zugriff, Verwaltung und Wartung der Daten dürfen nur mittels relationaler Fähigkeiten abgewickelt werden. 171 Beispiel SP Tabelle S: SNR S1 S2 S3 S4 S5 SNAME STATUS CITY Smith 20 London Jones 10 Paris Blake 30 Paris Clark 20 London Adams 30 Athens 172 Beispiel SP Tabelle P: PNR P1 P2 P3 P4 P5 P6 PNAME Nut Bolt Screw Screw Cam Cog COLOR WEIGHT CITY Red 12 London Green 17 Paris Blue 17 Rome Red 14 London Blue 12 Paris Red 19 London 173 Beispiel SP Tabelle SP: SNR S1 S1 S1 S1 S1 S1 S2 S2 S3 S4 S4 S4 PNR QTY P1 300 P2 200 P3 400 P4 200 P5 100 P6 100 P1 300 P2 400 P2 200 P2 200 P4 300 P5 400 174 Relationales Modell Deutsch Englisch Relation relation Tupel tuple Kardinalität cardinality Attribut attribute Grad degree Primärschlüssel primary key Wertebereich domain Skalar scalar Begriffe Informeller Begriff Erklärung Deutsch Englisch Tabelle table Zeile row Anzahl der Tupel Spalte column arity Anzahl der Attribute Eindeutiger Identifikator Typ type Werte, die ein Attribut annehmen kann Wert value Wert eines Attributs in einem Tupel 175 Wertebereiche • Skalar (scalar): kleinste semantische Dateneinheit, atomar, keine interne Struktur bezüglich relationalem Modell • Wertebereich (domain): benannte Menge von Skalaren, Typ • Definition: elementweise, konzeptionell (create domain, destroy domain) 176 Wertebereiche Datenmanipulation: Attribut kann nur Werte aus dem Wertebereich haben (Datenintegrität). Vergleiche (domain-constrained comparisons): SELECT PNAME, QTY | SELECT PNAME, QTY FROM P, SP | FROM P, SP WHERE P.PNR = SP.PNR; | WHERE P.WEIGHT = SP.QTY; Anfragen, die auf dem Wertebereich basieren: ”Welche Tabellen in der DB enthalten irgendwelche Information über Lieferanten?” 177 Definition Relation 1.) Der Kopf (heading) besteht aus einer Menge von Attributen, genauer hAttributname : Wertebereichnamei–Paaren, {hA1 : D1i, hA2 : D2i · · · hAm : Dmi} sodaß zu jedem Attribut Aj genau ein Wertebereich Dj (j = 1, 2 · · · m) gehört. Die Attributnamen sind alle verschieden. 178 Definition Relation 2.) Der Körper (body) besteht aus einer Menge von Tupeln {t1, t2 · · · tn}. Jedes Tuple ti besteht aus einer Menge von hAttributname : Attributwerti–Paaren ti = {hA1 : vi1i, hA2 : vi2i · · · hAm : vimi} (i = 1, 2 · · · n), wobei n die Anzahl der Tupel in der Menge ist. Die vij sind Werte aus dem Wertebereich Dj . 179 Tabelle • Zeilen sind geordnet. Duplikate möglich. • Spalten haben Reihenfolge. • In einer Tabelle wird nicht deutlich, daß die Werte aus Wertebereichen stammen. 180 Relationen • Wert (value) (Codd: time-varying relations) • Grad (degree oder auch arity) 181 Eigenschaften von Relationen • Es gibt keine Tupelduplikate. • Die Tupel sind nicht geordnet. • Die Attribute sind nicht geordnet. • Alle Attributwerte sind atomar. Keine repeating groups. Eine Relation ist normalisiert (normalized) oder ist in der ersten Normalform (first normal form). 182 Relationsarten Benannte (named) Relation ist eine Relation, die unter einem Namen ansprechbar ist (Basisrelation, View, Schnappschuß). Basisrelation (base relation) ist eine benannte, autonome (autonomous), d.h. nicht abgeleitete Relation. Abgeleitete (derived) Relation wird durch andere Relationen in relationalen Ausdrücken definiert. Ausdrückbare (expressible) Relation ist eine Relation, die mit relationalen Mitteln erhalten werden kann. Die ausdrückbaren Relationen sind alle Relationen, Basis– und abgeleitete Relationen. View ist eine benannte, abgeleitet Relation. Views sind virtuell, da sie im DBS nur durch ihre Definition repräsentiert werden. 183 Relationsarten Schnappschuß (snapshot) ist eine benannte abgeleitete Relation, die aber nicht virtuell ist, sondern die – konzeptionell – wenigsten durch ihre eigenen Daten repräsentiert wird. Anfrageresultat (query result) ist eine nicht benannte abgeleitete Relation, die das Resultat einer Anfrage an die DB ist. Zwischenresultat (intermediate result) ist das Resultat eines relationalen Ausdrucks, der in einen anderen Ausdruck geschachtelt ist. Gespeicherte (stored) Relation ist eine Relation, die direkt und effizient physikalisch gespeichert ist. 184 Prädikate Wahrheitswertfunktion (predicate) von vier Argumenten: Ein Lieferant mit einer bestimmten Lieferantennummer (SNR) hat den spezifizierten Namen (SNAME) und den spezifizierten Statuswert (STATUS) und sitzt in der angegebenen Stadt (CITY). Ferner haben verschiedene Lieferanten nicht dieselbe Lieferantennummer. 185 Prädikate • Eine Relation enthält zu jeder Zeit nur solche Tupel, die die entsprechenden Propositionen zu der Zeit wahr machen. • Kriterium für die Akzeptanz einer Manipulation (criterion for update acceptability) • Das DBMS kennt das Prädikat von vornherein nicht und es ist i.a. nicht möglich, dem DBMS das Prädikat vollständig zu beschreiben. • Aber man kann dem DBMS Regeln geben, die eine vernünftige Annäherung an das Prädikat sind (Integritätsregeln, integrity rules). 186 Integrität • DB-Konfiguration, die die Wirklichkeit darstellt. • Bestimmte DB-Konfigurationen machen keinen Sinn. • Integritätsregeln (integrity rules): Randbedingungen der realen Welt. 187 Schlüssel • DB-spezifische Integritätsregeln • allgemeine Integritätsregeln (haben mit Schlüsseln zu tun) 188 Schlüssel Definition: Ein (Kandidaten-)Schlüssel (candidate key) K ist auf einer Relation R definiert als eine Teilmenge des Kopfes (der Menge der Attribute) von R mit den Eigenschaften: 1. Eindeutigkeit (uniqueness): Es gibt keine zwei unterschiedliche Tupel von R mit demselben Wert für K. 2. Nicht-Reduzierbarkeit (irreducibility, auch minimality): Keine echte Teilmenge von K hat die Eigenschaft der Eindeutigkeit. 189 Bemerkungen 1. Jede Relation hat mindestens einen Schlüssel. 2. Reduzierbare Schlüssel: Superschlüssel (superkey). 3. Schlüsseleigenschaft gilt für alle möglichen Werte einer Relation. 4. ”all-key”-Relation 5. Fälle mit mehr als einem Schlüssel sind selten. 6. zusammengesetzte (composite) und einfache (simple) Schlüssel 7. Forderung der Nicht-Reduzierbarkeit ist notwendig. 8. ”Schlüssel” und ”eindeutiger Index” 9. Schlüssel: Zentraler Mechanismus zur Adressierung von Tupeln 190 Primärschlüssel • Genau ein Schlüssel kann als Primärschlüssel (primary key) definiert werden. • Alternativschlüssel (alternate key) oder Sekundärschlüssel (secondary key) • Der Primärschlüssel wird in den Tabellen unterstrichen. 191 Fremdschlüssel Definition: K sei ein Schlüssel der Basisrelation R1. R2 sei eine (nicht notwendigerweise von R1 verschiedene) Basisrelation. FK ist ein Fremdschlüssel in der Basisrelation R2, wenn für alle aktuellen Werte von R1 und R2 gilt: 1. FK ist eine Teilmenge des Kopfes (der Attribute) von R2. 2. Jeder Wert von FK in R2 ist identisch mit einem Wert von K in R1. Fremdschlüssel werden in den Tabellen überstrichen. 192 Bemerkungen 1. Jeder Wert eines Fremdschlüssels in R2 muß zu einem Schlüsselwert in R1 passen. 2. Der Fremdschlüssel ist nur dann zusammengesetzt, wenn auch der dazugehörige Schlüssel zusammengesetzt ist. 3. Die Wertebereiche der Attribute müssen im Fremdschlüssel und im dazugehörigen Schlüssel gleich sein. 4. Die Namen der Attribute können im Fremdschlüssel und im dazugehörigen Schlüssel unterschiedlich sein. 5. Ein Fremdschlüssel von R2 muß nicht die Komponente eines Schlüssels von R2 sein. 193 Bemerkungen 6. Begriffe: Ein Fremdschlüssel steht für eine Referenz (reference) auf das Tupel mit dem passenden Schlüssel (referenziertes Tupel, referenced tuple, target tuple) (Problem der refenziellen Integrität, referential integrity problem). Es muß die referenzielle Einschränkung (referential constraint) beachtet werden. Der Fremdschlüssel ist in der referenzierenden (referencing), der dazugehörige Schlüssel in der referenzierten (referenced, target) Relation definiert. 7. Referenzielle Diagramme (referential diagrams): R1 ← R2 S ← SP → P 194 Bemerkungen 8. referenzielle Pfade (referential path) 9. Es gibt Relationen, die sich selbst referenzieren (self-referencing). Sie sind ein Spezialfall von referenziellen Zyklen (referential cycle): R1 → R2 → R3 → R4 → R1 10. Schlüssel – Fremdschlüsselbeziehungen sind die wichtigsten Beziehungen zwischen Relationen in einer DB. Es gibt aber auch andere Beziehungen: Z.B. kommt das Attribut CITY in S und P vor. Man kann nun fragen, ob ein Lieferant und ein Teil in derselben Stadt sind. CITY ist kein Fremdschlüssel. Diese Art von Fragen kann aber nur eindeutig beantwortet werden, wenn CITY ein Schlüssel wird. 195 Fremdschlüsselregeln 1. beschränkt (restricted): Die Manipulation wird auf die Fälle ohne Referenz beschränkt und in anderen Fällen zurückgewiesen. 2. kaskadiert (cascades): Die Manipulation kaskadiert insofern, als sie alle referenzierenden Einträge auch manipuliert. 3. Eintrag einer NULL oder eines Defaultwerts in den Fremdschlüssel. Das ist nur vernünftig, wenn der Fremdschlüssel nicht Komponente eines Schlüssels ist. 4. Frage den Benutzer, was zu tun ist. 5. Rufe eine installationsabhängige Prozedur auf. 196 Nicht definierte Werte (NULL) • (missing value or missing information) • keine Defaultwerte Regeln: 1. Nach Möglichkeit sollten anstatt von NULLs Defaultwerte verwendet werden. 2. Ein Schlüssel darf keine NULLs enthalten. 3. Ein Fremdschlüssel darf nur NULLs enthalten, wenn er nicht Komponente eines Schlüssels ist. 197 Relationale Algebra • Traditionelle Mengenoperationen: Vereinigung (union), Schnitt (intersect), Differenz (minus) und kartesisches Produkt (times), die alle etwas auf Relationen angepasst wurden. • Spezifisch relationale Operationen: select, project, join und devideby. • extend und summarize • Zuweisungs- und Update-Operationen und relationale Vergleiche 198 rename Die Operationen werden so definiert, dass die resultierenden Relationen vernünftige Köpfe haben. Dazu mag es notwendig sein, Attribute umzubenennen. Wir führen daher den Operator rename ein mit der Syntax: Relation rename alterAttributname as neuerAttributname βneu←altR 199 Traditionelle Mengenoperationen • Vereinigung, Schnitt, Differenz, kartesisches Produkt • Operanden typkompatibel • Vereinigung, Schnitt und kartesisches Produkt sind in der relationalen Algebra assoziativ und kommutativ, die Differenz nicht. Relation R1 : Relation R2 : SNR SNAME STATUS CITY S1 Smith 20 London S4 Clark 20 London SNR SNAME STATUS CITY S1 Smith 20 London S2 Jones 10 Paris 200 Vereinigung ist mengentheoretische Vereinigung von zwei typkompatiblen Tupelmengen. R1 union R2: SNR S1 S4 S2 SNAME STATUS CITY Smith 20 London Clark 20 London Jones 10 Paris • outer union 201 R1 minus R2: R2 minus R1: Differenz SNR SNAME STATUS CITY S4 Clark 20 London SNR SNAME STATUS CITY S2 Jones 10 Paris 202 R1 intersect R2: Schnitt SNR SNAME STATUS CITY S1 Smith 20 London • R1 intersect R2 ≡ R1 minus (R1 minus R2) Der Schnitt ist keine primitive Operation. 203 Kartesisches Produkt • Mathematik: Geordnete Paare (r1, r2), wobei r1 ∈ R1 und r2 ∈ R2 gilt. • Relationale Algebra: Mengentheoretische Vereinigung von Tupelpaaren. • Kopf: Vereinigung der beiden Input-Köpfe 204 Kartesisches Produkt Relation R3 : R3 times R4 : SNR S1 S2 SNR S1 S1 S1 S2 S2 S2 Relation R4 : PNR P1 P2 P3 PNR P1 P2 P3 P1 P2 P3 205 Selektion, Restriktion A where X Θ Y R where ϕ1 and ϕ2 ≡ (R where ϕ1) intersect (R where ϕ2) R where ϕ1 or ϕ2 ≡ (R where ϕ1) union (R where ϕ2) R where not ϕ ≡ R minus (R where ϕ) 206 Selektion, Restriktion S where CITY = ’London’: SNR SNAME STATUS CITY S1 Smith 20 London S4 Clark 20 London P where WEIGHT < 14: PNR PNAME COLOR WEIGHT CITY P1 Nut Red 12 London P5 Cam Blue 12 Paris SP where SNR = ’S1’ and PNR = ’P1’: 207 SNR PNR QTY S1 P1 300 Projektion R[A, B . . . C] oder R[{A, B . . . C}] ist eine Relation mit dem Kopf {A, B . . . C} und einem Körper, der aus allen Tupeln der Form {A:a, B:b . . . C:c} besteht, wobei es in R ein Tupel gibt mit A-Wert a, BWert b . . . C-Wert c. Duplikate werden eliminiert. Identische Projektion: R Nilprojektion (nullary projection): R [ ] 208 Projektion S [CITY]: CITY London Paris Athens P [COLOR, CITY]: COLOR Red Green Blue Blue CITY London Paris Rome Paris (S where CITY = ’Paris’) [SNR]: SNR S2 S3 209 (Natürlicher) Join R1 sei Relation mit Kopf { A1 . . . Am, B1 . . . Bn } = { A, B } R2 sei Relation mit Kopf { C1 . . . Cp, B1 . . . Bn } = { C, B } Der natürliche Join von R1 und R2 R1 natural join R2 ist eine Relation mit dem Kopf { A, B, C } und einem Körper, der aus allen Tupeln { A:a, B:b, C:c } besteht, wobei es ein Tupel in R1 gibt mit A-Wert a und B-Wert b und ein Tupel in R2 gibt mit C-Wert c und B-Wert b. Der natürliche Join ist assoziativ und kommutativ. 210 Beispiel S natural join P: SNR S1 S1 S1 S2 S2 S3 S3 S4 S4 S4 SNAME STATUS CITY PNR Smith 20 London P1 Smith 20 London P4 Smith 20 London P6 Jones 10 Paris P2 Jones 10 Paris P5 Blake 30 Paris P2 Blake 30 Paris P5 Clark 20 London P1 Clark 20 London P4 Clark 20 London P6 211 PNAME Nut Screw Cog Bolt Cam Bolt Cam Nut Screw Cog COLOR WEIGHT Red 12 Red 14 Red 19 Green 17 Blue 12 Green 17 Blue 12 Red 12 Red 14 Red 19 Bemerkungen • Schlüssel müssen nicht beteiligt sein. • Wenn A und B keine gemeinsamen Attribute haben, dann ist der Join äquivalent zum kartesischen Produkt. • A natural join B ≡ ( (A times (B rename Y as W)) where Y = W)[X, Y, Z] Der Join ist daher keine primitive Operation. S natural join P ≡ ( (S times (P rename CITY as PCITY)) where CITY = PCITY ) [ SNR, SNAME, STATUS, CITY, PNR, PNAME, COLOR, WEIGHT ] 212 Θ-Join Sei R1 eine Relation mit dem Attribut A und R2 eine Relation mit dem Attribut B, dann ist der Θ-Join der Relation R1 auf Attribut A mit Relation R2 auf Attribut B (R1 times R2) where AΘB eine Relation mit dem Kopf des kartesischen Produkts und allen Tupeln des kartesischen Produkts, die die Bedingung AΘB erfüllen. Der equijoin ist ein Θ-Join, wobei Θ das Gleichheitszeichen ist. 213 Outer Join R1 left outer join R2 ≡ Nur Tupel des linken Partners R1 werden erhalten. R1 right outer join R2 ≡ Nur Tupel des rechten Partners R2 werden erhalten. R1 full outer join R2 ≡ Tupel des linken und rechten Partners werden erhalten. 214 Division R1 sei Relation mit Kopf { A1 . . . Am, B1 . . . Bn } = { A, B } R1 sei Relation mit Kopf { B1 . . . Bn } = { B } Die Division von R1 und R2 R1 divideby R2 ist eine Relation mit dem Kopf { A } und einem Körper, der aus allen Tupeln { A:a } besteht, wobei für jedes Tupel { B:b } in R2 mit B-Wert b es ein Tupel { A:a, B:b } in R1 gibt mit A-Wert a und B-Wert b. 215 Bemerkungen • ( R1 times R2 ) divideby R2 ergibt wieder R1. • ( R1 divideby R2 ) times R2 ⊆ R1 • Die Division ist nützlich bei Anfragen, die das Wort ”alle” enthalten. • Die Division kann durch andere Operationen ausgedrückt werden. 216 V: SNR PNR S1 P1 S1 P2 S1 P3 S1 P4 S2 P2 S3 P1 S3 P2 S3 P4 S4 P3 S4 P4 V divideby W: ? ? ? ? ? ? W: PNR P2 P4 ... ... ... ... ... ... 217 Anfrage-Beispiele 1. Namen der Lieferanten, die Teil P2 liefern. 2. Namen der Lieferanten, die mindestens ein rotes Teil liefern. 3. Namen der Lieferanten, die alle Teile liefern. 4. Lieferantennummern der Lieferanten, die mindestens alle die Teile liefern, die Lieferant S2 liefert. 5. Alle Paare von Lieferantennummern der Lieferanten, die in derselben Stadt sitzen. 6. Namen der Lieferanten, die Teil P2 nicht liefern. 218 Sinn der Algebra • Formulierung von relationalen Ausdrücken zur Definition von Daten. • Optimierer verwendet Transformationsregeln, um Ausdrücke in effizientere Ausdrücke umzuwandeln. (Mach Selektion oder Projektion vor einem Join.) • Relationale Algebra dient als Maßstab für die Mächtigkeit von Anfragesprachen (Relationale Vollständigkeit, relational completeness). 219 extend • Das extend bietet zeilenweise (horizontale) Berechnungen an. Berechnungsausdrucks (scalar computational expression) • extend term add scalar-expression as attribute extend R add Ausdruck as C extend P add (WEIGHT * 454) as GMWT • Multiples extend: extend P add City as PCITY, (WEIGHT * 454) as GMWT 220 Beispiele 1. extend S add ’Lieferant’ as BEZEICHNUNG 2. extend (P join SP) add (WEIGHT * QTY) as SHIPWT 3. (extend S add CITY as SCITY) [SNR, SNAME, STATUS, SCITY] 4. extend S add count ( (SP rename SNR as X) where X = SNR) as NP 221 summarize • summarize ermöglicht spaltenweise oder vertikale Berechnungen. • summarize term by (attribute-commalist) add aggregate-expression as attribute summarize R by (A1, A2 . . . An) add Ausdruck as C summarize SP by (PNR) add sum (QTY) as TOTQTY • Die Kardinalität des Resultats ist gleich der Kardinalität der Projektion von R über A1, A2 . . . An. • Multiples summarize: (summarize SP by (PNR) add sum (QTY) as TOTQTY, avg (QTY) as AVGQTY 222 Beispiel summarize (P join SP) by (CITY) add count as NSP ergibt : CITY NSP London 5 Paris 6 Rome 1 223 Beispiele 1. summarize SP by ( ) add sum (QTY) as GRANDTOTAL 2. summarize SP by (SNR) add count as NP 3. Alle Städte mit mehr als fünf roten Teilen: ( (summarize (P where COLOR = ’Red’) by (CITY) add count as N) where N > 5)[CITY] Alle Städte mit fünf oder weniger roten Teilen: ( (summarize (P where COLOR = ’Red’) by (CITY) add count as N) where N ≤ 5)[CITY] P[CITY] minus ( (summarize (P where COLOR = ’Red’) by (CITY) add count as N) where N > 5)[CITY] 224 Update-Operationen Zuweisungsoperator (assignment operator) target := source; S := S union { { hSNR:’S6’i, hSNAME:’Baker’i, hSTATUS:50i, hCITY:’Madrid’i } }; SP := SP minus { { hSNR:’S1’i, hPNR:’P1’i, hQTY:300i } }; 225 Update-Operationen insert-Statement : insert source into target; insert (S where CITY = ’London’) into TEMP; update-Statement : update target assignment-commalist; mit attribute := scalar-expression update P where COLOR = ’Red’, CITY = ’Paris’; delete-Statement : delete target; delete S where STATUS < 20; 226 Symbolische Notation β[SCITY←CITY] S βSCITY←CITY S σ[CITY=’London’] S σCITY=’London’ S π[COLOR, CITY] P πCOLOR, CITY P 227 Symbolische Notation S1P SP 1PNR P SP 1QTY>WEIGHT P SP 1natural P γsum(QTY);SNR SP ωQTY SP 228 Algebra – Kalkül ”Lieferantennummern und Städte von Lieferanten, die Teil P2 liefern” Algebra: ”Bilde den natürlichen Join von S und SP über SNR. Schränke dann das Resultat auf die Tupel für Teil P2 ein. Projeziere schließlich auf SNR und CITY.” Kalkül: ”Bestimme SNR und CITY für diejenigen Lieferanten, für die es eine Lieferung in SP gibt mit dem gleichen SNR-Wert und dem PNR-Wert von P2.” 229 Relationales Kalkül • Prädikatenkalkül oder der Prädikatenlogik =⇒ ALPHA =⇒ QUEL =⇒ SQL • Tupelvariable (tuple variable, range variable) ”Die Tupelvariable T durchläuft (ranges over) die Relation R.” • Tupelkalkül (tuple calculus) • QUEL: RANGE OF SX IS S RETRIEVE (SX.SNR) WHERE SX.CITY = "London" 230 Probleme mit Redundanz • Eine Aktualisierung der Daten muß an mehreren Stellen durchgeführt werden (duplication effort). • Speicherplatz wird verschwendet. • Immer lauert die Gefahr der Inkonsistenz der Daten. Aber möglicherweise controlled redundancy. 231 Vermeide Redundanz! • ”one fact in one place” • William Kent: Each attribute must represent a fact about the key, the whole key, and nothing but the key. • und wir ergänzen: And the key should not tell us anything about the object. • Der ”key” repräsentiert eindeutig eine Entität, ein Objekt der realen Welt. 232 Normalformen • 1NF, 2NF, 3NF, BCNF, 4NF und 5NF • Hierarchie • Ziel eines DB-Entwurfs ist 5NF. • Eine Relation =⇒ Menge von Relationen. 233 Verlustfreie Zerlegung (nonloss/lossless decomposition) Tabelle SSTC : SNR STATUS CITY S3 30 Paris S5 30 Athens Zerlegung a): Tabelle SST : Tabelle SC : SNR STATUS SNR CITY S3 30 S3 Paris S5 30 S5 Athens 234 Nicht verlustfreie Zerlegung Tabelle SSTC : SNR STATUS CITY S3 30 Paris S5 30 Athens Zerlegung b): Tab. SST : Tab. STC : SNR STATUS STATUS CITY S3 30 30 Paris S5 30 30 Athens 235 Funktionale Abhängigkeit Definition: Sei R eine Relation mit X und Y Teilmengen der Attribute von R. Y heißt funktional abhängig von X symbolisch: X −→ Y (”X bestimmt Y funktional”) genau dann, wenn für alle Werte von R zu jedem X-Wert in R genau ein Y Wert in R gehört. Eine solche Beziehung heißt funktionale Abhängigkeit oder kurz FD. X heißt Determinante oder linke Seite, Y Abhängige oder rechte Seite einer FD. 236 SNR S1 S1 S2 S2 S3 S4 S4 S4 CITY London London Paris Paris Paris London London London Tabelle SCPQ PNR QTY P1 100 P2 100 P1 200 P2 200 P2 300 P2 400 P4 400 P5 400 237 {SNR, PNR} {SNR, PNR} {SNR, PNR} {SNR, PNR} {SNR, PNR} {SNR} {QTY} {SNR} {CITY} {PNR} Beispiele für FDs und keine FDs −→ −→ −→ −→ −→ −→ −→ −→ −→ −→ {QTY} {CITY} {CITY, QTY} {SNR} {SNR, PNR, CITY, QTY} {QTY} {SNR} {CITY} {SNR} {QTY} 238 Inferenzregeln von Armstrong Seien A, B und C Attributteilmengen einer Relation R. Dann gilt: 1. Reflexivität: B ⊆ A =⇒ A −→ B (triviale FD) 2. Augmentation: A −→ B =⇒ A ∪ C −→ B ∪ C 3. Transitivität: A → B ∧ B→C 239 =⇒ A −→ C Inferenzregeln von Armstrong 1. Selbstbestimmung: A −→ A (triviale FD) 2. Zerlegung: A −→ B ∪ C =⇒ A → B 3. Vereinigung: A → B ∧ ∧ A→C A → C =⇒ A → B ∪ C 4. Komposition: A → B ∧ C → D =⇒ A ∪ C → B ∪ D 5. Allgemeines Unifikationstheorem (general unification theorem): A → B ∧ C → D =⇒ A ∪ (C − B) → B ∪ D 240 Irreduzierbare FDs Definition: Eine FD: A −→ B in R heißt irreduzierbar genau dann, wenn kein Attribut der linken Seite (d.h. von A) entfernt werden kann. Man sagt auch B ist voll oder irreduzierbar funktional von A abhängig. 241 Theorem von Heath Theorem von Heath: Sei R eine Relation auf den Attributen A ∪ B ∪ C, wobei A, B und C Mengen von Attributen mit jeweils leerem Durchschnitt sind. Wenn R die FD: A −→ B erfüllt, dann ist R gleich dem Join ihrer Projektionen auf A ∪ B und A ∪ C. 242 Erste Normalform Definition 1NF: Eine Relation R liegt in der ersten Normalform vor (”ist in 1NF”) genau dann, wenn jeder Attributwert atomar ist. (Der zugrundeliegende Wertebereich enthält nur skalare Werte.) 243 PNR CITY P1, P4, P6 London P2, P5 Paris P3 Rome Erste Normalform −→ PNR P1 P4 P6 P2 P5 P3 244 CITY London London London Paris Paris Rome Zweite Normalform Definition 2NF: Eine Relation R liegt in der zweiten Normalform vor (”ist in 2NF”) genau dann, wenn sie in 1NF ist und jedes Nichtschlüsselattribut voll (irreduzierbar) funktional abhängig von einem Schlüssel ist. Irreduzierbare FDs, bei denen die linke Seite ein Schlüssel ist, heißen 2NF-konform. oder anders: Eine Relation R liegt nicht in der zweiten Normalform vor, wenn es ein Nichtschlüsselattribut gibt, das nur von einem Teil des Schlüssels abhängig ist. 245 Nicht in zweiter Normalform: SNR STATUS PNR QTY S1 20 P1 300 S1 20 P2 200 S1 20 P3 400 S1 20 P4 200 S1 20 P5 100 S1 20 P6 100 S2 10 P1 300 S2 10 P2 400 S3 30 P2 200 S4 20 P2 200 S4 20 P4 300 S4 20 P5 400 246 Normalisierung 1NF → 2NF Jede Relation R, die nicht in 2NF ist, wird folgendermaßen zerlegt: Die Relation R[A, B, C] (auf den schnittfreien Attributmengen A, B, C) habe die irreduzierbare FD: A −→ B, wobei A echter Teil eines Schlüssels ist und B ein Nichtschlüsselattribut ist, dann wird durch die Zerlegung R1 = R[A, C] R2 = R[A, B] die FD: A −→ B 2NF-konform. A ist Fremdschlüssel in R1. 247 Dritte Normalform Definition 3NF: Eine Relation R liegt in der dritten Normalform vor (”ist in 3NF”) genau dann, wenn sie in 1NF ist und jedes Nichtschlüsselattribut nur (oder nicht transitiv (Date)) voll (irreduzierbar) funktional abhängig von einem Schlüssel ist. Funktionale Abhängigkeiten, die der dritten Normalform widersprechen, sind nicht 3NF-konform. 3NF schließt 2NF ein. 248 Tabelle SCST: Nicht in dritter Normalform: SNR CITY STATUS S1 London 30 S2 Paris 10 S3 Paris 10 S4 London 30 S5 Athens 30 249 Normalisierung 1NF → 3NF Jede Relation R, die nicht in 3NF ist, wird folgendermaßen zerlegt: Die Relation R[A, B, C] (auf den schnittfreien Attributmengen A, B, C) habe die irreduzierbare FD: A −→ B, wobei A nicht ein Schlüssel ist und B ein Nichtschlüsselattribut (auch nicht partiell) ist, dann wird durch die Zerlegung R1 = R[A, C] R2 = R[A, B] die FD: A −→ B 3NF-konform. A ist Fremdschlüssel in R1. 250 Zerlegung von SCST SNR S1 S2 S3 S4 S5 CITY London Paris Paris London Athens und CITY STATUS London 30 Paris 10 Athens 30 251 Unabhängige Projektionen Zerlegung R1 = SCST[SNR, CITY] und R2’ = SCST[SNR, STATUS] ? 252 Unabhängige Projektionen Definition Rissanen: R1 und R2 sind unabhängige Projektionen von R genau dann, wenn 1. jede FD in R eine logische Konsequenz der FDs in R1 und R2 ist und 2. die gemeinsamen Attribute von R1 und R2 einen Schlüssel für mindestens eine der beiden Projektionen bilden. 253 Boyce-Codd-Normalform Definition BCNF: Eine Relation ist in BCNF genau dann, wenn sie in 1NF ist und jede irreduzierbare Determinante (linke Seite) einer nicht trivialen FD ein Schlüssel ist (bzw wenn jede nicht-triviale irreduzierbare FD einen Schlüssel als Determinante hat). 254 Bem. zu Boyce-Codd-Normalform 1. Weniger formal heißt das: Linke Seiten von FDs müssen Schlüssel sein. 2. Wir sagen auch: Eine Relation ist in BCNF genau dann, wenn jede irreduzierbare FD in R BCNF-konform ist, d.h. entweder trivial ist, oder die Determinante ein Schlüssel ist. 3. BCNF ist stärker als 3NF. D.h. wenn eine Relation in BCNF ist, ist sie auch in 3NF. 4. BCNF ist konzeptionell einfacher als 3NF. 255 FD: 2NF 3NF BCNF 3NF BCNF BCNF Normalformen A −→ echter Schlüsselteil −→ B Nichtschlüssel Nichtschlüssel oder −→ Nichtschlüssel echter Schlüsselteil Nichtschlüssel oder −→ beliebige Attributmenge echter Schlüsselteil 256 Nicht in Boyce-Codd-Normalform: SSP: SNR S1 S1 S1 S1 S1 S1 S2 S2 S3 S4 S4 S4 SNAME Smith Smith Smith Smith Smith Smith Jones Jones Blake Clark Clark Clark PNR QTY P1 300 P2 200 P3 400 P4 200 P5 100 P6 100 P1 300 P2 400 P2 200 P2 200 P4 300 P5 400 257 Normalisierung auf BCNF Jede Relation R, die nicht in BCNF ist, wird in 1NF überführt und dann eventuell folgendermaßen zerlegt: Die Relation R[A, B, C] (auf den schnittfreien Attributmengen A, B, C) habe die nicht BCNF-konforme FD: A −→ B, dann wird durch die Zerlegung R1 = R[A, C] R2 = R[A, B] die FD: A −→ B BCNF-konform. A ist Fremdschlüssel in R1. 258 Beispiel zu BCNF ST Smith Smith Jones Jones FC Math Phys Math Phys DZ White Green White Brown ST Smith Smith Jones Jones DZ White Green White Brown DZ White Green Brown 259 FC Math Phys Phys Beispiel zu 4NF STPLKO: MG FK UK Smith Informatik, Grundstudium, Mathematik Hauptstudium Jones Informatik, Software, Grundstudium, Hauptstudium, Multimedia Clark Elektronik, Grundstudium, Physik, Technik Mathematik 260 STPLKO: MG Smith Smith Smith Smith Jones Jones Jones Jones Jones Jones Clark Clark Clark Clark Clark Clark FK Informatik Informatik Mathematik Mathematik Informatik Informatik Informatik Software Software Software Elektronik Elektronik Physik Physik Mathematik Mathematik Beispiel zu 4NF UK Grundstudium Hauptstudium Grundstudium Hauptstudium Grundstudium Hauptstudium Multimedia Grundstudium Hauptstudium Multimedia Grundstudium Technik Grundstudium Technik Grundstudium Technik 261 Beispiel zu 4NF MGFK: und MGUK: MG Smith Smith Jones Jones Clark Clark Clark FK Informatik Mathematik Informatik Software Elektronik Physik Mathematik MG Smith Smith Jones Jones Jones Clark Clark 262 UK Grundstudium Hauptstudium Grundstudium Hauptstudium Multimedia Grundstudium Technik Beispiel MVD {MG} → →{FK} {MG} → →{UK} 263 Multivalued Dependency Definition MVD: Seien R eine Relation und A, B und C beliebige Teilmengen der Menge der Attribute von R. Dann hängt B mehrwertig von A ab A→ →B genau dann, wenn die Menge der B-Werte, die zu einem gegebenen Paar (A-Wert, C-Wert) in R gehören, nur vom A-Wert abhängt und nicht vom C-Wert abhängt, d.h. gleich der Menge der BWerte ist, für die es ein Tupel mit dem vorgegebenen A-Wert gibt, und ungleich der Menge der B-Werte ist, für die es ein Tupel mit dem vorgegebenen C-Wert gibt. Bemerkung: Eine FD ist eine MVD, bei der die Menge der B-Werte genau ein Element hat. 264 Vierte Normalform Definition 4NF: Eine Relation R ist in 4NF genau dann, wenn aus der Existenz einer (nicht trivialen) MVD: A→ →B in R folgt, daß alle Attribute von R auch funktional von A abhängig sind. Bemerkung: In 4NF sind die einzigen nicht trivialen Abhängigkeiten FDs mit Schlüsseln als Determinanten. 265 mehr zu MVDs Satz: R sei eine Relation auf den schnittfreien Attributmengen A, B und C, dann folgt aus der MVD A→ →B die MVD A → →C. Man schreibt auch: A→ →B|C Theorem von Fagin: R sei eine Relation auf den schnittfreien Attributmengen A, B und C. Analog zum Heath’schen Theorem ist dann R gleich dem Join seiner Projektionen auf A ∪ B und A ∪ C genau dann, wenn in R die MVD: A → →B | C erfüllt ist. 266 mehr zu MVDs Rissanen gilt analog: R sei eine Relation auf den schnittfreien Attributmengen A, B und C und erfüllen die MVDs A→ →B und B → →C (und dann auch A → →C). Dann ist die Zerlegung in R[A ∪ B] und R[B ∪ C] der Zerlegung in R[A ∪ B] und R[A ∪ C] vorzuziehen (Erhaltung der Abhängigkeiten). 267 STPLKO: MG Smith Smith Jones Smith Beispiel zu JD FK Informatik Mathematik Informatik Informatik UK Grundstudium Hauptstudium Hauptstudium Hauptstudium 268 Beispiel zu JD MGUK: MGFK: MG Smith Smith Jones FK Informatik Mathematik Informatik MG Smith Smith Jones FKUK: FK Informatik Mathematik Informatik UK Grundstudium Hauptstudium Hauptstudium 269 UK Grundstudium Hauptstudium Hauptstudium Beispiel zu JD MGFK join MGUK ergibt: MG Smith Smith Smith Smith Jones FK Informatik Informatik Mathematik Mathematik Informatik UK Grundstudium Hauptstudium Grundstudium ← Hauptstudium Hauptstudium 270 SPJ: SNR S1 S1 S2 S1 PNR P1 P2 P1 P1 Abstraktes Beispiel zu JD JNR J2 J1 J1 J1 Die drei Projektionen heißen SP, SJ und PJ. 271 SPJ ist Wenn und und dann Abstraktes Beispiel zu JD gleich dem Join von SP,SJ und PJ bedeutet: das Paar (s1, p1) in SP erscheint das Paar (s1, j1) in SJ erscheint das Paar (p1, j1) in PJ erscheint, muß das Tripel (s1, p1, j1) in SPJ erscheinen. 272 Abtraktes Beispiel zu JD SPJ ist gleich dem Join von SP,SJ und PJ bedeutet: Wenn (s1, p1, j2), (s1, p2, j1) und (s2, p1, j1) in SPJ erscheinen, dann erscheint auch (s1, p1, j1) in SPJ. 273 Join-Abhängigkeit JD Definition JD: Seien R eine Relation und A, B · · · Z beliebige Teilmengen der Attribute von R. Dann erfüllt R eine Join-Abhängigkeit JD*(A, B · · · Z) genau dann, wenn R gleich dem Join seiner Projektionen auf A, B · · · Z ist. 274 Theorem von Fagin R sei eine Relation auf den schnittfreien Attributmengen A, B und C. R erfüllt die JD*(A, B, C) genau dann, wenn in R die MVD: A → →B | C erfüllt ist. 275 Fünfte Normalform Definition 5NF oder PJ/NF: Eine Relation R ist in 5NF genau dann, wenn jede JD in R von Schlüsseln in R impliziert wird. 276 Bemerkung zu 5NF 1. Eine JD*(A, B · · · Z) wird von Schlüsseln impliziert, wenn jede Attributmenge A, B · · · Z einen Schlüssel enthält. Diese Implikation folgt aus dem Theorem von Heath. Eine allgemeinere Formulierung der Implikation führt hier zu weit. 2. 5NF ist immer erreichbar. 3. Eine Relation in 5NF ist automatisch in 4NF, weil MVDs spezielle JDs sind. 4. SPJ ist nicht in 5NF, aber die Zerlegungen SP, SJ, PJ sind es. 277 Zusammenfassung Normalisierung 1. Bilde Projektionen der Original-Relation, bis alle FDs eliminiert sind, deren Determinante nicht ein Schlüssel ist. Alle Relationen sind dann in BCNF. 2. Bilde weiter Projektionen, bis alle MVDs eliminiert sind, die nicht FDs sind. Alle Relationen sind dann in 4NF. 3. Bilde weiter Projektionen, bis alle JDs eliminiert sind, die nicht von Schlüsseln impliziert werden. Alle Relationen sind dann in 5NF. 278 Domain-Key Normalform (Fagin) Definition DK/NF: Eine Relation R ist in DK/NF genau dann, wenn jede Abhängigkeit in R eine logische Konsequenz einer Wertebereichsabhängigkeit (domain constraint) oder einer Schlüsselabhängigkeit (key constraint) in R ist. • domain constraint oder attribute constraint: Jeder Wert eines Attributs muß aus einem bestimmten Wertebereich (Domäne) genommen werden. • key constraint: Gewisse Attributkombinationen bilden einen Schlüssel. 279 Zusammenfassung Eine Relation R ist in Normalform, wenn sie in 1NF ist und wenn es kein Tupel in R gibt, das von anderen Tupeln in R logisch abhängt. 280 SQL als DDL – Datendefinition CREATE DOMAIN ALTER DOMAIN DROP DOMAIN CREATE TABLE ALTER TABLE DROP TABLE 281 Wertebereich – domain • Syntaktische Kürzel • Keine Verschachtelung • Keine Typenbindung • Keine wertebereichsspezifischen Operationen • Keine Vererbung 282 Wertebereich: Syntax CREATE DOMAIN domain data-type [default-definition] [domain-constraint-definition-list] 283 Datentypen CHARACTER [VARYING] (n) BIT [VARYING] (n) INTEGER SMALLINT NUMERIC (p, q) : NUMERIC(2,1) bedeutet der Bereich -9.9 bis +9.9 . DECIMAL (p, q) : DECIMAL(2,1) bedeutet mindestens der Bereich -9.9 bis +9.9 , kann aber auch z.B. von -99.9 bis +99.9 gehen. FLOAT (p) DATE TIME TIMESTAMP INTERVAL 284 Wertebereich: Syntax CREATE DOMAIN domain data-type [default-definition] [domain-constraint-definition-list] CREATE DOMAIN COLOR CHAR (6) DEFAULT ’???’ CONSTRAINT VALID_COLORS CHECK (VALUE IN (’Red’, ’Yellow’, ’Blue’, ’Green’, ’???’)); 285 Basistabelle: Syntax CREATE TABLE base-table (base-table-element-commalist); base-table-element ::= column-definition | base-table-constraint-definition column-definition ::= column representation [DEFAULT default] 286 Basistabelle: Syntax base-table-constraint-definition ::= [CONSTRAINT constraint-name] UNIQUE (column-commalist) | PRIMARY KEY (column-commalist) | FOREIGN KEY (column-commalist) REFERENCES base-table [(column-commalist)] [ON DELETE NO ACTION | CASCADE | SET DEFAULT | SET NULL] [ON UPDATE NO ACTION | CASCADE | SET DEFAULT | SET NULL] | CHECK (conditional-expression) 287 Basistabelle: Beispiel CREATE TABLE SP ( SNR SNR NOT NULL, PNR PNR NOT NULL, QTY QTY NOT NULL, PRIMARY KEY (SNR, PNR), FOREIGN KEY (SNR) REFERENCES S ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (PNR) REFERENCES P ON DELETE CASCADE ON UPDATE CASCADE, CHECK (QTY > 0 AND QTY < 5001) ); 288 Informationsschema SCHEMATA TABLES COLUMNS COLUMN_PRIVILEGES DOMAIN_CONSTRAINTS REFERENTIAL_CONSTRAINTS KEY_COLUMN_USAGE VIEW_TABLE_USAGE CONSTRAINT_TABLE_USAGE CONSTRAINT_COLUMN_USAGE CONSTRAINT_DOMAIN_USAGE DOMAINS VIEWS TABLE_PRIVILEGES USAGE_PRIVILEGES TABLE_CONSTRAINTS CHECK_CONSTRAINTS ASSERTIONS VIEW_COLUMN_USAGE 289 INSERT INSERT INTO P (PNR, PNAME, COLOR, WEIGHT, CITY) VALUES (’P8’, ’Sprocket’, ’Pink’, 14, ’Nice’); INSERT INTO TEMP (SNR, CITY) SELECT S.SNR, S.CITY FROM S WHERE S.STATUS > 15; 290 UPDATE UPDATE SET P P.COLOR = ’Yellow’, P.WEIGHT = P.WEIGHT + 5 WHERE P.CITY = ’Paris’; UPDATE SET P CITY = (SELECT S.CITY FROM S WHERE S.SNR = ’S5’ ) WHERE P.COLOR = ’Red’; 291 DELETE DELETE FROM SP WHERE ’London’ = (SELECT S.CITY FROM S WHERE S.SNR = SP.SNR ); DELETE FROM SP; 292 SELECT Farbe und Stadt für Teile nicht in Paris und Gewicht größer als 14: SELECT P.COLOR, P.CITY FROM P WHERE P.CITY <> ’Paris’ AND P.WEIGHT > 14; 293 SELECT Farbe und Stadt für Teile nicht in Paris und Gewicht größer als 14: SELECT DISTINCT P.COLOR, P.CITY FROM P WHERE P.CITY <> ’Paris’ AND P.WEIGHT > 14; SELECT DISTINCT COLOR, CITY FROM P WHERE CITY <> ’Paris’ AND WEIGHT > 14; 294 SELECT mit Ordnung SELECT P.COLOR, P.CITY FROM P WHERE P.CITY <> ’Paris’ AND P.WEIGHT > 14 ORDER BY CITY DESC; 295 SELECT Alle Teilenummern und Gewichte in Gramm: SELECT P.PNR, P.WEIGHT * 454 AS GMWT FROM P; 296 SELECT Join (explizit) Alle Kombinationen von Lieferanten und Teilen, die in einer Stadt sind: SELECT DISTINCT S.SNR, S.SNAME, S.STATUS, S.CITY, P.PNR, P.PNAME, P.COLOR, P.WEIGHT FROM S, P WHERE S.CITY = P.CITY; 297 SELECT Join Alle Kombinationen von Lieferanten und Teilen, die in einer Stadt sind: SELECT DISTINCT S.SNR, S.SNAME, S.STATUS, S.CITY, P.PNR, P.PNAME, P.COLOR, P.WEIGHT FROM S JOIN P ON (S.CITY = P.CITY); oder SELECT DISTINCT * FROM S JOIN P USING (CITY); oder SELECT DISTINCT * FROM S NATURAL JOIN P; 298 SELECT Alle Teilenummern und Gewichte in Gramm: SELECT P.PNR, P.WEIGHT * 454 AS GMWT FROM P; 299 SELECT Join Alle Städtepaare, wobei der Lieferant in der ersten Stadt das Teil in der zweiten Stadt liefert: SELECT DISTINCT S.CITY AS SCITY, P.CITY AS PCITY FROM S JOIN SP USING (SNR) JOIN P USING (PNR); oder SELECT DISTINCT S.CITY AS SCITY, P.CITY AS PCITY FROM S NATURAL JOIN SP JOIN P USING (PNR); nicht aber SELECT DISTINCT S.CITY AS SCITY, P.CITY AS PCITY FROM S NATURAL JOIN SP NATURAL JOIN P; 300 SELECT Alle Paare von Lieferantennummern, die in derselben Stadt sitzen: SELECT ERST.SNR AS ERSTER, ZWEIT.SNR AS ZWEITER FROM S AS ERST, S AS ZWEIT WHERE ERST.CITY = ZWEIT.CITY AND ERST.SNR < ZWEIT.SNR; 301 SELECT FROM SELECT Aggregat-Funktionen COUNT(*) AS N S; SELECT MAX(SP.QTY) AS MAXQTY, MIN(SP.QTY) AS MINQTY FROM SP WHERE SP.PNR = ’P2’; 302 SELECT Aggregat-Funktionen SELECT AVG(TOTQTY) AS AVGTOTQTY FROM (SELECT SP.PNR, SUM(QTY) AS TOTQTY FROM SP GROUP BY SP.PNR ); 303 SELECT Aggregat-Funktionen SELECT SP.PNR, SUM(SP.QTY) AS TOTQTY FROM SP GROUP BY SP.PNR; SELECT FROM P.PNR, (SELECT SUM(QTY) FROM SP WHERE SP.PNR = P.PNR ) AS TOTQTY P; 304 SELECT HAVING Teilnummern von Teilen, die von mehr als einem Lieferanten geliefert werden: SELECT SP.PNR FROM SP GROUP BY SP.PNR HAVING COUNT(SP.SNR) > 1; 305 SELECT subquery SELECT DISTINCT S.SNAME FROM S WHERE S.SNR IN (SELECT SP.SNR FROM SP WHERE SP.PNR = ’P2’ ); 306 SELECT Nummern der Lieferanten mit Status kleiner als dem Maximalstatus in der Tabelle S : SELECT S.SNR FROM S WHERE S.STATUS < (SELECT MAX (S.STATUS) FROM S ); 307 SELECT EXISTS Namen der Lieferanten, die Teil P2 liefern: SELECT DISTINCT S.SNAME FROM S WHERE EXISTS (SELECT * FROM SP WHERE SP.SNR = S.SNR AND SP.PNR = ’P2’ ); 308 SELECT EXISTS Namen der Lieferanten, die nicht Teil P2 liefern: SELECT DISTINCT S.SNAME FROM S WHERE NOT EXISTS (SELECT * FROM SP WHERE SP.SNR = S.SNR AND SP.PNR = ’P2’ ); 309 SELECT EXISTS Namen von Lieferanten, die alle Teile liefern: SELECT DISTINCT S.SNAME FROM S WHERE NOT EXISTS (SELECT * FROM P WHERE NOT EXISTS (SELECT * FROM SP WHERE SP.SNR = S.SNR AND SP.PNR = P.PNR ) ); 310 SELECT EXISTS Namen von Lieferanten, die alle Teile liefern: SELECT DISTINCT S.SNAME FROM S WHERE (SELECT COUNT(SP.PNR) FROM SP WHERE SP.SNR = S.SNR ) = (SELECT COUNT(P.PNR) FROM P ); 311 Vergleich von Tabellen geht nicht. Namen von Lieferanten, die alle Teile liefern: SELECT DISTINCT S.SNAME FROM S WHERE (SELECT SP.PNR FROM SP WHERE SP.SNR = S.SNR ) = -- Fehler !!! (SELECT P.PNR FROM P ); 312 UNION Nummern von Teilen, die entweder weniger als 16 Pfund wiegen oder von Lieferant S2 geliefert werden: SELECT P.PNR FROM P WHERE P.WEIGHT < 16 UNION SELECT SP.PNR FROM SP WHERE SP.SNR = ’S2’; 313 Komplizierte Beispiel-Anfrage Bestimme Teilenummer, Gewicht in Gramm, Farbe und maximale Liefermenge für alle Teile, die rot oder blau sind und wovon mindestens insgesamt 350 geliefert wurden, wobei Lieferungen mit weniger als 201 Teilen unberücksichtigt bleiben. 314 Komplizierte Beispiel-Anfrage SELECT P.PNR, ’Grammgewicht = ’ AS TEXT1, P.WEIGHT * 454 AS GMWT, P.COLOR, ’Max Liefermenge = ’ AS TEXT2, MAX(SP.QTY) AS MQY FROM P, SP WHERE P.PNR = SP.PNR AND (P.COLOR = ’Red’ OR P.COLOR = ’Blue’) AND SP.QTY > 200 GROUP BY P.PNR, P.WEIGHT, P.COLOR HAVING SUM(SP.QTY) >= 350; 315 Resultat: PNR P1 P5 P3 Komplizierte Beispiel-Anfrage TEXT1 GMWT COLOR Grammgewicht = 5448 Red Grammgewicht = 5448 Blue Grammgewicht = 7718 Blue 316 TEXT2 MQ Max Liefermenge = 3 Max Liefermenge = 4 Max Liefermenge = 4 MATCH-Bedingung Anfrage: Bestimme alle Lieferanten, die genau eine Lieferung haben. SELECT S.* FROM S WHERE S.SNR MATCH UNIQUE (SELECT SP.SNR FROM SP); 317 All-or-Any-Bedingung Anfrage: Bestimme die Namen der Teile, deren Gewicht größer ist als das Gewicht jeden blauen Teils. SELECT DISTINCT PX.PNAME FROM P AS PX WHERE PX.WEIGHT > ALL ( SELECT PY.WEIGHT FROM P AS PY WHERE PY.COLOR = ’Blue’ ); 318 Embedded SQL • Absetzen von SQL-Statements • Verwendung von Host-Sprachen-Variablen • Verarbeitung von Anfrageresultaten • Fehlerbehandlung 319 EXEC SQL char char int EXEC SQL C++ Programmfragment BEGIN DECLARE SECTION; SQLSTATE[5]; pnr[2]; weight; END DECLARE SECTION; 320 C++ Programmfragment pnr[0] = ’P’; pnr[1] = ’2’; EXEC SQL SELECT INTO FROM WHERE P.WEIGHT :weight P P.PNR = :pnr; 321 C++ Programmfragment if (SQLSTATE[0] == ’0’ && SQLSTATE[1] == ’0’ && SQLSTATE[2] == ’0’ && SQLSTATE[3] == ’0’ && SQLSTATE[4] == ’0’) { cout << "SELECT hat funktioniert.\n"; } else { cout << "SELECT hat nicht funktioniert.\n"; } 322 EXEC EXEC EXEC EXEC SQL SQL SQL SQL WHENEVER-Deklaration WHENEVER WHENEVER WHENEVER WHENEVER NOT FOUND NOT FOUND SQLERROR SQLERROR 323 GO TO label; CONTINUE; GO TO label; CONTINUE; Operationen ohne Kursor EXEC SQL SELECT INTO FROM WHERE STATUS, CITY :rank, :city S SNR = :snr; 324 Operationen ohne Kursor EXEC SQL INSERT INTO P (PNR, PNAME, COLOR, WEIGHT, CITY) VALUES (:pnr, :pname, DEFAULT, :weight, DEFAULT); 325 Operationen ohne Kursor EXEC SQL UPDATE S SET STATUS = STATUS + :mehr WHERE CITY = ’London’; 326 Operationen ohne Kursor EXEC SQL DELETE FROM SP WHERE :city = (SELECT CITY FROM S WHERE S.SNR = SP.SNR); 327 Operationen mit Kursor EXEC SQL DECLARE X CURSOR FOR SELECT S.SNR, S.SNAME, S.STATUS FROM S WHERE S.CITY = :city; EXEC SQL OPEN X; while (SQLSTATE[1] != ’2’) { EXEC SQL FETCH X INTO :snr, :sname, :status; cout << "SNR = " << snr << " SNAME = " << sname; cout << " STATUS = " << status << endl; } EXEC SQL CLOSE X; 328 Deklaration eines Kursors EXEC SQL DECLARE cursor [SCROLL] CURSOR FOR table-expression [ ORDER BY order-item-commalist ] 329 Operationen mit Kursor EXEC SQL OPEN cursor; EXEC SQL CLOSE cursor; 330 Operationen mit Kursor EXEC SQL FETCH [[row-selector] FROM] cursor INTO host-variable-commalist; row-selector NEXT | PRIOR | FIRST | LAST | ABSOLUTE n | RELATIVE n 331 Operationen mit Kursor Die UPDATE- und DELETE-Statements können sich auch auf einen Kursor beziehen (CURRENT OF cursor). Zum Beispiel: EXEC SQL UPDATE S SET STATUS = STATUS + :mehr WHERE CURRENT OF X; 332 SELECT mit IN SELECT DISTINCT S.SNAME FROM S WHERE S.SNR IN (SELECT SP.SNR FROM SP WHERE SP.PNR IN (SELECT P.PNR FROM P WHERE P.COLOR = ’Red’ ) ); 333 JOIN-Ausdrücke AA AB XY a aa x a ab xy A: a NULL x b NULL y c cc NULL BB AB XY b bb x b ab xy B: b NULL x b NULL z c bb NULL 334 A CROSS JOIN B Resultat ist das kartesische Produkt. 335 A NATURAL [INNER] JOIN B AA BB AB XY a b ab xy 336 A [INNER] JOIN B USING (XY) AA AB a aa a aa a NULL a NULL a ab BB AB XY b bb x b NULL x b bb x b NULL x b ab xy 337 A [INNER] JOIN B ON (A.XY = B.XY) AA AB XY BB AB XY a aa x b bb x a aa x b NULL x a NULL x b bb x a NULL x b NULL x a ab xy b ab xy 338 A UNION JOIN B AA a a a b c NULL NULL NULL NULL NULL AB aa ab NULL NULL cc NULL NULL NULL NULL NULL XY x xy x y NULL NULL NULL NULL NULL NULL BB NULL NULL NULL NULL NULL b b b b c 339 AB NULL NULL NULL NULL NULL bb ab NULL NULL bb XY NULL NULL NULL NULL NULL x xy x z NULL A LEFT [OUTER] JOIN B USING (XY) AA a a a a a b c AB BB AB XY aa b bb x aa b NULL x NULL b bb x NULL b NULL x ab b ab xy NULL NULL NULL y cc NULL NULL NULL 340 A RIGHT [OUTER] JOIN B USING (XY) AA a a a a a NULL NULL AB aa aa NULL NULL ab NULL NULL BB b b b b b b c AB XY bb x NULL x bb x NULL x ab xy NULL z bb NULL 341 A FULL [OUTER] JOIN B USING (XY) AA a a a a a b c NULL NULL AB BB AB XY aa b bb x aa b NULL x NULL b bb x NULL b NULL x ab b ab xy NULL NULL NULL y cc NULL NULL NULL NULL b NULL z NULL c bb NULL 342 SQLJ • #sql { <SQL-Befehl> }; • #sql { DELETE * FROM SP }; 343 SQLJ-Präprozessor $ sqlj dateiname.sqlj 344 SQLJ Beispiel #sql iterator ResultatTyp (String, int, Date); ResultatTyp resultat; #sql resultat = { SELECT LNAME, QTY, DATUM FROM LIEFERUNG WHERE QTY > :qtySchranke }; while (!resultat.endFetch ()) { #sql { FETCH :resultat INTO :lname, :qty, :datum }; // --} 345 Vergleich SQLJ – JDBC • Vorteil von SQLJ: Verwendung von SQL, als ob es zur Sprache gehört. • Nachteil von SQLJ: Zwingend zu verwendender Präprozessor, der schlecht lesbaren Java-Code erzeugt. • Vorteil von SQLJ: Typ- und Syntax-Überprüfung zur Übersetzungszeit mit Option -online . Bei JDBC treten SQL-Syntax-Fehler erst zur Laufzeit auf. • Nachteil von SQLJ: SQL-Befehle können nicht zur Laufzeit erzeugt werden. • SQLJ und JDBC können gemischt werden. 346 Relationaler Entwurf Reguläre Entität =⇒ Basis-Tabelle mit Primärschlüssel 347 Beispiel Tabelle Abteilung mit Primärschlüssel PK: PK . . . ... ... Tabelle Angestellter mit Primärschlüssel PK und Attribut ANR: PK ANR . . . ... ... ... Tabelle Projekt mit Primärschlüssel PK: PK . . . ... ... 348 Beispiel Tabelle Lieferant mit Primärschlüssel PK: PK . . . ... ... Tabelle Teil mit Primärschlüssel PK: PK . . . ... ... 349 Relationaler Entwurf Many-to-Many-Beziehung =⇒ Basis-Tabelle • teilnehmende Entitäten werden Fremdschlüssel • Primärschlüssel: – Kombination der Fremdschlüssel oder – Einführung eines neuen Primärschlüssels 350 Beispiel Tabelle ArbeitetAn mit Primärschlüssel (FKAngestellter, FKProjekt): FKAngestellter FKProjekt . . . ... ... ... Tabelle LiefertTeil mit Primärschlüssel (FKLieferant, FKTeil): FKLieferant FKTeil . . . ... ... ... 351 Beispiel Tabelle LiefertTeilFürProjekt mit Primärschlüssel (FKLieferant, FKTeil, FKProjekt): FKLieferant FKTeil FKProjekt . . . ... ... ... ... Tabelle Struktur mit Primärschlüssel (FKETeil, FKITeil): FKETeil FKITeil . . . ... ... ... 352 Relationaler Entwurf One-to-Many-Beziehung und One-to-One-Beziehung =⇒ • Beziehung zwingend: One-Seite wird als Fremdschlüssel mit eventuellen Attributen der Beziehung in der Tabelle der Many-Seite aufgenommen. • Beziehung freigestellt ohne Attribute: – wie bei ”zwingend” oder – insbesondere wenn Beziehung selten eingegangen wird – – eigene Basis-Tabelle • Beziehung freigestellt mit Attributen: Eigene Basis-Tabelle. 353 Beispiel Tabelle Angestellter mit Primärschlüssel PK und Fremdschlüssel FKAbteilung: PK ANR . . . FKAbteilung ... ... ... ... Die Beziehung ”Leitet” wird durch den Fremdschlüssel FKAngestellter in der Tabelle Projekt mit Primärschlüssel PK ausgedrückt: PK . . . FKAngestellter ... ... ... 354 Relationaler Entwurf Dreier- und höherwertige Beziehung =⇒ Basis-Tabelle wie Many-to-Many-Beziehung 355 Relationaler Entwurf Schwache Entität =⇒ Basis-Tabelle, in der die Beziehung zur regulären Entität durch einen kaskadierenden Fremdschlüssel ausgedrückt wird. Primärschlüssel: • Einführung eines neuen Primärschlüssels oder • Kombination des Fremdschlüssels mit Attributen 356 Beispiel Tabelle Angehöriger mit Fremdschlüssel FKAngestellter und Primärschlüssel (Vorname, FKAngestellter): Vorname FKAngestellter . . . ... ... ... 357 Relationaler Entwurf Eigenschaft =⇒ • normal: Attribut der zugehörigen Tabelle • zusammengesetzt: Nur Teileigenschaften erscheinen, oder eigene Tabelle • mehrwertig: Eigene Tabelle • abhängig: Darf nur in Views erscheinen. • viele NULLs: Eigene Tabelle 358 Beispiel Tabelle Angestellter: PK ANR VorN MiN NaN Gehalt FKAbteilung ... ... ... ... ... ... ... Tabelle Adressen: FKAngestellter Adresse ... ... 359 Relationaler Entwurf Untertyp =⇒ • Basis-Tabelle mit demselben Primärschlüssel wie Obertyp • Primärschlüssel ist auch den Obertyp referenzierender, kaskadierender Fremdschlüssel. 360 Beispiel Tabelle Projekt mit Primärschlüssel PK: PK PName . . . ... ... ... 361 Beispiel Tabelle Tagesprojekt mit Primärschlüssel PK und Fremdschlüssel PK, Fremdschlüssel referenziert Tabelle Projekt: PK Tag . . . ref. Projekt ... ... ... 362 Beispiel Tabelle Langzeitprojekt mit Primärschlüssel PK und Fremdschlüssel PK, Fremdschlüssel referenziert Tabelle Projekt: PK Start Ende . . . ref. Projekt ... ... ... ... 363 Beispiel Tabelle Entwicklungsprojekt mit Primärschlüssel PK und Fremdschlüssel PK, Fremdschlüssel referenziert Tabelle Langzeitprojekt: PK ... ref. Langzeitprojekt ... ... 364 Relationaler Entwurf: Kategorie 1.) Für jede Kategorie wird eine Tabelle angelegt. Die Tabelle bekommt einen künstlichen Schlüssel (surrogate key), der in jeder Obertyptabelle als Fremdschlüssel geführt wird. Dieser Fremdschlüssel kann NULL-Werte annehmen. 365 Relationaler Entwurf: Kategorie 2.) Für jede Kategorie wird eine Tabelle angelegt. Die Schlüssel der Obertypen werden als Fremdschlüssel geführt, wobei NULL-Werte erlaubt sind. Entweder bildet die Kombination der Fremdschlüssel den Schlüssel für die Tabelle der Kategorie, was das DBMS wegen der NULLWerte möglicherweise nicht erlaubt, oder es wird ein künstlicher Schlüssel eingeführt. 366 Relationaler Entwurf: Kategorie 3.) Die sauberste Lösung ist, dass man die Gemeinsamkeiten der Obertypen in eine eigene Tabelle auslagert, von der alle Obertypen und die Kategorie erben. 367 Many-to-Many mit History Tabelle Kunde mit Primärschlüssel PK. Tabelle Lieferant mit Primärschlüssel PK. Tabelle BestellGeschichte mit zusammengesetztem Schlüssel: FKKunde FKLieferant KundenNr . . . ... ... ... ... Tabelle Bestellung mit einem dreifach zusammengesetzten Schlüssel: FKKunde FKLieferant LaufendeNr Datum Bestelltext . . . ref. BestellGeschichte ... ... ... ... ... ... 368 SQL-Statements CREATE TABLE ABTEILUNG ( DNR CHAR (6) NOT NULL, ABTNAME CHAR (12), PRIMARY KEY (DNR) ); 369 SQL-Statements CREATE TABLE ANGESTELLTER ( ANR CHAR (6) NOT NULL, DNR CHAR (6) NOT NULL, VORN CHAR (12), MIN CHAR (12), NAN CHAR (12), GEHALT DECIMAL (10, 2), PRIMARY KEY (ANR), FOREIGN KEY (DNR) REFERENCES ABTEILUNG ON DELETE NO ACTION ON UPDATE CASCADE, CHECK (GEHALT > 0.0 AND GEHALT < 1000000.00) ); 370 SQL-Statements CREATE TABLE ADRESSEN ( ADNR CHAR (6) NOT NULL, ANR CHAR (6) NOT NULL, ADRESSE CHAR VARYING (256), PRIMARY KEY (ADNR), FOREIGN KEY (ANR) REFERENCES ANGESTELLTER ON DELETE CASCADE ON UPDATE CASCADE ); 371 SQL-Statements CREATE TABLE ANGEHOERIGER ( VORNAME CHAR (12) NOT NULL, ANR CHAR (6) NOT NULL, PRIMARY KEY (VORNAME, ANR), FOREIGN KEY (ANR) REFERENCES ANGESTELLTER ON DELETE CASCADE ON UPDATE CASCADE ); 372 SQL-Statements CREATE TABLE PROJEKT ( PNR INTEGER NOT NULL, PNAME CHAR (20), ANR CHAR (6) NOT NULL, PRIMARY KEY (PNR), FOREIGN KEY (ANR) REFERENCES ANGESTELLTER ON DELETE NO ACTION ON UPDATE CASCADE ); 373 SQL-Statements CREATE TABLE ARBEITETAN ( ANR CHAR (6) NOT NULL, PNR INTEGER NOT NULL, PRIMARY KEY (ANR, PNR), FOREIGN KEY (ANR) REFERENCES ANGESTELLTER ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (PNR) REFERENCES PROJEKT ON DELETE CASCADE ON UPDATE CASCADE ); 374 SQL-Statements CREATE TABLE TAGESPROJEKT ( PNR INTEGER NOT NULL, TAG DATE, PRIMARY KEY (PNR), FOREIGN KEY (PNR) REFERENCES PROJEKT ON DELETE CASCADE ON UPDATE CASCADE ); 375 SQL-Statements CREATE TABLE LANGZEITPROJEKT ( PNR INTEGER NOT NULL, START DATE, ENDE DATE, PRIMARY KEY (PNR), FOREIGN KEY (PNR) REFERENCES PROJEKT ON DELETE CASCADE ON UPDATE CASCADE ); 376 SQL-Statements CREATE TABLE ENTWICKLUNGSPROJEKT ( PNR INTEGER NOT NULL, PRIMARY KEY (PNR), FOREIGN KEY (PNR) REFERENCES LANGZEITPROJEKT ON DELETE CASCADE ON UPDATE CASCADE ); 377 SQL-Statements CREATE TABLE LIEFERANT ( LNR CHAR (6) NOT NULL, LNAME CHAR (12), STATUS INTEGER, STADT CHAR (20), PRIMARY KEY (LNR) ); CREATE TABLE TEIL ( TNR INTEGER NOT NULL, PRIMARY KEY (TNR) ); 378 SQL-Statements CREATE TABLE LIEFERTTEILFUERPROJEKT ( LNR CHAR (6) NOT NULL, TNR INTEGER NOT NULL, PNR INTEGER NOT NULL, PRIMARY KEY (LNR, TNR, PNR), FOREIGN KEY LNR REFERENCES LIEFERANT ON DELETE NO ACTION ON UPDATE CASCADE, 379 SQL-Statements FOREIGN KEY TNR REFERENCES TEIL ON DELETE NO ACTION ON UPDATE CASCADE, FOREIGN KEY PNR REFERENCES PROJEKT ON DELETE CASCADE ON UPDATE CASCADE ); 380 SQL-Statements CREATE TABLE LIEFERTTEIL ( LNR CHAR (6) NOT NULL, TNR INTEGER NOT NULL, PRIMARY KEY (LNR, TNR), FOREIGN KEY LNR REFERENCES LIEFERANT ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY TNR REFERENCES TEIL ON DELETE CASCADE ON UPDATE CASCADE ); 381 SQL-Statements CREATE TABLE STRUKTUR ( TNRE INTEGER NOT NULL, -- Das Teil TNRE enthält TNRI INTEGER NOT NULL, -- das Teil TNRI MENGE INTEGER, PRIMARY KEY (TNRE, TNRI), FOREIGN KEY (TNRE) REFERENCES TEIL (TNR) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (TNRI) REFERENCES TEIL (TNR) ON DELETE CASCADE ON UPDATE CASCADE, CHECK (MENGE > 0 OR MENGE = NULL) ); 382 Defizite traditioneller DB • ingenieurmäßige Entwicklungsarbeiten (CAD/CAM/CAE/CASE) • integrierte Produktion (CIM) • Bild- und Graphikdatenbanken • wissenschaftliche Datenbanken • geographische Informationssystemen • Multimedia-Datenbanken • Entwicklung einer einheitlichen Schnittstelle für viele unterschiedliche Datenbanksysteme 383 Neue Anforderungen an DB • Die Strukturen der Entitäten oder Objekte sind wesentlich komplizierter. • Transaktionen dauern manchmal sehr lange (Stunden, Tage). • Neue Datentypen zur Speicherung von Bildern und langen Texten werden benötigt. • Man muss die Möglichkeit haben, nicht-standardisierte, von der jeweiligen Anwendung abhängige Operationen zu definieren. 384 Experimentelle ooDBS-Prototypen • ORION von MCC (Microelectronics and Computer Technology Corporation) • OpenOODB von Texas Instruments • IRIS von Hewlett-Packard • ODE von ATT Bell Labs • ENCORE/ObServer von Brown University 385 Kommerzielle ooDBS • GEMSTONE/OPAL von Gemstone Systems • ONTOS von Ontology • Objectivity von Objectivity • Versant von Versant Technologies • ObjectStore von Object Design • O2 von O2 Technology • POET von POET Software • db4o von Versant 386 relational – objektorientiert • Paradigma der Datenrepräsentation: Im relationalen Modell werden Daten um Eigenschaften gruppiert, im objektorientierten Modell um Objekte. • Identität • Problem des sogenannten impedance mismatch • Komplexe Objekte • Verhalten • Orthogonale Persistenz 387 Erwartungen an ooDBS • Komplizierte, verschachtelte Objekte können als Ganzes oder teilweise manipuliert werden. • Beliebig lange Daten können gespeichert werden. In den Daten kann gesucht werden. • Beliebige Datentypen können repräsentiert werden. • Versionen sollten verwaltbar sein. • Langandauernde kooperative Transaktionen sollen unterstützt werden. • Regeln spezifizierbar. Repräsentation wissensbasierter Systeme. 388 Objekt-orientiertes Datenmodell Objekt und Objekt-Identifikator: Jede Entität der realen Welt ist ein Objekt und hat einen systemweit eindeutigen Identifikator. Attribute und Methoden: Ein Objekt hat Attribute und Methoden, die mit den Werten der Attribute arbeiten. Die Werte von Attributen sind auch Objekte. Datenkapselung (encapsulation) und Botschaften (message passing): Einem Objekt werden Botschaften geschickt, um auf die Werte der Attribute und die Methoden des Objekts zuzugreifen. Die möglichen Botschaften bilden die Oberfläche (interface) des Objekts. 389 Objekt-orientiertes Datenmodell Klasse: Alle Objekte, die dieselben Attribute und Methoden haben, können als zu einer Klasse gehörig betrachtet werden. Ein Objekt gehört nur zu einer Klasse als Instanz der Klasse. Eine Klasse ist auch ein Objekt, ist eine Instanz einer Metaklasse (metaclass). Klassenhierarchie und Vererbung: Die Klassen eines Systems bilden eine Hierarchie oder einen gerichteten, nicht-zyklischen Graphen mit Wurzel. Spezialisierung. Generalisierung.Subklasse (Unterklasse) (subclass). Superklasse (Oberklasse) (superclass). Jede Subklasse erbt alle in der Superklasse definierten Attribute und Methoden. Die Subklasse kann zusätzliche Attribute und Methoden haben. Eine Instanz einer Subklasse kann wie eine Instanz der Superklasse verwendet werden. 390 Normalisierung These: Eine ooDB ist normalisiert, wenn jedes Datenelement oder Objekt höchstens einmal in der DB vorkommt. Identifikatoren von Objekten können beliebig oft vorkommen; aber diese Zeiger-Redundanzen müssen von den Objekten transparent für den Benutzer der Objekte verwaltet werden und dürfen nicht als Datenwerte verwendet werden. 391 Persistenzmodell • Vererbung • Delegation • Explizite Datenbank-Aufrufe (z.B. store, create, update, delete). 392 Queries – Anfrage-Strings • IDEs oder Compiler können die Syntax und Semantik der Anfrage nicht überprüfen. • Bezeichner, die in Strings vorkommen, werden nicht automatisch bei einem Refactoring nachgezogen. • Oft werden private Datenelemente direkt angesprochen, was dem Prinzip der Datenkapselung widerspricht. • Die Entwickler müssen zwischen Programmier- und AnfrageSprache hin- und herschalten. • Typische oo Möglichkeiten (Polymorphismus) stehen bei Anfragen nicht zur Verfügung. 393 Klasse Teil class Teil (extent Teile) { attribute string PNR; attribute string PNAME; attribute string COLOR; attribute short WEIGHT; attribute string CITY; short GMWT () { return 454 * WEIGHT; } } 394 Klasse Lieferant class Lieferant (extent Lieferanten) { attribute string SNR; attribute string SNAME; attribute short STATUS; attribute string CITY; } 395 Klasse Lieferung class Lieferung (extent Lieferungen) { attribute Lieferant S; attribute Teil P; attribute short QTY; } 396 Objektorientiertes SQL – OQL • Objekte werden direkt und nicht über Schlüsselwerte referenziert. • In der SELECT-Klausel treten Eigenschaften von Objekten auf, wobei die ”Punkt”- oder ”Pfeil”-Notation verwendet wird. • In der FROM-Klausel wird angegeben, zu welchen Klassen oder Mengen die Objekte gehören. • In den SELECT- und WHERE-Klauseln können Operationen verwendet werden. 397 OQL Farbe und Stadt für Teile nicht in Paris und Gewicht größer als 10: SELECT P.COLOR, P.CITY FROM P IN Teile WHERE P.CITY <> ’Paris’ AND P.WEIGHT > 10; 398 OQL Alle Teilenummern und Gewichte in Gramm: SELECT FROM P.PNR, P.GMWT P IN Teile; 399 OQL Namen der Lieferanten, die Teil P2 liefern: SELECT DISTINCT SP.S.SNAME FROM SP IN Lieferungen WHERE SP.P.PNR = ’P2’; 400 Objektorientierter DB-Entwurf • Pseudocode mit ooDB-Konstrukten wie persistent, unique, ref, container • ODL 401 ”Hat-ein” – Beziehung • has-a, Whole-Part, Teil-Ganzes, ”ist-Teil-von” • Aggregation oder Komposition • Komponentengruppe hat eine oder viele Komponenten • One-to-One-Beziehung oder One-to-Many-Beziehung (”Hat-viele”) • hat keine Eigenschaften • Referenz (Referenz-Behälter) ◦ oder Objekt (Objekt-Behälter) • Eine echte ”Hat-ein” – Beziehung kann wie eine Eigenschaft behandelt werden. 402 ”Benutzt-ein” – Beziehung • uses-a • meistens eine Many-to-One-Beziehung, seltener eine Many-to-Many-Beziehung (”Benutztviele”) • hat keine Eigenschaften • Referenz oder Referenz-Behälter beim Benutzer (Client) • selten Referenz-Behälter beim Benutzten (Server) • E/R-Modell enthält benutzte Methode des Servers. Deklaration dieser Methode in der Server-Klasse. 403 ”Benutzt-ein” – Beziehung class User { private ref Used used; } class Used { private ref container User // optional } 404 contUser; Ähnlichkeit • Kann nicht direkt mit Vererbung implementiert werden. • Gemeinsamkeiten ähnlicher Entitäten müssen in einer eigenen Klasse definiert werden, von der die einander ähnlichen Entitäten dann erben. • Beispiel: Rechteck – Quadrat 405 Kategorie • K ist Kategorie der Typen Ti. • G ist gemeinsame für K relevante Schnittstelle von Ti. • Ti erben bzw implementieren G. • K hat Referenz g vom Typ G. • K kann mit g seine Methoden implementieren. • K kann zusätzlich G erben bzw implementieren. 406 Kategorie interface G { Returntyp methode (); } persistent class Ti implements G { Returntyp methode () { Methoden-Implementation } } persistent class K { Returntyp methodeVonK () { ... g.methode () ... } ref G g; } 407 Entität class ABTEILUNG (extent Abteilungen) { // --} class ANGESTELLTER (extent Angestellte key ANR) { attribute string ANR; // --} 408 Eigenschaften struct aname { string VORN, string MIN, string NAN } struct adresse { string strasse, string ort } class ANGESTELLTER (extent Angestellte key ANR) { attribute string ANR; attribute aname ANAME; attribute double GEHALT; double monatsgehalt (); attribute set<adresse> ADRESSE; } 409 Beziehung class ABTEILUNG { relationship set<ANGESTELLTER> hatAngestellte inverse ANGESTELLTER::istInAbteilung; } class ANGESTELLTER { relationship ABTEILUNG istInAbteilung inverse ABTEILUNG::hatAngestellte; } 410 Beziehung class ANGESTELLTER { relationship set<ARBEITETAN> bearbeitet inverse ARBEITETAN::angestellter; } class PROJEKT { relationship set<ARBEITETAN> wirdBearbeitet inverse ARBEITETAN::projekt; } class ARBEITETAN { relationship ANGESTELLTER angestellter inverse ANGESTELLTER::bearbeitet; relationship PROJEKT projekt inverse PROJEKT::wirdBearbeitet; } 411 Beziehung class ANGESTELLTER { relationship set<PROJEKT> bearbeitet inverse PROJEKT::wirdBearbeitet; } class PROJEKT { relationship set<ANGESTELLTER> wirdBearbeitet inverse ANGESTELLTER::bearbeitet; } 412 ”Benutzt-ein” – Beziehung class User { relationship Used uses inverse Used::used; } class Used { relationship set<User> inverse User::uses; } 413 used Vererbung: Erweiterung class TAGESPROJEKT extends PROJEKT { // --attribute date TAG; // --} 414 Vererbung: Obertyp-Untertyp interface VorhabenIfc { // --} interface ProjektIfc : VorhabenIfc { // --} class PROJEKT : ProjektIfc { // --} 415 Kategorie interface G { Returntyp methode (); } class Ti : G { Returntyp methode () context ( Methoden-Implementation ); } class K { Returntyp methodeVonK () context ( ... g.methode () ... ); attribute G g; } 416 Objektorientierter Entwurf Reguläre Entität =⇒ Klasse, deren Objekte persistent sind. Schlüssel sind prinzipiell nicht nötig, spielen keine Rolle bei Beziehungen, sind aber nützlich beim Finden von Objekten. 417 Objektorientierter Entwurf persistent class { // --} ABTEILUNG persistent class ANGESTELLTER { // --unique String ANR; // Primärschlüssel // --} 418 Objektorientierter Entwurf Eigenschaft =⇒ Privates Datenelement einer Klasse mit geeigneten öffentlichen Zugriffsmethoden. 419 Objektorientierter Entwurf Abgeleitete Eigenschaft =⇒ Methode 420 Objektorientierter Entwurf Zusammengesetzte Eigenschaft =⇒ globale oder lokale Klasse, deren Objekte Datenelement der Klasse mit der entsprechenden Eigenschaft werden. 421 Objektorientierter Entwurf Mehrwertige Eigenschaft =⇒ Behälter-Klassenobjekt als Datenelement 422 Objektorientierter Entwurf Verhalten =⇒ Methoden 423 Objektorientierter Entwurf class ANAME { private String private String private String } VORN; MIN; NAN; 424 Objektorientierter Entwurf persistent class { public double private private private private } ANGESTELLTER monatsgehalt () { return GEHALT / 13.2; } unique String ANR; // Primärschlüssel ANAME aname; double GEHALT; container ADRESSE contADRESSE; 425 Objektorientierter Entwurf Beziehung =⇒ persistente Klasse (Beziehung mit Eigenschaften) eventuell mit Referenz(-Behälter) bei den Teilnehmern oder nur Referenz(-Behälter) bei den Teilnehmern der Beziehung 426 Objektorientierter Entwurf Many— to —Many Referenz-Behälter Referenz-Behälter Many— to —One Referenz Referenz-Behälter One— to —One Referenz Referenz 427 Objektorientierter Entwurf Beziehung ”AbtAngest”: persistent class ABTEILUNG { private ref container ANGESTELLTER } persistent class ANGESTELLTER { private ref ABTEILUNG abteilung; } 428 contAngestellter; Objektorientierter Entwurf Beziehung ”ArbeitetAn”: persistent { private } persistent { private } persistent { private private } class ANGESTELLTER ref container ARBEITETAN class PROJEKT ref container ARBEITETAN class contArbeitetan; contArbeitetan; ARBEITETAN ref ANGESTELLTER angestellter; ref PROJEKT projekt; 429 Objektorientierter Entwurf Schwache Entität =⇒ Klasse, deren Objekte Datenelemente der Klasse einer regulären Entität sind. Schwache Entität ist eine ”Hat-ein”–Beziehung und die ”Hat-ein”–Beziehung ist eine Eigenschaft. 430 Objektorientierter Entwurf Untertyp-Obertyp-Beziehung =⇒ Untertyp erbt vom Obertyp. persistent class TAGESPROJEKT extends PROJEKT { private DATE TAG; // Klasse DATE muß // natürlich definiert sein } 431 ”objektorientiertes” E/R-Diagramm Stärkere Nutzung der Obertyp-Untertyp-Beziehung (Vererbung), insbesondere wenn zwei Entitäten zwei verschiedene Beziehungen eingehen. Beispiel: Angestellter ArbeitetAn Projekt Angestellter Leitet Projekt sollte modelliert werden als: Angestellter ArbeitetAn Projekt Projektleiter Ist-ein Angestellter Projektleiter Leitet Projekt 432 Hierarchische DBMS MARS VI (Multi-Access Retrieval System) von Control Data IMS (Information Management System) von IBM System-2000 von MRI/SAS IMAGE 9000 von HP 433 Hierarchisches Datenmodell Datensatz Feldwert Datensatztyp record field value, data item record type Elter-Kind-Beziehung 1:M-Beziehung parent-child relationship PCR-type Eltertyp Kindtyp parent record type child record type 434 Hierarchisches Datenmodell Hierarchisches Datenbankschema hierarchical database schema besteht aus consists of Hierarchien hierarchies 435 Hierarchisches Datenmodell ABTEILUNG ABTNRANAME ... ... ANGESTELLTER ANGNR ... ... ... ... PROJEKT ... ... ... ... 436 Hierarchisches Datenmodell • Ein spezieller Datensatztyp, die Wurzel (root), ist niemals Kind. • Jeder Datensatztyp kann als Kind nur in genau einer Beziehung vorkommen. • Als Elter kann ein Datensatztyp in beliebig vielen Beziehungen vorkommen. • Ein Datensatz, der kein Elter ist, ist ein Blatt (leaf ). • Wenn ein Elter mehrere Kindtypen hat, dann sind diese von links nach rechts geordnet. 437 M:N-Beziehung ABTEILUNG ANGESTELLTER PROJEKT ANGESTELLTER 438 Instanzenbaum occurrence tree procedure preorder_traverse (parent_record); begin output (parent_record); for each child_record of parent_record in left to right order do preorder_traverse (child_record); end; 439 Probleme 1. M:N-Beziehungen 2. Kinder mit mehreren Eltern 3. ternäre und höherwertige Beziehungen 440 VPCR Hierarchie 1 Hierarchie 2 ABTEILUNG PROJEKT virt. PROJEKT ANGEST virt. ANGEST 441 Netzwerk-Datenmodell 1971 CODASYL-DBTG (Conference on Data System Languages – Database Taskgroup) 1984 NDL (Netzwerk-Definitions-Sprache) IDMS von IBM (Integrated Database Management System) UDS von Siemens (Universal Database System) 442 Netzwerk-Datenmodell Datensatz Datensatztyp record record type Datenelement Format data item, attribute format, data type Wiederholungsgruppe repeating group virtuelle, abgeleitete virtual, derived Datenelemente data item 443 Netzwerk-Datenmodell STUDENT NAME MATRIKEL GEBURTSTAG 444 Netzwerk-Datenmodell Datenelementtyp NAME MATRIKEL GEBURTSTAG Format CHARACTER 30 CHARACTER 6 CHARACTER 8 445 Netzwerk-Datenmodell STUDENT NAME MATRIKEL GEBURTSTAG 446 LEISTUNG FACH NOTE Netzwerk-Datenmodell: Beziehungen Mengentyp set type Besitzertyp owner record type Mitgliedstyp member record type Die Mitglieder einer Menge sind geordnet. Wir können vom ersten, zweiten, i-ten und letzten Datensatz sprechen. (owner-coupled set oder co-set). 447 Netzwerk-Datenmodell: Beziehungen Bachmann-Diagramm KURS ··· ↓ KURSBELEGUNG STUDENT NAME ··· KNAME 448 Netzwerk-Datenmodell: Beziehungen System-eigene Mengen (system-owned, singular set): spezielle Mengen ohne Besitzerdatensatztyp (entry points). Multi-Mitglieds-Mengen (multimember set): Mitglieder unterschiedlichen Typs 449 Netzwerk-Datenmodell: Beziehungen Rekursiven Mengen (recursive set): Besitzer und Mitglied sind vom gleichen Typ. ANGESTELLTER LEITET ANGESTELLTER −→ ISTLEITER −→ ANGESTELLTER MANAGER ←− LEITET 450 Netzwerk-Datenmodell: Beziehungen M:N-Beziehungen: ANGESTELLTER −→ ARBEITETAN ←− PROJEKT 451 Beispiel Transaktion EXEC SQL INSERT INTO SP (SNR, PNR, QTY) VALUES (’S5’, ’P1’, 180); EXEC SQL UPDATE P SET TOTQTY = TOTQTY + 180 WHERE PNR = ’P1’; 452 Transaktion begin transaction : SQL: Es läuft keine Transaktion. Transaktionsinitiierendes Statement commit transaction : SQL: COMMIT; rollback transaction : SQL: ROLLBACK; 453 Beispiel Transaktion EXEC SQL WHENEVER SQLERROR GO TO rollback; EXEC SQL INSERT -- Beginn der Transaktion INTO SP (SNR, PNR, QTY) VALUES (’S5’, ’P1’, 180); EXEC SQL UPDATE P SET TOTQTY = TOTQTY + 180 WHERE PNR = ’P1’; EXEC SQL COMMIT -- Ende der Transaktion; goto ende; rollback: EXEC SQL ROLLBACK -- Ende der Transa.; ende: ; 454 ACID-Eigenschaften • Atomicity : Transaktionen sind atomar. (”Alles oder Nichts”) • Consistency : Eine Transaktion transformiert die Datenbank von einem konsistenten (korrekten) Zustand in einen anderen konsistenten (korrekten) Zustand. • Isolation : Transaktionen sind voneinander isoliert. Keine Transaktion kann Zwischenzustände einer anderen Transaktion sehen. • Durability : Änderungen an der Datenbank sind nach einem COMMIT permanent, auch wenn es sofort danach zu einem Systemabsturz kommt. 455 Nebenläufigkeit (Concurrency) Probleme: • lost update (verlorene Aktualisierung) • uncommitted dependency (Abhängigkeit von nicht permanenten Daten) • inconsistent analysis (Arbeit mit inkonsistenten Daten) 456 Lost Update 1. Transaktion A ermittelt Tupel p zur Zeit t1. 2. Transaktion B ermittelt Tupel p zur Zeit t2. 3. Transaktion A aktualisiert Tupel p zur Zeit t3 (auf der Basis von Werten, die zur Zeit t1 gesehen wurden). 4. Transaktion B aktualisiert Tupel p zur Zeit t4 (auf der Basis von Werten, die zur Zeit t2 gesehen wurden). 457 Uncommitted Dependency 1. Transaktion B aktualisiert Tupel p zur Zeit t1. 2. Transaktion A ermittelt (oder aktualisiert gar) Tupel p zur Zeit t2. 3. Transaktion B macht ein ROLLBACK zur Zeit t3. 458 Inconsistent Analysis 1. Transaktion A ermittelt K1(= 40) und summiert (S = 40). 2. Transaktion A ermittelt K2(= 50) und summiert (S = 90). 3. Transaktion B ermittelt K3(= 60). 4. Transaktion B aktualisiert K3 = K3 − 10 = 50. 5. Transaktion B ermittelt K1(= 40). 6. Transaktion B aktualisiert K1 = K1 + 10 = 50. 7. Transaktion B COMMIT. 8. Transaktion A ermittelt K3(= 50) und summiert (S = 140). 459 Sperren (Locking) 1. X-Lock (exclusive lock, write-Lock, write-exclusive, exclusives Schreiben, Schreibsperre) 2. S-Lock (shared lock, read-lock, read-sharable, gemeinsames Lesen, Lesesperre) 3. U-Lock (upgrade lock) S-Lock U-Lock X-Lock S-Lock ja ja nein U-Lock ja nein nein X-Lock nein nein nein 460 Lost Update 1. Transaktion A fordert S-Lock für Tupel p, bekommt das S-Lock und ermittelt Tupel p zur Zeit t1. 2. Transaktion B fordert S-Lock für Tupel p, bekommt das S-Lock und ermittelt Tupel p zur Zeit t2. 3. Transaktion A fordert X-Lock für Tupel p zur Zeit t3 und muß auf das X-Lock warten, da Transaktion B ein S-Lock auf Tupel p hat. 4. Transaktion B fordert X-Lock für Tupel p zur Zeit t4 und muß ebenfalls auf das X-Lock warten, da Transaktion A ein S-Lock auf Tupel p hat. 5. . . . 461 Uncommitted Dependency 1. Transaktion B fordert X-Lock für Tupel p, bekommt das X-Lock und aktualisiert Tupel p zur Zeit t1. 2. Transaktion A fordert S-Lock (X-Lock) für Tupel p zur Zeit t2 u nd muß warten, bis B das X-Lock freigibt. 3. Transaktion B macht ein ROLLBACK zur Zeit t3 und gibt damit alle Locks frei. 4. Transaktion A bekommt das S-Lock (X-Lock) und ermittelt (aktualisiert) Tupel p zur Zeit t4. 462 Inconsistent Analysis 1. Transaktion A fordert S-Lock für K1 , bekommt dies, ermittelt K1 (= 40) und summiert (S = 40). 2. Transaktion A fordert S-Lock für K2 , bekommt dies, ermittelt K2 (= 50) und summiert (S = 90). 3. Transaktion B fordert S-Lock für K3 , bekommt dies und ermittelt K3 (= 60). 4. Transaktion B fordert X-Lock für K3 , bekommt dies und aktualisiert K3 = K3 − 10 = 50. 5. Transaktion B fordert S-Lock für K1 , bekommt dies und ermittelt K1 (= 40). 6. Transaktion B fordert X-Lock für K1 und bekommt dies nicht, weil A ein S-Lock darauf hat. Wartet. 7. Transaktion A fordert S-Lock für K3 und bekommt dies nicht, weil B ein X-Lock darauf hat. Wartet. 8. . . . 463 Behandlung von Verklemmung Voranforderungsstrategie (preclaim strategy) : Jede Transaktion fordert alle ihre Sperren an, bevor sie mit der Ausführung beginnt. Toleranzstrategie : Verklemmungen werden erlaubt und gelöst. Zur Erkennung einer Verklemmung muß ein Vorranggraph (Wait-For-Graph) aufgebaut werden. Zur Auflösung einer Verklemmung wird eine der verklemmten Transaktionen zurückgesetzt (ROLLBACK) – eventuell mit Meldung an den Benutzer – und später wieder neu gestartet. 464 Behandlung von Verklemmung Strategie mit U-Locks : Vor Beginn fordert jede Transaktion für alle Objekte, die gelesen werden sollen, ein S-Lock, und für alle Objekte, die aktualisiert werden sollen, ein U-Lock an. Während einer Transaktion werden dann vor dem Aktualisieren die entsprechenden X-Locks angefordert. 465 Behandlung von Verklemmung 1. Transaktion A fordert S-Locks für K1 , K2 und K3 . Bekommt diese. 2. Transaktion A ermittelt K1 (= 40) und summiert (S = 40). 3. Transaktion A ermittelt K2 (= 50) und summiert (S = 90). 4. Transaktion B fordert U-Locks für K1 und K3 . Bekommt diese. 5. Transaktion B ermittelt K3 (= 60). 6. Transaktion B fordert X-Lock für K3 und bekommt dies nicht. Wartet. 7. Transaktion A ermittelt K3 (= 60) und summiert (S = 150). 8. Transaktion A ist fertig und gibt Locks frei. 9. Transaktion B bekommt nun X-Lock für K3 und aktualisiert K3 = K3 − 10 = 50. 10. Transaktion B ermittelt K1 (= 40). 11. Transaktion B fordert X-Lock für K1 , bekommt dies und aktualisiert K1 = K1 + 10 = 50. 466 Behandlung von Verklemmung 1. Transaktion A fordert S-Locks für K1 , K2 und K3 . Bekommt diese. 2. Transaktion A ermittelt K1 (= 40) und summiert (S = 40). 3. Transaktion A ermittelt K2 (= 50) und summiert (S = 90). 4. Transaktion B fordert X-Locks für K1 und K3 . Bekommt diese nicht und wartet. 5. Transaktion A ermittelt K3 (= 60) und summiert (S = 150). 6. Transaktion A ist fertig und gibt Locks frei. 7. Transaktion B bekommt nun seine Locks. 8. Transaktion B ermittelt K3 (= 60). 9. Transaktion B aktualisiert K3 = K3 − 10 = 50. 10. Transaktion B ermittelt K1 (= 40). 11. Transaktion B aktualisiert K1 = K1 + 10 = 50. 467 Serialisierbarkeit • Eine verschachtelte Durchführung von mehreren korrekten Transaktionen ist dann korrekt, wenn sie serialisierbar ist, d.h. wenn sie dasselbe Resultat liefert wie mindestens eine nicht verschachtelte (serielle) Durchführung der Transaktionen. 468 Zwei-Phasen-Sperrtheorem • Wenn alle Transaktionen das Zwei-Phasen-Sperrprotokoll (two-phase-locking-protocol) beachten, dann sind alle möglichen verschachtelten Durchführungen serialisierbar, wobei das Zwei-PhasenSperrprotokoll folgendermaßen aussieht: 1. Bevor eine Transaktion ein Objekt benützt, muß sie eine Sperre auf das Objekt setzen. 2. Nach der Freigabe einer Sperre darf eine Transaktion keine weiteren Sperren setzen (auch keine Upgrade-Locks). 469 Sperren und SQL • SQL unterstützt keine expliziten Sperrmechanismen. • SQL-Anweisungen fordern implizit die entsprechenden Locks an. • Locks werden bis zum Ende einer Transaktion gehalten, wodurch automatisch das Zwei-Phasen-Sperrprotokoll eingehalten wird. 470 Isolationsniveau (Level of Isolation) SET TRANSACTION ISOLATION LEVEL SERIALIZABLE Serialisierbarkeit REPEATABLE READ ermöglicht das Lesen von Phantomen READ COMMITTED erlaubt zusätzlich nicht wiederholbares Lesen (nonrepeatable read) READ UNCOMMITTED erlaubt zusätzlich ”schmutziges” Lesen (dirty read) 471 Isolationsniveau Typ der Verletzung der Serialisierbarkeit Isolationsniveau dirty read nonrepeatable read phanto READ UNCOMMITTED ja ja ja READ COMMITTED nein ja ja REPEATABLE READ nein nein ja SERIALIZABLE nein nein nein 472 Sperrgranularität (Degree of Granularity) • die gesamte Datenbank • eine Relation • ein physischer Plattenblock • ein Tupel • ein Attributwert 473 Weitere Sperrmechanismen IS (intent shared) : Transaktion T beabsichtigt S-Locks auf einzelne Tupel von R zu setzen, um einzelne Tupel in R zu lesen. S (shared) : Transaktion T erlaubt konkurrierende Leser für R. Aktualisierende Transaktionen sind in R nicht erlaubt. T selbst wird keine Aktualisierungen von R vornehmen. IX (intent exclusive) : Transaktion T beabsichtigt X-Locks auf einzelne Tupel von R zu setzen. SIX (shared intent exclusive) : Transaktion T erlaubt konkurrierende Leser für R. Aktualisierende Transaktionen sind in R nicht erlaubt. Aber T selbst wird einzelne Tupel von R aktualisieren und X-Locks auf einzelne Tupel von R zu setzen. X (exclusive) : T erlaubt überhaupt keinen konkurrierenden Zugriff auf R. T selbst wird eventuell einzelne Tupel von R aktualisieren. 474 Kompatibiltätsmatrix X X nein SIX nein IX nein S nein IS nein – ja SIX nein nein nein nein ja ja IX S IS – nein nein nein ja nein nein ja ja ja nein ja ja nein ja ja ja ja ja ja ja ja ja ja ja 475 interface { enum void boolean boolean Object void }; Transaktionsmodell der ODMG Object Lock_Type {read, write, upgrade}; lock (in Lock_Type mode) raises (LockNotGranted); try_lock (in Lock_Type mode); same_as (in Object anObject); copy (); delete (); 476 interface { void void void void void void boolean }; Transaktionsmodell der ODMG Transaction begin () raises (TransactionInProgress, DatabaseClosed); commit () raises (TransactionNotInProgress); abort () raises (TransactionNotInProgress); checkpoint () raises (TransactionNotInProgress); join () raises (TransactionNotInProgress); leave () raises (TransactionNotInProgress); isOpen (); 477 Transaktionsmodell der ODMG interface TransactionFactory { Transaction new (); Transaction current (); }; 478 Java Binding public interface Transaction { public void begin (); public void commit (); public void abort (); public void checkpoint (); public void join (); public void leave (); public boolean isOpen (); public void lock (Object obj, int mode); public boolean try_lock (Object obj, int mode); public static final int READ = 1; public static final int UPGRADE = 2; public static final int WRITE = 4; } 479 Wiederherstellung (Recovery) Journal: 1. aktiver Teil auf Platte 2. Archivteil auf Band 480 Arten von Recovery • Transaction Recovery bei Transaktionsfehlern • System Recovery bei Systemabsturz ohne Schädigung der Speichermedien • Media Recovery bei Hardware-Fehler des Speichermediums 481 Transactionrecovery COMMIT- oder ROLLBACK-Statement : Etablierung eines Syncpoints oder commit point COMMIT : Neuer Syncpoint etabliert. Dabei werden alle Änderungen an der Datenbank seit dem letzten Syncpoint permanent gemacht. Alle Tupel-Locks werden freigegeben. Tupeladressierbarkeit geht verloren (Kursoren). Die Transaktion wird beendet. ROLLBACK : Zurück zum vorhergehenden Syncpoint. 482 Systemrecovery Systemabsturz: Inhalt des Hauptspeichers geht verloren. (write-ahead log rule): Journaleintrag vor dem COMMIT Recovery: Für einige Transaktionen muß COMMIT, für andere ROLLBACK gemacht werden. Checkpoints in regelmäßigen Abständen. 483 Verwendung von Checkpoints 1. Transaktion T1 wurde vor tc beendet. Recovery : Nicht nötig. 2. Transaktion T2 wurde vor tc gestartet und zwischen tc und tf beendet. Recovery : Muß wiederholt werden. 3. Transaktion T3 wurde vor tc gestartet und nicht vor tf beendet. Recovery : ROLLBACK 4. Transaktion T4 wurde nach tc gestartet und vor tf beendet. Recovery : Muß wiederholt werden. 5. Transaktion T5 wurde nach tc gestartet und nicht vor tf beendet. Recovery : ROLLBACK 484 Mediarecovery Physikalischer Schaden am Speichermedium Recovery: 1. (reloading, restoring) der Datenbank von einem Backup-Medium 2. Mit Journal alle Transaktionen seit Backup wiederholen 485 Schutz von Daten Sicherheit von Daten bedeutet, daß nur berechtigte DB-Benutzer auf Daten zugreifen können. Die Berechtigungen können von der Art der Daten abhängen. Integrität von Daten bedeutet, daß Datenmanipulationen korrekt sind. 486 Problemkreise von Sicherheit • juristisch (Datenschutz) • organisatorisch • technisch • DB-spezifisch 487 Arten der Zugangskontrolle 1. discretionary access control: Vergabe von Berechtigungen (Lesen, Schreiben) für bestimmte Datenobjekte an bestimmte Benutzer (privileges, authorities) 2. mandatory access control: Vergabe von unterschiedlichen Sicherheitsstufen an Benutzer (clearance level) und Datenobjekte (classification level). 488 Sicherheitsregeln in SQL/92 security-rule ::= GRANT privilege-commalist ON { [TABLE] table | DOMAIN domain } TO { user-commalist | PUBLIC} [ WITH GRANT OPTION ] | REVOKE [ WITH GRANT OPTION ] privilege-commalist ON { [TABLE] table | DOMAIN domain } FROM { user-commalist | PUBLIC} { RESTRICT | CASCADE }; 489 Sicherheitsregeln in SQL/92 privilege ::= USAGE | SELECT | INSERT [ (column-commalist) ] | UPDATE [ (column-commalist) ] | DELETE | REFERENCES 490 Sicherheitsregeln in SQL/92 CREATE VIEW SR3 AS SELECT S.SNR, S.SNAME, S.CITY FROM S WHERE S.CITY <> ’London’; GRANT SELECT, UPDATE (S.SNAME), DELETE ON SR3 TO Pschorr, Salvator WITH GRANT OPTION; REVOKE WITH GRANT OPTION DELETE ON SR3 FROM Pschorr; 491 Datenverschlüsselung DES (Data Encryption Standard) ist ein StandardAlgorithmus, der auf dem symmetrischen oder secret key Verfahren beruht, wo jeder Kommunikationspartner über denselben, geheimen Schlüssel verfügt. Asymmetrische Verfahren beruhen darauf, daß zwei Schlüssel verwendet werden: ein öffentlich bekannter zum Verschlüsseln und ein geheimer Schlüssel zum Entschlüsseln. Als Algorithmus wird RSA nach Rivest, Shamir und Adleman verwendet. 492 Integritätsregeln • Wertebereichsintegritätsregeln • Datenbank-Integritätsregeln • Basistabellen-Integritätsregeln • Spalten-Integritätsregeln 493 Wertebereichsintegritätsregel domain-definition ::= CREATE DOMAIN domain [ AS ] data-type [ default-definition ] [ domain-constraint-definition-list ] domain-constraint-definition ::= [ CONSTRAINT constraint ] CHECK ( conditional-expression ) domain-constraint-alteration-action ::= ADD domain-constraint-definition | DROP CONSTRAINT constraint 494 Wertebereichsintegritätsregel CREATE DOMAIN GESCHLECHT CHAR (1) CHECK ( VALUE IN ( ’m’, ’w’)); CREATE DOMAIN STATUS INTEGER CONSTRAINT KEINENULL CHECK ( VALUE IS NOT NULL ) CONSTRAINT MAXSTATUS CHECK ( VALUE <> 0 ) CONSTRAINT MAXSTATUS CHECK ( VALUE <= 100 ); 495 Datenbank-Integritätsregeln CREATE ASSERTION constraint CHECK ( conditional-expression ); DROP ASSERTION constraint; 496 Datenbank-Integritätsregeln CREATE ASSERTION REGEL1 CHECK ( (SELECT MIN(S.STATUS) FROM S) > 4); CREATE ASSERTION REGEL2 (NOT EXISTS (SELECT FROM WHERE CHECK * P P.COLOR = ’Red’ AND P.CITY <> ’London’)); 497 Datenbank-Integritätsregeln CREATE ASSERTION REGEL3 (NOT EXISTS (SELECT FROM WHERE CHECK * S JOIN SP USING (SNR) S.STATUS < 10)); 498 Basistabellen-Integritätsregeln [ CONSTRAINT constraint ] {PRIMARY KEY | UNIQUE } ( column-commalist ) [ CONSTRAINT constraint ] FOREIGN KEY ( column-commalist ) references-definition [ CONSTRAINT constraint ] CHECK ( conditional-expression ) 499 Spalten-Integritätsbedingungen 1. NOT NULL 2. PRIMARY KEY oder UNIQUE 3. references-definition 4. check-constraint-definition 500 Wann wird Integrität geprüft? INITIALLY IMMEDIATE NOT DEFERRABLE (Default) Integritätsbedingung wird sofort bei der Ausführung eines SQL-Statements überprüft. INITIALLY IMMEDIATE DEFERRABLE Mit SET CONSTRAINTS Statement (siehe unten) kann der Mode der Regel auf IMMEDIATE oder DEFERRED gesetzt werden. INITIALLY DEFERRED [ DEFERRABLE ] Integritätsregeln werden nur am Ende der Transaktion überprüft. 501 Wann wird Integrität geprüft? SET CONSTRAINTS {constraint-commalist | ALL} {DEFERRED | IMMEDIATE} Die genannten Constraints müssen DEFERRABLE sein. Das Statement kann vor oder während einer Transaktion gegeben werden. 502 CREATE VIEW SELECT FROM WHERE Beispiel View SGUT AS SNR, STATUS, CITY S STATUS > 15; 503 Wozu Views ? • Basisrelationen: Unabhängigkeit von physikalischer Repräsentation • Views: Unabhängigkeit von logischer Repräsentation. Ermöglicht Transparenz für den Benutzer bei – Wachstum – Restrukturierung – verschiedenen Sichten – Sicherheit 504 SELECT FROM P.CITY S JOIN JOIN P WHERE S.CITY ”Macro”-Eigenschaft AS PCITY SP USING (SNR) USING (PNR) = ’London’; CREATE VIEW CITIES (PCITY, SCITY) AS SELECT P.CITY, S.CITY FROM S JOIN SP USING (SNR) JOIN P USING (PNR); SELECT PCITY FROM CITIES WHERE SCITY = ’London’; 505 SQL/92-Syntax view-definition ::= CREATE VIEW view [ ( column-commalist ) ] AS table-expression [ WITH [ CASCADED | LOCAL ] CHECK OPTION ] view-destruction ::= DROP VIEW view { RESTRICT | CASCADE } 506 Views sind aktualisierbar oder nicht. Der View SGUT ist aktualisierbar. Der View CITIES ist nicht aktualisierbar. SQL-Aktualisierbarkeit ist eingeschränkter als theoretische Aktualisierbarkeit. WITH CASCADED CHECK OPTION ist vernünftig. 507 Verteiltes Datenbanksystem (DDBS) Daten-Server-Prozesse auf unterschiedlichen Rechnern Replikation: Daten redundant auf mehreren Servern wegen Effizienz oder Ausfallsicherheit. Verteilung oder Partitionierung: Daten sind nicht redundant verteilt. Verteilungstransparenz 508 ANSI-SPARC-Architektur (Globale) externe Ebenen: Beschreiben anwendungsspezifische Darstellungen der Daten. Sie werden ausschießlich auf dem (globalen) konzeptuellen Schema definiert. (Globale) konzeptuelle Ebene: Das (globale) konzeptuelle Schema (GKS) beschreibt den integrierten globalen Datenbestand ohne Hinweise auf die Verteilung der Daten. (Globale) interne Ebene: Diese Ebene besteht aus verschiedenen genormten Ebenen. 509 Interne Ebene Fragmentierungsebene: Das Fragmentierungsschema beschreibt die Aufteilung der Datenbankobjekte auf Teilobjekte, z.B. Relationen auf Teil-Relationen. Allokationsebene: Das Allokationsschema beschreibt die Zuordnung von Teilobjekten (Fragmenten) zu Komponenten-DBSs (Knoten, konkrete Rechner). Wird ein Teilobjekt mehreren Knoten zugeordnet, spricht man von Replikation. Ebene der Komponenten-DBS: Jeder Knoten ist wieder ein DBS, dessen externe Ebene eine Transformations-Ebene (mapping) ist. 510 Fragmentierung und Allokation • Horizontale Fragmentierung • Vertikale Fragmentierung • Gemischte Fragmentierung • Abgeleitete Fragmentierung FRi = Ri 1K (πK FRr ) 511 kontrollierte Replikation • Effizienz • Ausfallsicherheit • Autonomie (Knoten, die nicht ständig am Netz sind.) 512 Replikationskontrolle Master-Slave (Primary Copy): Es gibt eine ausgezeichnete Replikation, die Primärkopie, auf der alle Aktualisierungen (Datenänderungen) zuerst durchgeführt werden. Majority-Consensus: Beim Abstimmungsverfahren nehmen die Rechnerknoten an einer Abstimmung darüber teil, ob ein Zugriff auf replizierte Daten erlaubt werden kann oder nicht. (Lese- und Schreibquoren) 513 Katalog • Ein zentralisierter Katalog wird auf einem Rechner zentral gehalten. • Ein vollredundanter Katalog wird vollständig auf allen Knoten repliziert. • Ein Cluster- oder Mehrfachkatalog ist ein Kompromiss zwischen den ersten beiden Möglichkeiten. (Teilnetze) • Schließlich können ausschließlich lokale Kataloge gehalten werden, die zu einem virtuellen globalen Katalog integriert werden. 514 Verteilte Transaktionen, Commit • Alle Rechnerknoten kommen global zu einer Entscheidung. Dabei ist nur Commit oder Rollback möglich. • Ein Knoten kann eine getroffene Entscheidung nicht mehr rückgängig machen. • Eine Commit-Entscheidung kann nur getroffen werden, wenn alle Knoten mit ”ja” gestimmt haben. • Treten keine Fehler auf und votieren alle Knoten mit ”ja”, so lautet die Entscheidung auf Commit. • Das Protokoll ist robust. D.h. unter den vorgegebenen Randbedingungen terminieren alle Prozesse. 515 Zwei-Phasen-Commit 1. Wahlphase: Der Koordinator veranlasst jedes beteiligte DBMS, alle Journaleinträge, die die Transaktion betreffen, auf das physikalische Speichermedium zu schreiben (Prepare-Commit). Jedes DBMS meldet dann an den Koordinator ”OK” (VoteCommit), wenn sie ein Commit durchführen können (bzw ”NOT OK” (Vote-Abort), falls das nicht möglich ist). 2. Entscheidungsphase: Wenn der Koordinator von allen beteiligten DBMS eine Antwort hat, dann schreibt er in sein eigenes physikalisches Journal seine Entscheidung: ”commit” (alle Antworten ”OK”) oder ”rollback”. Dann benachrichtigt der Koordinator alle DBMS, die ”OK” gestimmt haben, über seine Entscheidung, die dann entsprechend dieser Entscheidung verfahren müssen. 516 Drei-Phasen-Commit 1. Wahlphase: Der Koordinator sendet an alle beteiligten DBMS die Nachricht Prepare. Jeder Teilnehmer meldet dann an den Koordinator ”OK” (Vote-Commit), wenn er ein Commit durchführen kann (bzw ”NOT OK” (Vote-Abort), falls das nicht möglich ist). 517 Drei-Phasen-Commit 1. Wahlphase 2. Entscheidungsvorbereitungsphase: Der Koordinator sammelt von allen beteiligten DBMS die Antworten. Wenn alle Antworten ”OK” (Vote-Commit) waren, sendet er an alle Teilnehmer Prepare-To-Commit. Ansonsten sendet er an alle Teilnehmer ein ”rollback” (Abort). Jeder Teilnehmer, der mit Vote-Commit gestimmt hat, wartet auf ein Prepare-To-Commit oder ein Abort. Bei Abort entscheidet er auf Abbruch, ansonsten bestätigt er mit Ready-To-Commit. 518 Drei-Phasen-Commit 1. Wahlphase 2. Entscheidungsvorbereitungsphase 3. Entscheidungsphase: Der Koordinator sammelt alle Bestätigungen und entscheidet gegebenenfalls auf Commit, das allen Teilnehmern mitgeteilt wird. Die Teilnehmer warten auf die Entscheidung des Koordinators und führen dann die entsprechende Operation aus. 519 Transaktionen auf Replikaten Definition Serialisierbarkeit: Eine verschachtelte Durchführung von Transaktionen auf einer replizierten Datenbank ist 1-Kopie-serialisierbar, wenn es eine serielle Durchführung auf einer nicht-replizierten Datenbank gibt, die den gleichen Effekt erzeugt wie auf dem replizierten Datenbestand. 520 Synchronisation von Replikaten ROWA-Verfahren (Read One, Write All): Bei ändernden Operationen sollen alle Replikate synchron geändert werden. Das ist ein hoher Aufwand. Eine Variante ist das ROWAA-Verfahren (Read One, Write All Available), bei dem nur die erreichbaren Replikate verändert werden. Abstimmungsverfahren: Die schon besprochenen Abstimmungsverfahren gibt es in verschiedenen Varianten (Gewichtung der Stimmen, statische und dynamische Quoren). Absolutistische Verfahren: Hierzu gehört die PrimärkopieMethode. 521 Verteilte Verklemmung Time-Out-Mechanismus: Diese Methode bricht eine wartende Transaktion nach einer bestimmten Wartezeit ab. Globaler Deadlock-Graph: Ein zentraler Koordinator vereinigt die lokalen Deadlock-Graphen zu einem globalen DeadlockGraphen. (Phantom-Deadlock-Problem) Zeitmarken als Anforderungs-Ordnung: Bei diesem Verfahren wird die totale Ordnung der Zeitmarken der Transaktionen verwendet. Eine zu spät gekommene Transaktion bricht ab. Globale Deadlock-Erkennung: Wenn eine Transaktion blockiert wird, dann verschickt sie eine Nachricht, die eine Transaktions-Identifikation enthält, an die blockierende Transaktion. 522 POET • persistente Objekte • Anfragen (Queries) • Transaktionen (Transactions) • Sperrmechanismen (Locking) • Ereignisbehandlung (Event handling) 523 C++ wird als DDL und DML POET-Schlüsselwörter und Kontrukte werden mit Präprozessor ptxx in Standard C++ übersetzt. 524 Persistente Klassen Headerfile .hcd #include <poet.hxx> persistent class Rechteck { public: Rechteck (double a, double b); double flaeche (); double umfang (); void show (); private: double a; double b; }; 525 ptxx generiert DB und Files: Rechteck.hxx Rechteck.ptx Rechteck.cxx Persistente Klasse erben von PtObject. Implementation der Klasse steht in Rechteck.C, das den File Rechteck.hxx inkludiert. 526 File.ptx RechteckAllSet RechteckQuery RechteckOndemand RechteckIndirectLSet Implementation in File.cxx. Muß übersetzt und eingebunden werden. 527 Öffnen und Schließen der DB InitPOET ("ClientName"); PtBase* pooDB; PtBase::POET ()->GetBase ("ServerName", "DBname", pooDB); PtBase::POET ()->UngetBase (pooDB); DeinitPOET (); 528 Speichern eines Objekts Rechteck* p = new Rechteck (5, 6); p->Assign (pooDB); p->Store (); delete p; 529 Finden von Objekten RechteckAllSet alleRechtecke (pooDB); Rechteck* p; for (long i (0); alleRechtecke.Get (p, i, PtSTART) == 0; i++) { p->flaeche (); alleRechtecke.Unget (p); } 530 Finden von Objekten i = 0; while (alleRechtecke.Get (p, i, PtSTART) == 0 && p->umfang () <= 10) { alleRechtecke.Unget (p); i++; } if (p != (Rechteck*)NULL) { p-> show (); alleRechtecke.Unget (p); } 531 ondemand-Spezifikation persistent class { }; Beschriftung persistent class Rechteck { public: ondemand<Beschriftung> }; 532 beschrift; Belegung eine ondemands Beschriftung* pB = new Beschriftung ("Hello"); pB->Assign (pooDB); Rechteck* pR = new Rechteck (3, 7); pR->Assign (pooDB); pR->beschrift.SetReference (pB); pR->Store (); 533 Laden von der DB bei Bedarf Beschriftung* pB; pR->beschrift.Get (pB); // Verwendung von pB pR->beschrift.Unget (pB); 534 Abhängige Objekte (Dependents) persistent class Rechteck { public: depend GeoForm* geoForm; }; 535 Transiente Objekte persistent class Rechteck { public: void Activate () { PtObject::Activate (); // init my transients and other stuff hilf = 42; } private: transient int hilf; }; 536 Mengen (Sets) persistent class Rechteck { public: cset<GeoForm*> setOfGeoForms; }; 537 Methoden von Mengen Append (PtObject*) fügt Elemente in die Menge ein. Get (PtObjekt*, long, ...) setzt aktuelles Element in Abhängigkeit von einem Offset und einer Startposition und stellt es über einen PtObject*-Zeiger zur Verfügung. (Eine Menge hat immer ein ”aktuelles” Element.) Delete () löscht das aktuelle Element. Clear () löscht alle Elemente der Menge. 538 Mengenarten cset ist eine kompakte Menge mit schnellem Zugriff, die z.B. bei einem PC in ein Segment paßt. lset ist eine große Menge, die beim PC die Segmentgröße überschreiten und das ganze RAM benutzen kann. Bei UNIX-Systemen steht der Hauptspeicher dafür zur Verfügung. hset ist eine riesige Menge, die den gesamten zur Verfügung stehenden Plattenplatz einnehmen kann. Der Zugriff ist hier natürlich am langsamsten. 539 Anfragen (Queries) Alle Rechtecke mit a-Seite größer 5: RechteckSet result; RechteckAllSet alleRechtecke (pooDB); RechteckQuery rQ; rQ.Seta (5, PtGT); alleRechtecke.Query (&rQ, &result); 540 Anfragen über Filter auf AllSet RechteckAllSet alleRechtecke (pooDB); RechteckQuery rQ; rQ.Seta (5, PtGT); alleRechtecke.SetFilter (&rQ); // Auswertung von alleRechtecke alleRechtecke.UnsetFilter (); 541 Komplexe Anfragen persistent class Rechteck { public: Dreieck* dreieck; }; 542 Komplexe Anfragen Alle Rechtecke, die ein Dreieck haben, dessen Seite c kleiner gleich 4 ist: RechteckQuery rq; DreieckQuery dq; dq.Setc (4, PtLTE); rq.Setdreieck (&dq); RechteckAllSet allR (pooDB); RechteckSet result; allR.Query (&rq, &result); 543 Komplexe Anfragen persistent class Rechteck { public: cset<Dreieck*> dreiecke; }; 544 Komplexe Anfragen Alle Rechtecke, deren Seite a größer als 10 ist und die mindestens 2 Dreiecke haben, deren Seite c kleiner gleich 4 ist: RechteckQuery rq; rq.Seta (10, PtGT); DreieckQuery dq; dq.Setc (4, PtLTE); rq.Setdreiecke (2, PtGTE, &dq); RechteckAllSet allR (pooDB); RechteckSet result; allR.Query (&rq, &result); 545 Sortieren des Resultats Alle Rechtecke mit a-Seite 10 aufsteigend sortiert nach der b-Seite: RechteckSet result; RechteckAllSet alleRechtecke (pooDB); RechteckQuery rQ; rQ.Seta (10, PtEQ); rQ.SortByb (PtASCENDING); alleRechtecke.Query (&rQ, &result); 546 Komplexe Sortierung Alle Rechtecke, deren Seite a größer als 10 ist und die ein Dreieck haben, dessen Seite c kleiner gleich 4 ist, absteigend sortiert nach der b-Seite des Dreiecks: RechteckQuery rq; rq.Seta (10, PtGT); DreieckQuery dq; dq.Setc (4, PtLTE); rq.Setdreieck (&dq); rq.SortByb (PtDESCENDING); RechteckAllSet allR (pooDB); RechteckSet result; allR.Query (&rq, &result); 547 Indizierung, Schlüssel persistent class Rechteck { private: char name[30]; int nummer; useindex RechteckIndex; }; unique indexdef { name[[12]]; nummer; }; RechteckIndex : Rechteck 548 Weitere POET-Mechanismen • Locking • Transaktionen • Ereignisbehandlung • Sicherheit 549 Locking Lock-Spezifikationsobjekte der Klasse PtLockSpec Konstruktor hat zwei Argumente: PtLockSpec (PtLK_..v.., Pt...) 550 Argument PtLK_..v.. PtLK_NONE PtLK_READvDELETE PtLK_READvWRITE PtLK_WRITEvWRITE PtLK_DELETEvWRITE PtLK_DELETEvREAD PtLK_EXCLUSIVE 551 Argument Pt... PtFLAT PtSHALLOW PtNO_ONDEMAND PtDEEP 552 Lock-Syntax myAllSet.Get (&p, 1, PtStart, &lockSpezifikation); // Es wird versucht das Lock zu setzen. // p wird manipuliert. p->Store (); myAllSet.Unget (&p, &lockSpezifikation); // Das Lock wird wieder freigegeben. 553 Typisches Beispiel int ret; for (int i (0); i < maxVersuche; i++) { ret = myAllSet.Get (&p, 1, PtStart, &lockSpezifikation); if (ret == 0) break; else sleep (1); } if (ret == 0) // Lock war erfolgreich. { // p wird manipuliert. p->Store (); myAllSet.Unget (&p, &lockSpezifikation); } 554 Bemerkungen • Freigabe von Locks • Serialisierung von Locks • Verschachtelung von Locks • Lock (PtLockSpec*) Methode von PtObject, PtObjectSet PtOnDemand und • Unlock (PtLockSpec*) • Query (PtQuery*, PtObjectSet*, PtLockSpec*) 555 MySQL – Dokumentation http://www.mysql.com/documentation/ ......../mysql/manual.html 556 MySQL-Installation unter SuSE Installiere mit YaST: mysql.rpm mysqclnt.rpm mysqllib.rpm mysqbnch.rpm mysqldev.rpm (MySQL-Server) (MySQL-Clients) (Shared Libraries) (Benchmark-Tests) (C-Entwicklungsumgebung) 557 MySQL-Installation unter SuSE root# /sbin/init.d/mysql start Automatisch: /etc/rc.config START_MYSQL="yes" $ps -axu | grep mysql MySQL-Server-User: /etc/my.cnf user = mysql 558 Sicherheit • Username (Betriebssystem-Login) • Passwort ("") • Hostname ("localhost") $ mysql -u Username@Hostname -p 559 test_-Datenbanken root# mysql -u root -p Enter password: xxx mysql> USE mysql; mysql> DELETE FROM user WHERE user=’’; mysql> FLUSH PRIVILEGES; mysql> exit 560 Privilegien Privileg Erklärung für Tabellen und eventuell Spalten SELECT Erlaubt Daten zu lesen. INSERT Erlaubt Datensätze einzufügen. UPDATE Erlaubt Datensätze zu ändern. DELETE Erlaubt Datensätze zu löschen. INDEX Erlaubt Indexe anzulegen oder zu löschen. ALTER Erlaubt die Tabellenstruktur zu ändern. 561 Privilegien Privileg Erklärung für Datenbanken, Tabellen, Indexe und eventuell Spalten USAGE Erlaubt nichts. CREATE Erlaubt Anlegen von Datenbanken bzw Tabellen. DROP Erlaubt Löschen von Datenbanken bzw Tabellen. WITH GRANT OPTION Erlaubt das Weitergeben von Privilegien. REFERENCES noch nicht in Verwendung 562 Privilegien Privileg Erklärung für Dateizugriff FILE Erlaubt lokale Dateien zu lesen und zu schreiben. für MySQL-Administration PROCESS Erlaubt processlist und kill. RELOAD Erlaubt reload, refresh, flush-.... SHUTDOWN Erlaubt MySQL herunterzufahren. 563 Tabelle: Attribut ↓ Host User Password Db Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Grant_priv References_priv Index_priv Alter_priv Reload_priv Shutdown_priv Process_priv File_priv Table_name Column_name Grantor Timestamp Table_priv Column_priv user db host tables_priv columns_priv abc abc 123 — Y/N Y/N Y/N Y/N Y/N Y/N Y/N Y/N Y/N Y/N Y/N Y/N Y/N Y/N — — — — — — abc abc — abc Y/N Y/N Y/N Y/N Y/N Y/N Y/N Y/N Y/N Y/N — — — — — — — — — — abc — — abc Y/N Y/N Y/N Y/N Y/N Y/N Y/N Y/N Y/N Y/N — — — — — — — — — — abc abc — abc — — — — — — — — — — — — — — abc — abc 456 pri1 pri2 abc abc — abc — — — — — — — — — — — — — — abc abc — 456 — pri2 564 Sicherheits-Tabellen • user • db • host • tables_priv • columns_priv • func 565 Granularität der Privilegien MySQL-Ebene: Privileg gilt für alle Datenbanken und deren Tabellen und Spalten (global). SQL: GRANT/REVOKE ... ON *.* ... Datenbank-Ebene: Privileg gilt für eine Datenbank und ihre Tabellen und Spalten. SQL: GRANT/REVOKE ... ON datenbankname.* ... SQL: GRANT/REVOKE ... ON * ... (alle Tabellen der aktiven Datenbank) Tabellen-Ebene: Privileg gilt für eine Tabelle und ihre Spalten. SQL: GRANT/REVOKE ... ON datenbankname.tabellenname ... SQL: GRANT/REVOKE ... ON tabellenname ... (aktive Datenbank) Spalten-Ebene: Privileg gilt für angegebene Spalten einer Tabelle. SQL: GRANT/REVOKE privilegx (spaltey, ...), ... ON tabellenname ... 566 Tabelle user Steuert den Zugang zu MySQL und verwaltet die globalen Privilegien. Für root sind diese defaultmäßig auf ”Y” gestellt. mysql> GRANT USAGE ON *.* TO Oskar@Rechner IDENTIFIED BY ’geheim’; mysql> GRANT ALL ON *.* TO Oskar@Rechner WITH GRANT OPTION; (ALL umfasst nicht das Privileg GRANT.) mysql> REVOKE DELETE ON *.* FROM Oskar@Rechner; mysql> REVOKE GRANT OPTION ON *.* FROM Oskar@Rechner; mysql> DELETE FROM user where User=’Oskar’; 567 Tabelle db Steuert den Zugang zu einer Datenbank und verwaltet die Privilegien für die einzelnen Datenbanken. mysql> GRANT ALL ON etoto.* TO Oskar WITH GRANT OPTION; 568 Tabelle host Die Tabelle host kommt nur zum Einsatz, wenn das Feld Host in der Tabelle db leer ist. Dann wird in host gesucht, ob es ein passendes Host/Db-Paar gibt, und, falls es ein Paar gibt, werden die Privilegien aus db und host logsich mit AND verknüpft. Das Resultat ergibt dann die erlaubten Privilegien. Die Tabelle host wird nicht durch die Kommandos GRANT und REVOKE berührt. mysql> GRANT ALL ON etoto.* TO Oskar@amadeus; mysql> UPDATE db SET Host=’’ > WHERE User=’Oskar’ AND Host=’amadeus’; mysql> INSERT INTO host (Host, Db, Select_priv) > VALUES (’amadeus’, ’etoto’, ’Y’); 569 Tabelle tables_priv Steuert den Zugriff auf einzelne Tabellen. mysql> GRANT SELECT, UPDATE ON etoto.geld TO Oskar; Die Tabelle tables_priv verwaltet die Rechte als Mengen (SET). 570 Tabelle columns_priv Steuert den Zugriff auf einzelne Spalten. mysql> GRANT SELECT (betrag), UPDATE (betrag) > ON etoto.geld TO Oskar; Die Tabelle cloumns_priv verwaltet die Rechte ebenfalls als Mengen (SET). 571 Tabelle func Ermöglicht die bisher noch nicht dokumentierte Verwaltung von benutzerdefinierten Funktionen (UDF, user defined function). 572 Werkzeuge mysql> SHOW GRANTS FOR Oskar; mysql> SHOW GRANTS FOR Oskar@amadeus; $ mysqlaccess Oskar etoto $ mysql_setpermission -u root 573 Systemsicherheit • Kann sich jemand unberechtigterweise als root oder SystemAdministrator auf dem System einloggen? • Sind die Logging-Dateien abgesichert? Dort finden sich Passwörter im Klartext. • Sind Script-Dateien, in denen Passwörter im Klartext stehen, ausreichend abgesichert? • Der MySQL-Server darf nicht unter root laufen, sondern unter einem speziellen Benutzer, also etwa mysql. • Oft ist es nicht nötig, dass MySQL über den Port 3306 von außen ansprechbar ist. Dann kann man diesen Port mit FirewallMechanismen sperren. 574 Einrichten einer Datenbank mysql> CREATE DATABASE Datenbankname; mysql> GRANT ALL ON Datenbankname.* TO DatenbanknameAdmin > IDENTIFIED BY ’Passwort’ WITH GRANT OPTION; mysql> CREATE DATABASE etoto; mysql> GRANT ALL ON etoto.* TO etotoadmin > IDENTIFIED BY ’geheim’ WITH GRANT OPTION; 575 Anlegen eines Benutzers mysql> GRANT USAGE ON etoto.* TO Oskar@Rechner > IDENTIFIED BY ’klose’; mysql> GRANT USAGE ON *.* TO ’’@Rechner; 576 Ändern des Passworts mysql> GRANT ... IDENTIFIED BY neuesPasswort $ mysqladmin -u Oskar -p password neuesPasswort Enter password: altesPasswort 577 Backup einer Tabelle mysql> BACKUP TABLE Tabelle TO ’Verzeichnis’; mysql> RESTORE TABLE Tabelle FROM ’Verzeichnis’; mysql> BACKUP TABLE S TO ’/tmp/supaBackups’; mysql> DROP TABLE S; mysql> RESTORE TABLE S FROM ’/tmp/supaBackups’; 578 Backup einer Datenbank $ mysqldump -u DBloginname -p --opt Datenbankname > Backupdatei $ mysql -u DBloginname -p Datenbankname < Backupdatei oder mysql> CREATE DATABASE Datenbankname; mysql> USE Datenbankname; mysql> SOURCE Backupdatei; 579 Datentyp TINYINT SMALLINT MEDIUMINT INT, INTEGER BIGINT FLOAT DOUBLE, REAL DECIMAL(p,s) NUMERIC, DEC DATE TIME DATETIME YEAR TIMESTAMP CHAR(n) VARCHAR(n) TINYTEXT TEXT MEDIUMTEXT LONGTEXT TINYBLOB BLOB MEIUMBLOB LONGBLOB ENUM SET Erklärung 8-Bit-Integer 16-Bit-Integer 24-Bit-Integer 32-Bit-Integer 64-Bit-Integer 8-stellige Fließkommazahl 16-stellige Fließkommazahl Fließkommazahl als Zeichenkette Datum in der Form 2002-07-27 Zeit in der Form 14:31:45 Kombination in der Form 2002-07-27 14:31:45 Jahreszahl 1900 bis 2155 Kombination in der Form 20020727143145 Zeichenkette mit vorgegebener Länge, maximal n = 255 Zeichenkette mit variabler Länge n < 256 wie VARCHAR(255) Zeichenkette mit variabler Länge, maximal 216 − 1 Zeichenkette mit variabler Länge, maximal 224 − 1 Zeichenkette mit variabler Länge, maximal 232 − 1 Binärdaten mit variabler Länge, maximal 28 − 1 Binärdaten mit variabler Länge, maximal 216 − 1 Binärdaten mit variabler Länge, maximal 224 − 1 Binärdaten mit variabler Länge, maximal 232 − 1 Aufzählung von maximal 65535 Zeichenketten (1 oder 2 Byte) Menge von maximal 63 Zeichenketten (1 bis 8 Byte) 580 Client / Server • Web-Technologien • Client-seitige Applikationsprogramme 581 Web-Technologien • Browser • Webserver • Applikationsserver • Datenbankserver • Fileserver 582 Web-Technologien • statische HTML-Seite • Applets • SSI • CGI • Server-API • Server-Skripte – PHP – ASP – JavaScript – JSP • Servlets 583 Datenbanksystem db4o • Installation • Öffnen, Schließen einer Datenbank • Speichern von Objekten • Finden von Objekten • Aktualisieren von Objekten • Löschen von Objekten • NQ – Native Anfragen • SODA Query API 584 Datenbanksystem db4o • Strukturierte Objekte • Felder und Collections • Vererbung • Tiefe Graphen und Aktivierung • Indexe • Transaktionen • Client/Server • Identifikatoren 585 Datenbanksystem db4o Es fehlt noch: • SODA-Auswertung • Konfiguration • Enhancement • Replication 586 Installation db4o-8.0.184.15484-all-java5.jar (bei uns db4o.jar) 587 Anwendung und DB DB TAXI :String Anwendung main (arg :String[*]) 588 import Öffnen, Schließen com.db4o.*; com.db4o.ObjectContainer db = com.db4o.Db4oEmbedded.openFile ( Db4oEmbedded.newConfiguration (), "taxi.db4o"); db.close (); try { ... } finally { db.close (); } 589 Bemerkungen 1. ObjectContainer repräsentiert Datenbank oder Client-Verbindung zu einem db4o-Server. 2. Jeder ObjectContainer besitzt eine Transaktion, die beim Öffnen beginnt. Mit commit () oder rollback () wird die nächste Transaktion gestartet. Die letzte Transaktion wird durch close () beendet. 3. Jeder ObjectContainer verwaltet seine eigenen Referenzen zu gespeicherten Objekten. 4. com.db4o.ext.ExtObjectContainer 590 Speichern von Objekten Chauffeur Name :String Alter :int 591 Speichern von Objekten Chauffeur chauffeur = new Chauffeur ("Ballack", 29); db.store (chauffeur); 592 Finden von Objekten Chauffeur chauffeur = new Chauffeur (null, 29); List<Chauffeur> resultat = db.queryByExample (chauffeur); for (Object o : resultat) { System.out.println (o); } oder: List<Chauffeur> resultat = db.query (Chauffeur.class); List<Chauffeur> resultat = db.queryByExample ( new Chauffeur (null, 0)); List<Chauffeur> resultat = db.queryByExample ( new Chauffeur ("Kahn", 0)); 593 Aktualisierung von Objekten List<Chauffeur> resultat = db.queryByExample (new Chauffeur ("Ballack", 0)); Chauffeur gefunden = resultat.get (0); gefunden.setAlter (gefunden.getAlter () + 1); db.store (gefunden); // Aktualisierung! 594 Löschen von Objekten List<Chauffeur> resultat = db.queryByExample (new Chauffeur ("Ballack", 0)); Chauffeur gefunden = resultat.get (0); db.delete (gefunden); ------------------------------------------------------//List<Object> resultat = db.query (Object.class); List<Object> resultat = db.queryByExample (new Object ()); for (Object o : resultat) { db.delete (o); } 595 NQ – Native Anfragen List<Chauffeur> chauffeure = db.query (new Predicate<Chauffeur> () { public boolean match (Chauffeur chauffeur) { return chauffeur.getAlter () > 30; } }); 596 SODA Query API SODA ist die low-level Anfrage-API. // Finde alle Chauffeure jünger als 30 Jahre: Query query = db.query (); query.constrain (Chauffeur.class); query.descend ("alter") .constrain (new Integer (30)) .smaller (); List resultat = query.execute (); 597 Strukturierte Objekte Taxi Modell :String Nummer :String Chauffeur Name :String Alter :int 598 Speichern von Strukturen Chauffeur chauffeur = new Chauffeur ("Ballack", 31); db.store (chauffeur); // Chauffeur ist jetzt schon in der Datenbank. Taxi taxi = new Taxi ("BMW", "13", chauffeur); db.store (taxi); chauffeur = new Chauffeur ("Kahn", 39); taxi = new Taxi ("VW", "1", chauffeur); db.store (taxi); // Chauffeur ist hiermit auch in der Datenbank. db.store (new Taxi ("Mercedes", "32", new Chauffeur ("Gomez", 22))); 599 QBE-Anfrage Chauffeur prototypChauffeur = new Chauffeur ("Gomez", 0); Taxi prototypTaxi = new Taxi (null, null, prototypChauffeur); List<Taxi> resultat = db.queryByExample (prototypTaxi); 600 NQ-Anfrage List<Taxi> resultat = db.query ( new Predicate<Taxi> () { public boolean match (Taxi taxi) { return taxi.getChauffeur ().getName () .equals ("Gomez"); } }); 601 SODA-Anfrage Query query = db.query (); query.constrain (Taxi.class); query.descend ("aChauffeur") .descend ("name").constrain ("Gomez"); List resultat = query.execute (); 602 SODA-Anfrage interessant Query taxiQuery = db.query (); taxiQuery.constrain (Taxi.class); taxiQuery.descend ("modell").constrain ("BMW"); Query chauffeurQuery = taxiQuery.descend ("aChauffeur"); List resultat = chauffeurQuery.execute (); 603 Aktualisieren von Strukturen List<Taxi> resultat = db.queryByExample (new Taxi ("BMW", null, null)); Taxi taxi = resultat.get (0); List<Chauffeur> res = db.queryByExample (new Chauffeur ("Gomez", 0)); Chauffeur chauffeur = res.get (0); taxi.setChauffeur (chauffeur); db.store (taxi); // Taxi wird zurückgespeichert. 604 Aktualisieren von Strukturen List<Taxi> resultat = db.queryByExample (new Taxi ("BMW", null, null)); Taxi taxi = resultat.get (0); taxi.getChauffeur ().setName ("Strauss-Kahn"); db.store (taxi); // Taxi wird zurückgespeichert. 605 Felder und Collections Fahrt Beginn :Date Ende :Date Entfernung :double[*] * Taxi Chauffeur Modell :String Nummer :String erzeugeFahrt () Name :String Alter :int 606 Felder und Collections • Felder sind keine Objekte der Datenbank. • Collections sind eigene Objekte der Datenbank. 607 QBE-Anfrage Chauffeur prototypChauffeur = new Chauffeur ("Klose", 0); Fahrt prototypFahrt = new Fahrt (null, null, null, prototypChauffeur); List<Fahrt> resultat = db.queryByExample (prototypFahrt); 608 NQ-Anfrage List<Fahrt> resultat = db.query (new Predicate<Fahrt> () { public boolean match (Fahrt fahrt) { double v = fahrt.getEntfernung ()[0] / ((fahrt.getEnde ().getTime () - fahrt.getBeginn ().getTime ()) /1000/60/60); return v < 40.0 || v > 80.0; } }); 609 SODA-Anfrage Query fahrtQuery = db.query (); fahrtQuery.constrain (Fahrt.class); fahrtQuery.descend ("aChauffeur") .descend ("name") .constrain ("Klose"); List resultat = fahrtQuery.execute (); 610 Vererbung Fahrt Beginn :Date Ende :Date Entfernung :double[*] * Taxi Chauffeur Modell :String Nummer :String erzeugeFahrt () Name :String Alter :int LastTaxi Aufschlag :double erzeugeFahrt () 611 Vererbung • db.query (X.class) • public boolean match (X x) { } 612 Tiefe Graphen, Aktivierung ob0 ob1 ob2 ob3 ob4 ob9 ob8 ob7 ob6 ob5 ... 613 Tiefe Graphen, Aktivierung Taxi Modell :String Nummer :String anzFahrten :int erzeugeFahrt () Fahrt Beginn :Date Ende :Date Entfernung :double[*] nextFahrt :Fahrt Chauffeur Name :String Alter :int 614 Kaskadierte Aktivierung db.activate (objekt, tiefe); oder EmbeddedConfiguration conf = Db4oEmbedded.newConfiguration (); conf.common ().objectClass (Fahrt.class) .cascadeOnActivate (true); db = Db4oEmbedded.openFile (conf, "taxi.db4o"); 615 Transparente Aktivierung EmbeddedConfiguration conf = Db4oEmbedded.newConfiguration (); conf.common ().add (new TransparentActivationSupport ()); db = Db4oEmbedded.openFile (conf, "taxi.db4o"); 616 Transparente Aktivierung com.db4o.activation.ActivationPurpose READ WRITE <<interface>> com.db4o.ta.Activatable bind (:Activator) activate (:ActivationPurpose) Fahrt :Activator {transient} Beginn :Date Ende :Date Entfernung :double[*] 617 Chauffeur Name :String Alter :int Transparente Aktivierung public Typ getX () { activate (ActivationPurpose.READ); return x; } 618 Transparente Persistenz EmbeddedConfiguration conf = Db4oEmbedded.newConfiguration (); conf.common ().add (new TransparentPersistenceSupport ()); db = Db4oEmbedded.openFile (conf, "taxi.db4o"); 619 Transparente Persistenz public void setX (Typ x) { activate (ActivationPurpose.WRITE); this.x = x; } 620 Indexe db.close (); EmbeddedConfiguration conf = Db4oEmbedded.newConfiguration (); conf.common ().objectClass (Chauffeur.class) .objectField ("name") .indexed (true); db = Db4oEmbedded.openFile (conf, "taxi.db4o"); Wirkt sich drastisch bei QBE- und SODA-Anfragen aus, weniger bei NQ-Anfragen. 621 Transaktionen ObjectContainer db = Db4oEmbedded.openFile ( Db4oEmbedded.newConfiguration (), "Datei"); db.commit (); db.rollback (); db.ext ().refresh (objekt, Integer.MAX_VALUE); db.close (); Isolationsniveau: READ COMMITTED 622 Transaktionen Wie stehts mit Locks? 623 Embedded Server ObjectServer server = Db4oClientServer.openServer ( Db4oClientServer.newServerConfiguration (), "taxi.db4o", 0); try { ObjectContainer ct1 = server.openClient (); ObjectContainer ct2 = server.openClient (); // tu was mit den Containern bzw. Clients ct1.close (); ct2.close (); } finally { server.close (); } 624 Embedded Server container.ext ().refresh (objekt, tiefe); 625 Verteiltes System ObjectServer server = Db4oClientServer.openServer ( Db4oClientServer.newServerConfiguration (), "taxi.db4o", 0xdb40); // Port > try { server.grantAccess ("user1", "password1"); server.grantAccess ("user2", "password2"); ObjectContainer ct1 = Db4oClientServer.openClient ( "localhost", 0xdb40, "user1", "password1"); ObjectContainer ct2 = Db4oClientServer.openClient ( "localhost", 0xdb40, "user2", "password2"); // tu was mit den Containern bzw. Clients ct1.close (); ct2.close (); } finally { server.close (); } 626 public synchronized void runServer () { ObjectServer server = Db4oClientServer.openServer ( Db4oClientServer.newServerConfiguration (), "taxi.db4o", 0xdb40); try { server.grantAccess ("stopUser", "stopPassword"); server.grantAccess ("user1", "password1"); server.grantAccess ("user2", "password2"); server.ext ().configure ().clientServer ().setMessageRecipient (this); // this.processMessage erhält die Botschaften (insbesondere stop) Thread.currentThread ().setName (this.getClass ().getName ()); // um die Thread in einem Debugger zu identifizieren Thread.currentThread ().setPriority (Thread.MIN_PRIORITY); // server hat eigene Thread. Daher genügt hier ganz niedrige Prio. try { while (!isStop ()) { this.wait (); // Warte, bis du gestoppt wirst. } } catch (InterruptedException e) { e.printStackTrace (); } } finally { server.close (); } } 627 public Klasse StartServer StartServer (boolean stop) { setStop (stop); } private boolean stop; public boolean isStop () { return stop; } public void setStop (boolean stop) { this.stop = stop; } 628 Klasse StartServer public void processMessage (MessageContext mc, Object message) { if (message instanceof StopServer) { close (); } } public synchronized void close () { setStop (true); this.notify (); } public static void main (String[] arg) { new StartServer (false).runServer (); } 629 Server stoppen class StopServer {} ObjectContainer cont = null; try { cont = Db4oClientServer.openClient ( DB.HOST, DB.PORT, "stopUser", "stopPassword"); } catch (Exception e ) { e.printStackTrace (); } if (cont != null) { MessageSender sender = cont.ext ().configure ().clientServer () .getMessageSender (); sender.send (new StopServer ()); cont.close (); } 630 long Interne ID id = objectContainer.ext ().getID (ob); Object ob = objectContainer.ext ().getByID (id); objectContainer.ext ().activate (ob, tiefe); 631 Unique Universal ID (UUID) Configuration conf = Db4o.newConfiguration (); conf.generateUUIDs (ConfigScope.DISABLED); oder conf.generateUUIDs (ConfigScope.GLOBALLY); oder conf.generateUUIDs (ConfigScope.INDIVIDUALLY); conf.objectClass (Taxi.class).generateUUIDs (true); 632 Unique Universal ID (UUID) Db4oUUID uuid = objectContainer.ext () .getObjectInfo (ob).getUUID (); Object ob = objectContainer.ext ().getByUUID (uuid); objectContainer.ext ().activate (ob, tiefe); 633 Viele Objekte, Lazy Query conf.common ().queries ().evaluationMode ( QueryEvaluationMode.LAZY); 634 Defragmentierung com.db4o.defragment.Defragment.defrag ( Datenbankdateiname); 635 Maximale Datenbankgröße Blockgröße von 1 bis 127 entspricht maximaler DB-Größe von 2 bis 254 GB. conf.file ().blocksize (8); ergibt eine maximale DB-Größe von 16 GB. 636 NoSQL • no SQL, not only SQL, non-relational • Flexibles Datenmodell • Skalierung 637 Geschichte • Google (2006): BigTable reasearch • Amazon (2007): Dynamo research 638 Charakteristika • abertausend Benutzer • low latency • immer online • hohe Varianz der Daten • schnell adaptierbar an geänderte Anforderungen • Velocity, Variety, Volume, Complexity 639 Applikation Scale-up one growing server 640 Applikation Server 1 Scale-out Server 2 Server 3 641 Server ... RDB versus NoSQL • RDB: Schema notwendig Änderung des Schemas schwierig • NoSQL: ”schemalos” bzw. Änderung eines eventuellen Schemas leicht 642 NoSQL-Datenmodell-Typen Daten-Modell Key-Value-Store Document-Store Column-Family-Store Graph-Store Beispiel DB Riak MongoDB Cassandra Neo4J 643 Integrations-DB App1 Appx SQL SQL RDB SQL SQL App2 Appn 644 Applikations-DB SOApp1 SOApp2 App1 App2 Appx Appn {as service} {as service} {as service} {as service} DB1 DB2 DBx DBn 645