Datenbanksysteme sechste, uberarbeitete Auage Vorlesung gehalten im SS '95 Oliver Vornberger Fachbereich Mathematik/Informatik Universitat Osnabruck 1 Inhaltsverzeichnis 1 Einfuhrung 1.1 1.2 1.3 1.4 1.5 Erste Denition : : : : : : : : : : : : : : : : : : : : : : : : : Modellierungskonzept : : : : : : : : : : : : : : : : : : : : : Wozu Datenbanksysteme? : : : : : : : : : : : : : : : : : : : Losungsansatz : : : : : : : : : : : : : : : : : : : : : : : : : : Architektur eines DBMS (Data Base Management System) 2 Logische Datenorganisation 2.1 2.2 2.3 2.4 2.5 Das Entity/Relationshipmodell : : : Das Hierarchische Datenmodell : : : Das Netzwerk-Datenmodell : : : : : Das Relationale Datenmodell : : : : Das Objektorientierte Datenmodell : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Vorbemerkung : : : : : : : : : : : : : : : : : : : Grundidee : : : : : : : : : : : : : : : : : : : : : : DDL (Data Denition Language) der DBTG : : DML (Data Manipulation Language) der DBTG : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Heap-File Organisation : : : : : : : Hash-Organisation : : : : : : : : : Index-Organisation : : : : : : : : : B*-Baume : : : : : : : : : : : : : : Dense Index : : : : : : : : : : : : : Variabel lange records : : : : : : : Sekundar-Index : : : : : : : : : : : Partial Match Retrieval : : : : : : Multidimensionale Range-Queries : 2 ; d-trees (allgemein k ; d-trees) Gitterverfahren : : : : : : : : : : : Verwaltung geometrischer Objekte IMS-Begrie : : : : : : : : : : Datenbeschreibung in IMS : : Die externe Ebene von IMS : Datenmanipulation in IMS : Speicherorganisation fur IMS : : : : : 5 Das Netzwerk-Konzept 5.1 5.2 5.3 5.4 : : : : : : : : : : 4 Das Hierarchische Konzept 4.1 4.2 4.3 4.4 4.5 : : : : : : : : : : 3 Physikalische Datenorganisation 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 : : : : : 2 : : : : : : : : : : 5 5 5 6 7 8 12 12 15 17 19 22 23 24 24 28 32 35 36 36 38 39 40 43 51 54 54 56 60 62 67 69 69 69 70 73 6 Das Relationale Konzept 78 7 Funktionale Abhangigkeiten 98 6.1 Relationenalgebra : : : : : : : : : : : : : : : : : : : : : : : : : : : 78 6.2 Query by example : : : : : : : : : : : : : : : : : : : : : : : : : : 84 6.3 INFORMIX : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 86 7.1 Armstrong-Axiome : : : : : : : : : : : : : : : : : : : : : : : : : : 98 7.2 Normalformen : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 105 8 Das objektorientierte Konzept 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 Schwachen von relationalen Systemen Objektorientierte Programmierung : : Objekt-Identitat : : : : : : : : : : : : Objekt-Struktur : : : : : : : : : : : : Persistenz : : : : : : : : : : : : : : : : Objekt-Methoden : : : : : : : : : : : : Applikation : : : : : : : : : : : : : : : O2 SQL : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 9 Synchronisation paralleler Transaktionen 9.1 9.2 9.3 9.4 Transaktionen : : : : Serialisierbarkeit : : Zeitstempelverfahren Recovery : : : : : : : 10.1 10.2 10.3 10.4 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Organisatorische Manahmen Identitatskontrolle : : : : : : Zugriskontrolle : : : : : : : Kryptographische Methoden : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 10 Datenschutz : : : : : : : : : : : : 3 108 108 109 110 110 113 113 115 116 120 120 122 128 130 131 131 131 132 134 Literatur G. Schlageter, W. Stucky: C.J. Date: J. Ullmann: A. Heuer: R. Elmasri, S. Navathe: \Datenbanksysteme: Konzepte und Modelle", Teubner \An Introduction to Database Systems", Addison-Wesley \Principles of Database Systems", Computer Science Press \Objektorientierte Datenbanken", Addison-Wesley \Fundamentals of Database Systems", Addison-Wesley Danksagung Ich danke : : : : : : Frau Gerda Holmann fur sorgfaltiges Erfassen des Textes und Erstellen der Graken. : : : Herrn Frank M. Thiesing fur seine engagierte Mitarbeit bei der inhaltlichen und auerlichen Gestaltung des Textes. : : : der Studentin Sigrid Knust fur grundliches Korrekturlesen. Osnabruck, im Juli 1995 (Oliver Vornberger) 4 1 Einfuhrung 1.1 Erste Denition Ein Datenbanksystem ist ein computergestutztes System, das sich mit der Beschreibung vorhandener Daten, ihrer Speicherung und ihrer Manipulation befat. Die Daten sollen in irgendeiner Abstraktion einen Ausschnitt der Realwelt beschreiben (Modellbildung). 1.2 Modellierungskonzept Die Realwelt wird modelliert durch Entities und Relationships: entity: Gegenstand des Denkens und der Anschauung (z.B. eine konkrete Person, ein bestimmter Ort) relationship: Beziehung zwischen den entities (z.B. wohnt in) Entities werden charakterisiert durch eine Menge von Attributen, die gewisse Attributwerte annehmen konnen. Entities, die durch dieselbe Menge von Attributen charakterisiert sind, konnen zu einer Klasse, dem Entity-Typ zusammengefat werden. Entsprechend entstehen relationship-Typen. Beispiel: Entity-Typ Student habe die Attribute Mat-Nr., Name, Hauptfach Entity-Typ Ort habe die Attribute PLZ, Name Relationship-Typ wohnt setzt Student und Ort in Beziehung zueinander. Die graphische Darstellung erfolgt durch Entity-Relationship-Diagramme (E-RDiagramm): Entity-Typ Attribut Relationship-Typ HH H HH H 5 Beispiel: Matr.-Nr. Nachname Vorname Hauptfach @ ; @ @ @ ; ; @ PLZ Name @ @ ; ; HH wohnt H HH in H Student @ @ @ Ort Hinweis: Derselbe Sachverhalt konnte auch durch einen entity-Typ Student modelliert werden, der ein Attribut Ort hat. 1.3 Wozu Datenbanksysteme? Zur Speicherung der Daten bietet sich an, die entities durch Datensatze fester Lange (records) darzustellen und die relationships durch Anordnung der records auszudrucken. Beispiel: Es gibt eine Datei mit Personaldaten aller Mitarbeiter (sortiert nach Personen). Es gibt eine Datei mit Angaben zu allen Projekten (sortiert nach Projekten). Hinter jedem Projekt folgen die zugehorigen Mitarbeiter. Probleme entstehen, wenn unterschiedliche Anwendungen auf denselben Daten laufen sollen. Dies verlangt verschiedene Datenorganisationen fur dieselben Daten. Die Folge sind Redundanz Gefahr der Inkonsistenz Daten/Programmabhangigkeit Inexibilitat 6 1.4 Losungsansatz U bergang von Programm 1 Programm n .. . phys. Datei 1 phys. Datei n zu Programm 1 Programm n .. . logische Datei 1 H H '$ H Datenbank logische Datei Software &% Datenbank Ziel: Gewahrung von Sichten (jeder Benutzer sieht die Welt durch seine Brille) physikalische Datenunabhangigkeit (A nderung der phys. Datei verlangt nicht die A nderung des Anwenderprogramms) logische Datenunabhangigkeit (A nderung der Gesamtsicht verlangt nicht die A nderung der Einzelsicht) geringe Redundanz (Daten werden nur an einer Stelle gehalten) Vermeidung von Inkonsistenz (widerspruchliche Daten vermeiden) Gewahrung von Integritat (nur plausible Daten zulassen) Flexibilitat (neue Verknupfungen ermoglichen) Transaktionsverarbeitung (Kapselung zusammengehorender Aktionen) Koordination und Synchronisation bei Parallelbetrieb Sicherheit (Datenschutz vor unberechtigtem Zugri und vor Zerstorung) Persistenz (dauerhafte Speicherung von Programm-Datenstrukturen) Multiple User Interfaces (Query language, programming language, Masken) 7 1.5 Architektur eines DBMS (Data Base Management System) Die Beschreibung der Realwelt (z.B. bestehend aus den Daten eines Unternehmens) erfolgt in drei Ebenen: Konzeptuelles Modell Hier wird auf logischer Ebene, unabhangig vom Anwenderprogramm, die Gesamtheit der Daten beschrieben. Es werden die vorhandenen EntityTypen und Relationship-Typen deniert sowie die Attribute und deren Wertebereiche festgelegt. Die Formulierung erfolgt vom enterprise administrator mittels einer DDL (data denition language). Das Ergebnis ist das konzeptuelle Schema. Externes Modell Hier wird fur jede Benutzergruppe eine spezielle anwendungsbezogene Sicht der Daten (view) speziziert. Die Beschreibung erfolgt durch den application administrator mittels einer DDL, Umgang vom Benutzer mit einer DML (data manipulation language). Ergebnis ist das externe Schema. Internes Modell Hier wird festgelegt, in welcher Form die logisch beschriebenen Daten im Speicher abgelegt werden sollen. Geregelt werden record-Aufbau, AttributDarstellung, Dateiorganisation, Zugrispfade. Fur einen ezienten Entwurf werden statistische Informationen uber die Haugkeit der Zugrie benotigt. Die Formulierung erfolgt durch den database administrator. Ergebnis ist das interne Schema. Die Verbindungen zwischen den drei Ebenen werden durch die Transformationsregeln deniert. Sie legen fest, wie die Objekte der verschiedenen Ebenen aufeinander abgebildet werden. Z.B. legt der Anwendungsadministrator fest, wie Daten des externen Modells aus Daten des konzeptuellen Modells zusammengesetzt werden. Der Datenbank-Administrator legt fest, wie bestimmte Attribute bestimmter entities aus den abgespeicherten Daten zu erhalten sind. Beispiel Bundesbahn: Die Gesamtheit der Daten (d.h. Streckennetz mit Zugverbindungen) ist beschrieben im konzeptuellen Modell (Kursbuch). Ein externes Modell ist z.B. beschrieben im Heft Stadteverbindungen Osnabruck. Beispiel Personaldatei: Im konzeptuellen Modell wird der Entity-Typ Angestellter festgelegt mit den Attributen Pers.-Nr., Name, Geb.-Datum, Telefon, Wohnort. Das externe Modell Geburtstagsliste besteht aus den Komponenten Name, Datum, Alter, wobei das Datum aus Tag und Monat des Geb.-Datum besteht, 8 und Alter sich aus der Dierenz vom laufenden Jahr und Geburtsjahr berechnet. Im internen Modell wird festgelegt, da es eine Datei PERS gibt mit records vom Typ Angestellter, in der fur das Attribut Wohnort nicht der volle Name, sondern eine Kennzier gespeichert ist. Eine weitere Datei ORT enthalt Paare von Kennziern und Ortsnamen. (Diese Speicherorganisation spart Platz, wenn es nur wenige verschiedene Ortsnamen gibt. Sie verlangsamt allerdings den Zugri auf das Attribut Wohnort.) Bemerkung: Das konzeptuelle Schema soll sowohl die reale Welt unabhangig von DV-Gesichtspunkten beschreiben als auch die Grundlage fur das interne Modell bilden, welches naturlich stark maschinenabhangig ist. Um diesen Konikt zu losen, stellt man manchmal dem konzeptuellen Schema ein sogenanntes \logisches" Schema zur Seite, welches die Gesamtheit der Daten zwar hardwareunabhangig, aber doch unter Berucksichtigung von Implementationsgesichtspunkten beschreibt. Das logische Schema heit darum auch implementiertes konzeptuelles Schema. Es ubernimmt die Rolle des konzeptuellen Schemas, das nun nicht mehr Teil des eigentlichen Datenbanksystems ist, sondern etwas daneben steht und z.B. auch aufgestellt werden kann, wenn uberhaupt kein Datenbanksystem zum Einsatz kommt (siehe Bild). externes Schema '$ reale Welt &% konzeptuelles Schema logisches Schema internes Schema Datenbanksystem 9 Die Software des Datenbanksystems zergliedert sich in das Datenbankmanagementsystem (DBMS) File-Manager (FM) und bewirkt bei einer konkreten Anfrage (Query) etwa folgenden Ablauf (siehe Bild): /Ben./APn (10) / /Ben./APn n / n ; AA ; ; 1; A ;9 A ;; A ; ; EM/ES ; 2 ; ; (8) Trafo.DBMS H Regeln HH HH 6 @ H3 H @ HH Konzeptuelles Modell / @ Konzeptuelles Schema @ 5 7 @ @4 Trafo.@ Regeln @ @ @ ? /Ben./APn n / ::: Trafo.- Regeln EM/ES FM H HH 6 Internes Modell / Internes Schema HH H HH Speicher H DBMS FM ||! - Datenbankmanagementsystem File-Manager (Teil des Betriebssystems) Befehlsweitergabe Daten- und Kontrollubergabe Ausfuhrung einer Verarbeitung Architektur eines Datenbanksystems 10 1. Das DBMS empfangt die Query Wo wohnt Muller? 2. Das DBMS besorgt die benotigten Denitionen des entsprechenden EntityTyps aus dem externen Schema: z.B. Entity-Typ Angestellter mit Attribut Name und Wohnort. 3. Das DBMS besorgt die entsprechenden Teile des konzeptuellen Schemas (unter Ausnutzung der Transformationsregeln) und stellt fest, welche konzeptuellen Entities und Beziehungen benotigt werden. 4. Das DBMS besorgt die benotigten Teile des internen Schemas (unter Ausnutzung der Transformationsregeln) und stellt fest, welche physischen Satze zu lesen sind (z.B. aus der Datei PERS den Satz mit Name = Muller, aus der Datei Ort den Satz mit der bei Muller gefundenen Kennzier). 5. Das DBMS ubergibt dem Betriebssystem die Nummern der zu lesenden Speicherblocke. 6. Das Betriebssystem liest die angeforderten Blocke aus dem Speicher. 7. Das Betriebssystem ubergibt die verlangten Blocke dem DBMS in einem Systempuer. 8. Das DBMS stellt das externe entity zusammen (unter Berucksichtigung von Format und Anordnung deniert im externen Schema). 9. Das DBMS ubergibt das externe entity dem Anwenderprogramm in einem Kommunikationsbereich. 10. Das Anwenderprogramm verarbeitet die Daten. Die Punkte 4-7 mussen im allgemeinen mehrfach durchlaufen werden, da das DBMS oft erst aufgrund eines gelesenen Satzes entscheiden kann, welcher Satz als nachster zu lesen ist. Die Abbildung von externen entities auf konzeptuelle und weiter auf interne entities nennt man Binden. Statisches Binden liegt vor, wenn diese Abbildung zur U bersetzungszeit des Programms berechnet wird. Findet sie dagegen erst unmittelbar zum Zeitpunkt des Datenzugris statt, spricht man von dynamischem Binden. Bei statischem Binden mu das Anwendungsprogramm neu ubersetzt werden, wenn sich am konzeptuellen oder internen Modell etwas andert. Beim dynamischen Binden entstehen Kosten durch zusatzliche Tabellenzugriffe und Schemainterpretationen. Fur die weiter oben geforderte physikalische Datenunabhangigkeit akzeptiert man gewohnlich das statische Binden, da eine Neuubersetzung vertretbar ist. 11 2 Logische Datenorganisation 2.1 Das Entity/Relationshipmodell Schlusseleigenschaft Sei E ein Entity-Typ, sei A die Menge seiner Attribute. Jedes entity ist durch seine Attribut-Kombination eindeutig bestimmt, d.h. A ist identizierend fur E. B A heit Schlussel, falls B identizierend ist, und alle Teilmengen von B sind nicht identizierend. B ist identizierend () fur zwei entities e1 e2 gilt: e1 = e2 bzgl. B ) e1 = e2 (zu jedem Zeitpunkt). Achtung: Die Schlusseleigenschaft bezieht sich auf Attribut-Kombinationen, nicht nur auf die momentan vorhandenen Attributwerte! Ein Schlussel kann als Primarschlussel ausgezeichnet sein: er identiziert ein Objekt wahrend seiner ganzen Lebenszeit im System, sein Wert kann nicht geandert werden. Beispiel: Im Entity-Typ Person mit den Attributen Name, Vorname, Personenkennziffer, Geburtsdatum, Wohnort ist Personenkennziffer der Prim arschlussel. Die Kombination Name, Vorname, Geburtsdatum bildet ebenfalls einen (Sekundar-)Schlussel, sofern garantiert wird, da es nicht zwei Personen mit demselben Namen und demselben Geburtsdatum gibt. Komplexitat von Beziehungen Sind die Entity-Typen E1 E2 : : : Ek am Beziehungstyp f beteiligt, so gilt grad(f) = k: Zur naheren Klassizierung der Beziehung f gibt es drei Schreibweisen: die (min, max)-Notation Hierbei wird zu jedem an f beteiligten Entity-Typ E angegeben, in wievielen konkreten Beziehungen bzgl. f ein entity mindestens () und hochstens () vorkommt: kgrad(f E) = ( ) 2 INo 2 INo fg (Das Symbol bedeutet \beliebig viel".) 12 Beispiel: Student (0 ) HH H HH H h ort (3 ) Vorlesung Die (1 c m)-Notation Es handelt sich um die (min, max)-Notation mit = 0 oder 1 und = 1 oder . kgrad (f, E) (1, c, m)-Notation (1, 1) 1 (0, 1) c (choice) (1, ) m (multiple) (0, ) mc (multiple choice) HH mc m Student Vorlesung h ort H Beispiel: H HH Die (1, n)-Notation Nur anwendbar fur binare Beziehungen. Zwar ungenau, aber sehr verbreitet. Wir nennen f eine one-one, one-many, many-one, many-manyBeziehung, wenn folgender Sachverhalt vorliegt: 1:1 one | one 1:n one | many n:1 many | one n : m many | many Oftmals signalisiert man eine manyone-Beziehung zwischen E1 und E2 durch einen Pfeil von E1 nach E2 : H H H X X X XXX H XXX H XH X X E1 0 1 E1 0 E1 0 1 E1 0 E1 13 HH H f HH H HH H f HH H HH H f HH H HH H HH f H HH H f HH H 0 1 E2 0 1 E2 0 E2 0 E2 - E2 Weitere Klassizierungen fur Beziehungen Beziehung mit Attribut H H H wirkt mit H Angestellter % der Arbeitszeit HH Beziehung auf einem Entity-Typ Projekt Angestellter HHkenntHHH H \isa"-Beziehung (1 1) Abt.leiter H is HH HH a H (0 1) Angestellter Abt.leiter ist Subtyp von Angestellter und hat spezielle, zusatzliche Attribute. Die allgemeinen Attribute sind uber isa zu erreichen. Selber Primarschlussel. In diesem Fall wird ein Pfeil vom Subtyp zum Obertyp gezogen. Achtung: ggf. zusatzlich: Abt.leiter (0 ) H H H befehligt H (0 1) HH Angestellter hierarchische Beziehung E 0 ist E hierarchisch untergeordnet, wenn es zu jedem e0 2 E 0 genau ein e 2 E gibt. Abteilung (0 ) HH H enthalt H HH 14 (1 1) Angestellter In Abhangigkeit von der zu verwendenden Speicherorganisation wahlt man zur computergerechten Darstellung des Entity-Relationship-Modells eines der folgenden drei Datenmodelle: 2.2 Das Hierarchische Datenmodell Eine Hierarchie X besteht aus einem Entity-Typ Xo , dem beliebig viele EntityTypen Xi unmittelbar untergeordnet sind jedem Entity-Typ Xi konnen wiederum Entity-Typen Xij untergeordnet sein usw. Alle Entity-Typen sind verschieden. Beispiel: Bundesliga Spieler Ort Name Gebdatum Ortsname ; ; ; ; ; @ @ @ @ @ Adresse Position Mannschaft PLZ Ort Posbez Posnr Vereinsname Saison Entity-Typen heien Segmente, Attribute heien Felder. Name Jahr Gehalt 15 Grundsatzlich sind einer Vater-Auspragung (z.B. \Beckenbauer") fur jeden ihrer Sohn-Typen jeweils mehrere Sohnauspragungen zugeordnet (z.B. konnte der Sohn-Typ Adresse 2 konkrete Adressen enthalten. Dadurch entsprechen dem Baum auf Typ-Ebene mehrere Baume auf Entity-Ebene. Diese entities sind in preorder-Reihenfolge zu erreichen, d.h. vom Vater zunachst seine Sohne und dann dessen Bruder. Dieser Baumdurchlauf ist die einzige Operation auf einer Hierarchie jedes Datum kann daher nur uber den Einstiegspunkt Wurzel erreicht werden. Beispiel-Query: \Welche Spieler waren 1975 bei Bayern Munchen unter Vertrag?" 1.) Einstieg im Baum mit Wurzel Ort 2.) suche ersten Ort 3.) suche unter seinen Sohnen den Verein \Bayern Munchen" 4.) falls gefunden: durchlaufe dessen Sohne und gib sie aus, sofern Jahr = 1975 falls nicht gefunden: suche nachsten Ort, gehe nach 3). 16 2.3 Das Netzwerk-Datenmodell Im Netzwerk-Datenmodell konnen nur binare many-one- (bzw. one-many)-Beziehungen dargestellt werden. Entity-Typen heien logische record-Typen. Entities heien logische records, sie haben logisches record-Format und bestehen aus Feldern. Die Beziehungen heien links. Ein E-R-Diagramm mit den genannten Bezeichnungen und Einschrankungen heit Netzwerk. Im Netzwerk werden die links als gerichtete Kanten gezeichnet von Kastchen fur member zum Kastchen fur owner (funktionale Abhangigkeit). In einer Auspragung fuhrt ein gerichteter \Ring" vom owner uber alle seine member. Beispiel: Verlag Auspragung: Netzwerk: Durch die Wuste ? ? Buch - Autor Winnetou ? member Karl May 6 Der Schut owner Selber Atmen ? ? Topfern in der Toscana 17 Willi Wachtel 6 Bei nicht binaren Beziehungen oder nicht many-one-Beziehungen hilft man sich durch Einfuhrung eines kunstlichen logischen Record-Typs. Beipiel: Bundesliga Spieler SP - Position Beckenbauer 6 Muller 6 owner ? ? ? ? ? ? 6 Verteidiger 6 member owner Typische Operationen auf Netzwerken: Selektion: suche unter den logischen Records eines Typs gewisse heraus. Projektion: ltere eine oder mehrere Felder heraus. Navigation: nde mit Hilfe der links das nachste member eines owner oder nde den owner des momentanen member. Beispiel-Query: \Wo wohnen die Verteidiger?" nde im Record-Typ Position ein record mit Posbez = \ Verteidiger". durchlaufe alle seine member. fur jeden member nde dessen owner im record-Typ Spieler. gib bei jedem dieser owner das Feld Adr aus. 18 Sturmer 2.4 Das Relationale Datenmodell Seien D1 D2 : : : Dk Wertebereiche. R D1 D2 : : : Dk heit Relation. Wir stellen uns eine Relation als Tabelle vor, in der jede Zeile einem Tupel entspricht und jede Spalte einem bestimmten Wertebereich. Die Folge der Spaltenidentizierungen heit Relationenschema. Beispiel: Dinge (Bezeichnung, Ball Brikett Hut , Form Kugel Quader Zylinder ) Relationenschema 9 > = ) Relation > Tupel Farbe rot schwarz schwarz Eine Menge von Relationenschemata heit relationales Datenbankschema, die aktuellen Werte der einzelnen Relationen ergeben eine Auspragung der relationalen Datenbank. pro Entity-Typ gibt es ein Relationenschema mit Spalten benannt nach den Attributen pro Relationship-Typ gibt es ein Relationenschema mit Spalten fur die Schlussel der beteiligten Entity-Typen und ggf. weitere Spalten. % Angestellter H H arbeitet H HH mit H | {z } 6 Projekt 6 6 % Schlussel fur Projekt Schlussel fur Angest. 19 Typische Operationen auf relationaler Datenbank: Selektion: suche alle Tupel einer Relation mit gewissen Attributeigenschaften ? Projektion: ltere gewisse Spalten heraus ? Verbund: nde Tupel in mehreren Relationen, die bzgl. gewisser Spalten ubereinstimmen. 20 B A A B ? A A B B Beispiel: Bundesliga (Schlussel sind unterstrichen) : Spieler Name Leifeld : Mannschaft Adr Dortmund Ort Bochum Bochum Verein VFL Bochum Wattenscheid 09 spielt Name Leifeld Posnr 1 Saison Name Leifeld Verein VFL Bo : Position Posnr 1 mmm Gebdatum 1.1.65 Jahr 90/91 @ Spieler ; m m H @ ; HH Position HHspielt H SaisonHHH HHH Gehalt 250.000 Mannschaft ; ; m Posbez Torwart @ @ m Projektionsquery: \In welchen Stadten wohnen Spieler?" Wahle aus Spieler die Spalte Adr Selektionsquery: \Wer wohnt in Dortmund?" Wahle aus Spieler solche Tupel mit Adr = Dortmund Verbund-Query: \In welchen Stadten war Leifeld beschaftigt?" Wahle aus Mannschaft die Spalte Ort von solchen Tupeln, wo Spalte Verein = Spalte Verein von Saison und wo Spalte Name von Saison = Leifeld Charakteristika fur das relationale Modell: Suchalgorithmus braucht nicht angegeben zu werden, alle Relationen und Attribute sind gleichberechtigt, System ist benutzerfreundlich, evtl. inezient. 21 2.5 Das Objektorientierte Datenmodell Eine Klasse reprasentiert einen Entity-Typ zusammen mit darauf erlaubten Manipulationen, genannt Methoden. Attribute mussen nicht atomar sein, sondern bestehen ggf. aus Tupeln, Listen und Mengen. Die Struktur einer Klasse kann an eine Unterklasse vererbt werden. Binare Beziehungen konnen durch mengenwertige Attribute modelliert werden. class Person type tuple (name: String, geb_datum: Date, kinder: list(Person)) end class Student inherit Person type tuple (mat_nr: Integer, hoert: set (Vorlesung)) method add_vorlesung (v: Vorlesung) end class Vorlesung type tuple (titel: String, gehoert_von: set (Student)) method add_student (s: Student) end 22 3 Physikalische Datenorganisation Die grundsatzliche Aufgabe bei der Realisierung eines internen Modells besteht aus dem Abspeichern von Records in einem File. Jedes Record hat ein festes Record-Format und besteht aus mehreren Feldern fester Lange mit zugeordnetem Datentyp. Folgende Operationen sind erforderlich: INSERT: Einfugen eines Records DELETE: Loschen eines Records MODIFY: Modizieren eines Records LOOKUP: Suchen eines Records mit bestimmtem Wert in bestimmten Feldern. Files werden abgelegt im Hintergrundspeicher (Magnetplatte), die aus Blocken fester Groe (etwa 29 - 212 Bytes) bestehen, die direkt adressierbar sind. Ein File ist verteilt uber mehrere Blocke, ein Block enthalt mehrere Records. Einige Bytes des Blockes sind unbenutzt, einige werden fur den header gebraucht, der Blockinformationen (Verkettung, Record-Interpretation) enthalt. Die Adresse eines Records besteht aus der Blockadresse und einem Oset (Anzahl der Bytes vom Blockanfang bis zum Record). Der Pointer (Zeiger) zu einem Record besteht entweder aus der Record-Adresse oder der Blockadresse, sofern genug Information bekannt ist, um das Record im Block zu identizieren. Blockzeiger erlauben das Verschieben der Records im Block (\unpinned records"), RecordZeiger setzen xierte Records voraus (\pinned records"), da durch Verschieben eines Records Verweise von auerhalb miinterpretiert wurden (\dangling pointers"). Das Lesen und Beschreiben von Records kann nur im Hauptspeicher geschehen. Die Blockladezeit ist gewohnlich groer als die Zeit, die zum Durchsuchen des Blockes nach bestimmten Records gebraucht wird. Daher ist fur Komplexitatsabschatzungen nur die Anzahl der Blockzugrie relevant. Zur Umsetzung des Entity-Relationship-Modells verwenden wir Records fur Entities Records fur Relationships (pro konkrete Beziehung ein Record, bestehend aus Pointer-Tupeln) 23 3.1 Heap-File Organisation Die einfachste Methode zur Abspeicherung eines Files besteht darin, alle Records hintereinander zu schreiben (ohne Blockgrenzen zu uberlappen). Operationen: INSERT: Record am Ende einfugen (ggf. \Locher" nutzen) DELETE: Losch-Bit setzen MODIFY: Record uberschreiben LOOKUP: Gesamtes File durchsuchen Bei groen Files ist der lineare Aufwand fur LOOKUP nicht mehr vertretbar. Gesucht ist daher eine Organisationsform, die ezientes LOOKUP erlaubt die restlichen Operationen nicht inezient macht wenig zusatzlichen Platz braucht. 3.2 Hash-Organisation Die grundlegende Idee bei Hash-Verfahren ist es, die Records des Files auf mehrere Buckets aufzuteilen, die jeweils aus einem oder mehreren Blocken bestehen. Es gibt eine Hash-Funktion h, die einen Schlussel als Argument erhalt und ihn auf die Bucket-Nummer abbildet, unter der der Block gespeichert ist, welcher das Record mit diesem Schlussel enthalt. Sei B die Anzahl der Buckets, sei V die Menge der moglichen Record-Schlussel, dann gilt gewohnlich jV j jB j. Beispiel fur eine Hash-Funktion: Fasse den Schlussel v als k Gruppen von jeweils n Bits auf. Sei di die i-te Gruppe als naturliche Zahl interpretiert. Setze k X h(v) = ( i=1 di )mod B 24 Im Bucket-Directory ndet sich als h(v)-ter Eintrag der Verweis auf den Anfang einer Liste von Blocken, unter denen das Record mit Schlussel v zu nden ist. 0 1 B ;1 bucket directory - - 6 ? b1 b2 b3 ? b4 ? b5 b6 Falls B klein ist, kann sich das Bucket-Directory im Hauptspeicher benden andernfalls ist es uber mehrere Blocke im Hintergrundspeicher verteilt, von denen zunachst der \zustandige" Block geladen werden mu. Jeder Block enthalt neben dem Zeiger auf den Folgeblock noch jeweils 2 Bits pro Subblock (Platz fur ein Record), die angeben, ob dieser Subblock leer (also beschreibbar), gefullt (also lesbar) oder geloscht (also nicht zum Lesen geeignet) ist. Geloschte Records werden wegen der Gefahr hangender Zeiger bis zum generellen \Aufraumen" nicht wieder verwendet. 25 Gegeben sei ein Schlussel v: LOOKUP: Berechne h(v) = i. Lies den fur i zustandigen Directory-Block ein, und beginne bei der fur i vermerkten Startadresse mit dem Durchsuchen aller Blocke. MODIFY: Falls Schlussel beteiligt: Loschen und Neueintragen. Falls Schlussel nicht beteiligt: LOOKUP und U berschreiben. INSERT: LOOKUP. Falls Satz mit v vorhanden: Fehler. Sonst: Freien Platz im Block uberschreiben und ggf. neuen Block anfordern. DELETE: LOOKUP. Bei Record Loschbit setzen. Der Aufwand aller Operationen hangt davon ab, wie gleichmaig die HashFunktion auf die Buckets verteilt und wie viele Blocke im Mittel ein Bucket enthalt. Im gunstigsten Fall ist nur ein Directory-Zugri und ein Datenblock-Zugri erforderlich und ggf. ein Blockzugri beim Zuruckschreiben. Im ungunstigsten Fall sind alle Records in dasselbe Bucket \gehasht" worden und daher mussen ggf. alle Blocke durchlaufen werden. Bei Hashtabellen, deren Eintrage komplett im Hauptspeicher liegen, gibt es (statt dynamisch wachsender Blocklisten) fur jeden Hash-Wert i einen reservierten Speicherplatz fester Groe. Gilt h(v) = i und i ist bereits gefullt, so wird nach einer Kollisionsstrategie nach einem Ausweichplatz gesucht. Beim linearen Sondieren testet man die Platze i+1 i+2 i+3 : : : beim quadratischen Sondieren testet man die Platze i + 1 i + 4 i + 9 : : : beim Double Hashing wird mit einer 2. Hashfunktion die Sondierschrittweite bestimmt. Sei Lastfaktor := Tabelleninhalt Tabellengroe . Bei linearem Sondieren dauert die erfolglose Suche 12 ((1 + 1;1 )2), ergibt 5 fur = 23 die erfolgreiche Suche 12 (1 + ( 1;1 )), ergibt 2 fur = 23 . Bei Double Hashing dauert die erfolglose Suche 1;1 , ergibt 5 fur = 45 die erfolgreiche Suche ;ln(1 ;) , ergibt 2 fur = 45 Beispiel: Gegeben die Hash-Funktion h, die einen Schlussel v abbildet auf die Lange von v mod 5. Gegeben folgendes File (pro Block zwei Records mit Angaben zum Dinosaurier und im Header zwei Bits zum Frei/Belegt-Status der Subblocks, ubernommen aus Ullmann, Kapitel 2): 26 voll/leer-Information ein Datensatz @ @ z}|{z }| {z JurasAllo11 Diplodlake herb. 90 15 sic ocus saurus 0 XX z X 1 2 11 Pterodactyl 3 ? 4 10 Triceratops bucket directory 11 Plateosaurus ? Stego0 saurus Leerraum ein Datensatz @ @ }| {z}|{ Juras- land carn. 35 5 sic Juras- land herb. 20 2 sic Cretaceous air carn. 1 Cretaceous land herb. 25 10 Triassic Juras- lake herb. 70 25 land herb. 30 5 Brontosic saurus Juras11 Brachiosaurus sic Juraslake herb. 80 50 Compsognathus sic land carn. 2 Cret10 Tyrannosaurus aceous land carn 50 8 0 Es werde nun \Elasmosaurus" (Hashwert = 2) eingefugt. Hierzu mu ein neuer Block fur Bucket 2 angehangt werden. Dann werde \Brontosaurus" umgetauft in \Apatosaurus". Da diese A nderung den Schlussel beruhrt, mu das Record geloscht und modiziert neu eingetragen werden. Das File hat dann folgende Struktur: 0 XX z X 11 Diplodocus 1 2 11 Pterodactyl 3 ? 4 11 Triceratops bucket directory 10 Plateosaurus ? ? Jurassic Allolake herb. 90 15 saurus Juras- land carn. 35 5 sic Cretaceous air carn. 1 Stego0 saurus Juras- land herb. 20 2 sic Cretaceous land herb. 25 10 Apatosaurus Juras- lake herb. 70 25 sic Triassic land herb. 30 5 Cret10 Elasmosaurus aceous sea carn. 40 5 Juras11 Brachiosaurus sic Juraslake herb. 80 50 Compsognathus sic land carn. 2 Cret10 Tyrannosaurus aceous land carn. 50 8 0 Vorteil Hashorganisation: sehr schnell, gute Speicherausnutzung. Nachteil Hashorganisation: keine Sortierung generierbar, keine Bereichsabfragen moglich, nur eingeschrankte Dynamik, d.h. ggf. aufwendige Umorganisation erforderlich bei U ber/Unterlauf. 27 3.3 Index-Organisation Wir setzen nun voraus, da sich die Schlussel der zu verwaltenden Records als Zeichenketten interpretieren lassen und damit eine lexikographische Ordnung auf der Menge der Schlussel impliziert wird: Fur zwei Strings x = x1 x2 : : : xk und y = y1 y2 : : : ym gilt: x < y : , (k < m und x1 : : :xk = y1 : : :yk ) oder (9i min(k m) : (x1 : : :xi;1 = y1 : : :yi;1 und xi < yi ) Sind mehrere Felder am Schlussel beteiligt, so wird zum Vergleich deren Konkatenation herangezogen. Neben der Haupt-Datei (main le), die alle Datensatze in lexikographischer Reihenfolge enthalt, gibt es nun eine Index-Datei (sparse index) mit Verweisen in die Hauptdatei. Die Eintrage der Index-Datei sind Tupel, bestehend aus Schlusseln und Blockadressen, sortiert nach Schlusseln. Liegt < v a > in der Index-Datei, so sind alle Record-Schlussel im Block, auf den a zeigt, groer oder gleich v. Zur Anschauung: Fassen wir ein Telefonbuch als Hauptdatei auf (eine Seite ein Block), so bilden die Namen \links oben" aller Seiten einen Index. Wir nehmen an, die Records seien verschiebbar und pro Block sei im Header vermerkt, welche Subblocks belegt sind. Dann ergeben sich die folgenden Operationen: LOOKUP: Gesucht wird ein Record mit Schlussel v1 . Suche (mit binary search) in der Index-Datei den letzten Block mit erstem Eintrag v2 v1 . Suche in diesem Block das letzte Paar (v3 a) mit v3 v1 . Lies Block mit Adresse a und durchsuche ihn nach Schlussel v1 . MODIFY: Zunachst LOOKUP. Ist der Schlussel an der A nderung beteiligt, so wird MODIFY wie ein DELETE mit anschlieendem INSERT behandelt. Andernfalls kann das Record uberschrieben und dann der Block zuruckgeschrieben werden. INSERT: Eingefugt wird ein Record mit Schlussel v. Suche zunachst mit LOOKUP den Block Bi , auf dem v zu nden sein mute (falls v kleinster Schlussel, setze i =1). Falls Bi nicht vollstandig gefullt: Fuge Record in Bi an passender Stelle ein, und verschiebe ggf. Records um eine Position nach rechts (Full/Empty-Bits korrigieren). Wenn v kleiner als alle bisherigen Schlussel, so korrigiere Index-Datei. Wenn Bi ufe, ob Bi+1 Platz hat. Wenn ja: Schiebe uberlaufendes gefullt: Uberpr Record nach Bi+1 und korrigiere Index. Wenn nein: Fordere neuen Block Bi0 an, speichere das Record dort, und fuge im Index einen Verweis ein. DELETE: analog zu INSERT 28 Beispiel: Gegeben eine Hauptdatei mit Blocken, die jeweils 2 Records speichern. Die Blocke der Index-Datei enthalten jeweils vier Schlussel/Adre-Paare. Weiterhin gibt es im Hauptspeicher eine Tabelle mit Verweisen zu den Index-DateiBlocken. voll/leer-Bits z }| { - 11 Allosaurus Brachiosaurus - 11 Brontosaurus Compsognathus - 11 Diplodocus Plateosaurus - 11 Pterodactyl Stegosaurus - 11 Triceratops Tyrannosaurus voll/leer-Bits z }| { - 1111 Allosaurus - 1000 Triceratops Brontosaurus Diplodocus g Tabelle zum Einstieg in den Index 29 Pterodactyl Leerraum z }| { Nun wird \Elasmosaurus" eingefugt. Hierzu ndet man zunachst als Einstieg \Diplodocus". Der zugehorige Dateiblock ist voll, so da nach Einfugen von \Elasmosaurus" fur das uberschussige Record \Plateosaurus" ein neuer Block angelegt und sein erster Schlussel in die Index-Datei eingetragen wird. - 11 Allosaurus Brachiosaurus - 11 Brontosaurus Compsognathus - 11 Diplodocus Elasmosaurus - 10 Plateosaurus - 11 Pterodactyl Stegosaurus - 11 Triceratops Tyrannosaurus - 1111 Allosaurus Brontosaurus - 1100 Pterodactyl Triceratops 30 Diplodocus Plateosaurus Nun wird \Brontosaurus" umbenannt in \Apatosaurus". Hierzu wird zunachst \Brontosaurus" geloscht, sein Dateinachfolger \Compsognathus" um einen Platz vorgezogen und der Schlussel in der Index-Datei, der zu diesem Blockzeiger gehort, modiziert. Das Einfugen von \Apatosaurus" bewirkt einen U berlauf von \Brachiosaurus" in den Nachfolgeblock, in dem \Compsognathus" nun wieder an seinen alten Platz rutscht. Im zugehorigen Index-Block verschwindet daher sein Schlussel wieder und wird uberschrieben mit \Brachiosaurus". - 11 Allosaurus Apatosaurus - 11 Brachiosaurus Compsognathus - 11 Diplodocus Elasmosaurus - 10 Plateosaurus - 11 Pterodactyl Stegosaurus - 11 Triceratops Tyrannosaurus - 1111 Allosaurus Brachiosaurus - 1100 Pterodactyl Triceratops Diplodocus Plateosaurus Bemerkung: Ist die Verteilung der Schlussel bekannt, so sinkt die Suchzeit durch Interpolation Search auf log log n Schritte! 31 3.4 B*-Baume Betrachten wir das Index-File als Daten-File, so konnen wir dazu ebenfalls einen weiteren Index konstruieren und fur dieses File wiederum einen Index usw. Diese Idee fuhrt zum B*-Baum. Ein Baum T heit B*-Baum mit Parameter k , 1. Jeder Weg von der Wurzel zu einem Blatt hat dieselbe Lange. 2. Jeder Knoten auer der Wurzel und den Blattern hat mindestens k Nachfolger. Die Wurzel hat keinen oder mind. 2 Nachfolger. 3. Jeder Knoten hat hochstens 2 k Nachfolger. Der Baum T bendet sich im Hintergrundspeicher, und zwar nimmt jeder Knoten einen Block ein. Ein Knoten mit j Nachfolgern speichert j Paare von Schlusseln und Adressen (s1 a1 ) : : : (sj aj ). Es gilt s1 s2 : : : sj . Eine Adresse in einem Blattknoten bezeichnet den Block mit Informationen zum zugehorigen Schlussel, sonst bezeichnet sie den Block zu einem Baumknoten: Enthalte der Block fur Knoten p die Eintrage (s1 a1) : : : (sj aj ). Dann ist der erste Schlussel im i-ten Sohn von p gleich si , alle weiteren (sofern vorhanden) Schlussel in diesem Sohn sind groer als si und kleiner als si+1 . Operationen auf B*-Baumen Wir betrachten nur die Operationen auf den Knoten des Baumes und nicht auf den eigentlichen Datenblocken. Gegeben sei der Schlussel s. LOOKUP: Beginnend bei der Wurzel steigt man den Baum hinab in Richtung des Blattes, der den Schlussel s enthalten mute. Hierzu wird bei einem Knoten mit Schlusseln s1 s2 : : : sj als nachstes der i-te Sohn besucht, wenn gilt si s < si+1 . MODIFY: Wenn das Schlusselfeld verandert wird, mu ein DELETE mit nachfolgendem INSERT erfolgen. Wenn das Schlusselfeld nicht verandert wird, kann der Datensatz nach einem LOOKUP uberschrieben werden. INSERT: Nach LOOKUP sei Blatt B gefunden, welches den Schlussel s enthalten soll. Wenn B weniger als 2k Eintrage hat, so wird s eingefugt, und (sofern s kleinster Schlussel im Baum) es werden die Vorgangerknoten berichtigt. Wenn B 2k Eintrage hat, wird ein neues Blatt B 0 generiert, mit den groeren k Eintragen von B gefullt und dann der Schlussel s eingetragen. Der Vorganger von B und B 0 wird um einen weiteren Schlussel s0 (kleinster Eintrag in B 0 ) erweitert. Falls dabei U berlauf eintritt, panzt sich dieser nach oben fort. Beispiel fur B-Baum mit Parameter k = 2, es werden nacheinander die Schlussel wie folgt eingefugt: 3,7,1,16,4,14,12,6,2,15,13,8,10,5,11,9 "" 1.2. "" " " " 3.4. 5. 6. 7. " 8. 32 1.) 1 3 7 16 Schnappschu gezeichnet: 1 2.) 7 H H 1 3 4 1 3.) 7 H H 1 3 4 6 1 1 2 3 4 4 6 1 5.) 1 2 3 HH j 7 12 14 16 ; ) ; 4.) HH j 7 16 4 4 6 7 @ R @ 7 12 14 16 7 14 @ HHH j H ? R @ 7 12 14 15 16 1 4 7 14 H ; HH j H ) ; ? 6.) 1 2 3 4 6 7 8 12 13 1 7.) 1 PP q P 7 ? 1 2 3 7 PP P 4 4 6 7 8 10 1 8.) 1 1 2 3 ) 4 ; ; 4 5 6 14 15 16 7 8 9 33 12 ; ; 14 12 13 @ R @ 14 15 16 7 P PP PP q P 7 10 ) 10 11 12 ; ; 12 13 14 ? 14 15 16 DELETE: Nach LOOKUP sei Blatt B gefunden, welches den Schlussel s enthalt. Das Paar (s a) wird entfernt und ggf. der Schlusseleintrag der Vorganger korrigiert. Falls B jetzt k ; 1 Eintrage hat, wird der unmittelbare Bruder B 0 mit den meisten Eintragen bestimmt. (Haben beide Bruder gleich viel Eintrage, so wird der linke genommen.) Hat B 0 mehr als k Eintrage, so werden die Eintrage von B und B 0 auf diese beiden Knoten gleichmaig verteilt. (Haben B und B 0 zusammen eine ungerade Anzahl, so erhalt der linke einen Eintrag mehr.) Hat B 0 genau k Eintrage, so werden B und B 0 verschmolzen. Die Vorgangerknoten mussen korrigiert werden. Der Parameter k ergibt sich aus der Blockgroe und dem Platzbedarf fur die Schlussel/Adrepaare. Die Hohe des Baumes ergibt sich aus der benotigten Anzahl von Verzweigungen, um in den Blattern genugend Zeiger auf die Datenblocke zu haben. Beispiel 300.000 Datenrecords !a 100 Bytes 1.024 Bytes pro Block 15 Bytes fur Schlussel 4 Bytes fur Adresse ) b151024 + 4c = 53 ) k = 26 Die Wurzel sei im Mittel zu 50 % gefullt (hat also 26 Sohne), ein innerer Knoten sei im Mittel zu 75 % gefullt (hat also 39 Sohne), ein Datenblock sei im Mittel zu 75 % gefullt (enthalt also 7 bis 8 Datenrecords). 300.000 Records sind auf b 3007:5000 c = 40:000 Datenblocken verteilt. Hohe Anzahl Blatter Anzahl Zeiger 0 1 26 1 26 26 39 = 1.014 2 26 39 26 39 39 = 39.546 Damit reicht die Hohe 2 aus, um genugend Zeiger auf die Datenblocke bereitzustellen. Der Platzbedarf betragt 1 + 26 + 26 39 + 39546 40:000 Blocke die Zugriszeit 4. Zum Vergleich: Das Heaple benotigt 30.000 Blocke. Soll fur oenes Hashing eine mittlere Zugriszeit von 4 Blockzugrien gelten, so mussen in jedem Bucket etwa 5 Blocke sein (1 Zugri fur Hash-Directory, 3 Zugrie im Mittel fur eine Liste von 5 Blocken). Von diesen 5 Blocken sind 4 voll, der letzte halbvoll. Somit benden sich in einem Bucket etwa 4 5 10 = 45 Records. Also sind 30045:000 = 6:666 Buckets erforderlich. Da 256 Adressen in einen Block passen, werden b 666 256 c = 26 Directory-Blocke benotigt. Der Platzbedarf betragt daher 26 + 5 6666 = 33356. Vorteil B*-Baum: dynamisch, schnell, Sortierung generierbar (ggf. Blatter verzeigern). Nachteil: komplizierte Operationen, Speicheroverhead. 34 3.5 Dense Index Sparse Index verlangt, da main le sortiert ist, da nicht alle Eintrage im Index stehen. May Meier ; ; ; Muller ; ; ; May ; Muller ; Dense Index ist eine Datei mit Paaren (s a) fur alle Schlussel, sortiert nach Schlusseln. Idee: Suche im Index, greife dann auf Hauptdatei zu. Vorteil: main le kann kompakter gehalten werden (dadurch wird zusatzlicher Platz kompensiert) Lucken nutzen, dangling pointers uber Index abfangen! D.h. main le ist jetzt unpinned! Index nicht! Schlusselfeld kann im main le fehlen, falls neben Blockadresse auch oset vermerkt wird. Nachteil: 1 Blockzugri mehr als notig (vom gefundenen Schlussel ins Mainle) Beispiel fur B*-Baum mit Dense Index 300.000 Records mit je 100 Bytes, davon 15 Bytes fur den Schlussel. Im Mainle werden die Datensatze ohne Schlussel abgelegt, d.h. b1001024 ;15c = 12 Records pro Block. Also werden 300b12:000 ocke benotigt. c = 25:000 Datenbl Im Dense Index belegt jedes Tripel der Form <Schlussel, Blockadresse, Offset> jeweils 15 + 4 + 1 = 20 Bytes. Also passen 1024 b20c = 50 Tripel auf einen :000 Index-Block. Sind die Index-Blocke zu 75 % gefullt, sind 300 b375c = 8:000 Verweise von den Blattern des B*-Baums in den Dense-Index erforderlich. Der Platzbedarf betragt daher etwa im B*-Baum 1 + 32 + 1536 = 1569 Blocke im Dense Index 8000 Blocke im Main-File 25000 Blocke 35000 Blocke 35 3.6 Variabel lange records geeignet fur one-many relationships, z.B. record-Format sei name, vorname, (studienfach), Problem bei Decodieren im Block. 1. reserviere Platz fur maximale Anzahl und merke aktuelle Anzahl 2. verwende Zeiger zu records mit je 1 Fach 3. reserviere Platz fur mittlere Zahl und U berlauf-Zeiger. 3.7 Sekundar-Index Die bisher behandelten Organisationsformen sind geeignet zur Suche nach einem Record, dessen Schlussel gegeben ist. Um auch ezient Nicht-Schlussel-Felder zu behandeln, wird fur jedes Attribut, das unterstutzt werden soll, ein sogenannter secondary index (Sekundar-Index) angelegt. Er besteht aus einem Index-File mit Eintragen der Form <Attributwert, Adresse> und erlaubt es, bei gegebenem Attributintervall, die dazu passenden Records zu nden. Beispiel: Im Dinosaurier-File ist ein secondary index angelegt fur das Attribut GEWICHT, welches, gespeichert in der letzten Record-Komponente von 5 bis 50 variiert. Der Sekundarindex (er wird erreicht uber einen Index mit den Eintragen 0 und 15) besteht aus den Blocken <0, 2, 5, 8, 10> und <15, 25, 50>. Die beim Gewicht g gespeicherte Adresse fuhrt zunachst zu einem Vermerk zur Anzahl der Eintrage mit dem Gewicht g und dann zu den Adressen der Records mit Gewicht g. 36 Allosaurus Jurassic land carn. 35 5 Brachiosaurus Jurassic lake herb. 80 50 - Brontosaurus Jurassic lake herb. 70 25 - Compsognathus Jurassic land carn. - Diplodocus Jurassic lake herb. 90 15 Elasmosaurus Cretaceous sea carn. 40 5 Plateosaurus Triassic land herb. 30 5 - Pterodactyl Cretaceous air carn. - Stegosaurus Jurassic land herb. 20 2 Triceratops Cretaceous land herb. 25 10 Tyrannosaurus Cretaceous land carn. 50 8 - 2 0 1 0 Main le 0 15 0 2 5 8 Zahl der nachfolgenden Zeiger 2 ? - 3 1 - 1 1 - 15 1 10 Index zum Sekundar-Index 25 Q 50 Q Q s PPP Q q 1 P 1 Sekundar-Index fur GEWICHT 37 3.8 Partial Match Retrieval Unter Partial Match Retrieval versteht man die Suche nach Records, bei denen gewisse Attribute a1 : : : ak mit gegebenen Werten w1 : : : wk ubereinstimmen. Um ein vollstandiges Durchsuchen aller Blocke zu vermeiden, setzt man die folgenden Verfahren ein: Mehrfach-Sekundar-Index Fur diejenigen Attribute, die durch einen Sekundar-Index unterstutzt werden, ndet man die zugehorigen Zeiger-Mengen S1 : : : Sj und bildet deren Durchschnitt S. Alle Blocke, deren Adressen im Schnitt S liegen, werden nun auf Records hin durchsucht, die mit den Werten w1 : : : wk ubereinstimmen. (Achtung: Da S als Schnitt von Blockadressen gebildet wird, mu nicht jeder Block aus S tatsachlich ein Record enthalten, das mit w1 : : : wj ubereinstimmt.) Partitionierte Hash-Funktion Es wird eine Hash-Funktion h verwendet, die als Argument alle Attribute, und nicht nur den Schlussel, enthalt. Sei die Anzahl der Buckets eine Zweier-Potenz, z.B. 2b . Dann besteht eine (logische) Bucketadresse aus b Bits. Fur jedes Attribut ai i = 1 : : : k verwenden wir eine HashFunktion hi, deren Funktionswert im Intervall 0::2bi ; 1 liegt, d.h. aus bi P Bits besteht. Es gilt ki=1 bi = b. Die Hashfunktion h besteht nun aus der Konkatenation der einzelnen Hashwerte hi : h(a1 a2 : : :ak ) = h1 (a1 )h2(a2 ) : : :hk (ak ): Beispiel: Gegeben der Record-Typ Student mit den Feldern a1 a2 a3. Matrikel-Nummer : integer Versicherungsnummer : integer Hauptfach : 10 characters. Es seien 29 = 512 Buckets zu verwalten. Es sei h1 (x) := x mod 16 (liefert 4 Bits) h2 (x) := x mod 8 (liefert 3 Bits) h3 (x) := (Lange von x) mod 4 (liefert 2 Bits) Der Student mit Matrikel-Nummer 58651 und Versicherungsnummer 130326734 und Hauptfach Mathe bekommtden Hashwert 101111001 (binar), denn 58651 mod 16 ergibt 11 = 1011 (binar), 130326734 mod 8 ergibt 6 = 110 (binar), 5 mod 4 ergibt 1 = 01 (binar). Ist zum Suchen das Attribut ai gegeben, so sind bereits bi Bits der Bucketadresse bekannt. AttributePa1 : : : aj reduzieren damit den Suchraum um den Faktor 2a mit a = ji=1 bi. 38 3.9 Multidimensionale Range-Queries Bisher: Jetzt: Beispiel: Alter Einkommen PLZ Finde alle Records mit x1 a x2 Finde alle Records mit x1 a1 x2 und y1 a2 y2 : : : gesucht sind alle Personen zwischen 20 und 30 Jahre alt zwischen 2000 und 3000 DM zwischen 40000 und 50000 im folgenden (zur Veranschaulichung) nur 2-dimensionaler Fall (ist verallgemeinerbar): y 6 G y2 B y1 A E x1 F D H C I K J x2 - x d.h. gegeben Rechteck mit seinen Eckpunkten, nde alle Punkte, die im Rechteck liegen. Gegeben sei function imrechteck (p : Punkt r : rechteck) : boolean 1. Moglichkeit: sequentiell alle Punkte testen 2. Moglichkeit: Projektion auf x oder y mit binarer Suche uber vorhandenen Index, danach sequentiell, d.h. zunachst werden G F C D E ermittelt, danach bleibt F ubrig 3. Moglichkeit: Projektion auf x und Projektion auf y, anschlieend Durchschnitt bilden. Beobachtung: ggf. lange Laufzeit trotz kleiner Treerzahl! Dagegen: 1-dimensionale Suche: Aufwand k+log n bei k Treern in einem Suchbaum mit n Knoten. 39 3.10 2 ; d-trees (allgemein k ; d-trees) Verallgemeinerung von binaren Suchbaumen homogene Variante: Knoten enthalt Datenrecord linker Sohnzeiger rechter Sohnzeiger Fur jeden Knoten mit Schlussel x=y gilt im linken Sohn im rechten Sohn auf ungerader Ebene alle Schlussel x alle Schlussel > x auf gerader Ebene alle Schlussel y alle Schlussel > y 10 9 8 7 6 5 4 3 2 1 E G F A H C B D 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 A5=6 Ebene 0 bzgl. y kleiner H y groer Hbzgl. HH H B14=3 E7=9 HHbzgl. x groer bzgl. x kleiner H x groer Hbzgl. H H H G1=8 F 12=7 C9=4 H bzgl. y kleiner H y groer Hbzgl. H H H D6=2 H8=5 bei k ; d-trees: verwende auf Ebene z als Diskriminator das Attribut (z mod k) 40 Aufbau des 2 ; d-Baums analog zu binarem Baum: Suche mit Schlussel x=y abwechselnd die Stelle, wo x=y Knoten sein mute und hange ihn dort ein. Exakt Match z.B. nde Record (15=5) Suche mit Schlussel x=y abwechselnd bis zur Stelle, an der x=y Knoten sein mute. Partial Match z.B. nde alle Records mit x = 7: an den Knoten, an denen nicht bzgl. x diskriminiert wird, steige in beide Sohne ab, an den Knoten, an denen bzgl. x diskriminiert wird, steige in den zutreenden ab. Range-Query z.B. nde alle Records mit 7 x 13 7 y 10: an den Knoten, an denen die Diskriminatorlinie das Suchrechteck schneidet, steige in beide Sohne ab, sonst steige in den zutreenden Sohn ab. m ; ; m A B @ m @ @ m m B El ; ; Gm; Cm ; @ ; @ Dm Hm Am @ @ l Em ; @ ; @ l Gm Fm ; ; A Beobachtung: Laufzeit k + log n Schritte bei k Treern! Best-Match z.B. nde \nachstgelegenes" Record zu x = 7 y = 3 : ) Range-Query, statt Suchrechteck jetzt Suchkreis mit Radius gema Distanz- funktion, wahrend der Baumtraversierung schrumpft der Suchradius. Ist erweiterbar auf k-best-Matches. A best 5 6 m ; ; x m ; @ ; m j opt-best j best 9 4 C opt 6 ; @ ; lbest 6Hj2 m D B 41 @ Wenn k ; d-Baum im Hindergrundspeicher liegt, dann verwende inhomogene Variante: interner Knoten enthalt Schlusselinformation linker Sohnzeiger rechter Sohnzeiger Blatter verweisen in Hauptdatei 6 HHo u 4 u; @ o ; ; C B D @ @ l A H 14 HHHr 8 u; @ ; ; @ @ G 7 HHr HH H l E 12 u; @ o H H H ; ; @ F 9 > > > > > = Index Datei > > > > > 9 > = Hauptdatei > speichere zusammengehorende interne Knoten auf einen Block Beispiel: ein Block fasse 7 interne Knoten ;@ ; @ ; @ ; @ ; @ ; @ ; @ ;@ ;@ ; @ ; @ ; @ ; @ ; @ ; @ ;@ ;@ ;@ ;@ ; @ ; @ ; @ ; @ ;@ ;@ ;@ ;@ ;@ ;@ ;@ @ ; @ ; @ ; @ ; @ ; @ ; @ ;;@ @ ; ;@ ;@ /n /n/n /n Bewertung: k ; d-Baum ist statische Struktur, loschen und balancieren ist aufwendig. 42 Statt anhand der Daten zu partitionieren, wird jetzt der Datenraum partitioniert. 3.11 Gitterverfahren Bei konstanter Gittergroe wird der Datenraum in Quadrate fester Groe aufgeteilt, und Zeiger werden auf die Quadrate verwaltet. Beispiel: 48 records, jeder Block kann 2 records aufnehmen. Wahle Gitter mit 24 Quadraten. Index enthalt bis zu 24 Zeiger. Bei einer Query lade die Blocke, die in Frage kommen. Oenbar: Quadrate nur gleichmaig ausgelastet bei Gleichverteilung. Im Ballungsraum keine Wirkung Also: Quadratgroen den Datenmengen anpassen! 43 Grid File (Hinrichs & Nievergelt 1981) fur beliebige Dimension k moglich, dynamische Struktur mit \2 Platten-Zugrisgarantie" hier: Dimension 2 Buckets fur Datensatze Grid-Direktory zum Finden der Bucket-Nr. 2 Skalen zum Einstieg ins Grid-Directory. Skala (im Hauptspeicher) var X: array 0 : : : max x] of attribut wert x var Y: array 0 : : : max y] of attribut wert y d.h. die Skalen enthalten die (momentane) Unterteilung der X- bzw. Y -Achse y 3030 x G 6 2500 2050 0 30 40 85 120 xi] i = 0 : : : max x Gi] i = 0 : : : max x ; 1 @ I @ @ Gitterzellen 800 6 0 30 40 85 - x Bucketbereich 120 Grid-Directory (im Hintergrundspeicher) : : :max x - 1, 0: : :max y - 1] of pointer d.h. enthalt eine Bucketadresse, z.B. alle Punkte mit 30 < x 40 2050 < y 2500 sind im Bucket mit Adresse G1,2] zu nden (im Beispiel gestrichelt umrandet). Achtung: mehrere Gitterzellen konnen im selben Bucket liegen. var G: array 0 Gx, y] Bucket (im Hintergrundspeicher) = Block 44 Philosophie: Bei sich anderndem Datenbestand werden durch Modikation der Skalen die Groen der Gitterzellen angepat. LOOKUP fur x y. Beispiel x = 100 y = 1000 Suche in Skala x den letzten Eintrag < x. Habe Index i = 3. Suche in Skala y den letzten Eintrag < y. Habe Index j = 1. Lade den Teil des Grid-Directory in den Hauptspeicher, der G#i j] enthalt. Lade Bucket mit Adresse G#i j]. Beispiel: 1.000.000 Datensatze, 4 passen in einen Block x und y haben 500 Unterteilungen ) G hat 250.000 Eintrage bei 4 Bytes pro Zeiger und 1024 Bytes pro Block passen 250 Zeiger auf einen Directory-Block ) es gibt 1000 Directory-Blocke d.h. G#i j] ndet sich auf Block 2 j als i-te Adresse, falls i < 250 auf Block 2 j + 1 als (i ; 250)-te Adresse, falls i 250 exakt match benotigt 2 Plattenzugrie range-query bestimmt zunachst die Gitterzellen, die in Frage kommen, und liest dann die zugehorenden Buckets ein. 45 Dynamik des Gridle Annahme: 2 Records pro Datenbucket Splitting-Policy: Region halbieren, Dimension abwechseln AB AD 6 8 6 8 6 6 A 4 A 4 B 2 2 4 6 AE 8 10 12 C 2 14 2 E 8 6 A @ 4 C 2 B D 2 4 ?6 G AE 8 D 6 10 12 @ R @ - BC 14 6 E G 6 A 4 C 2 B D 2 ?4 ?6 D - F 8 10 12 F - BC 14 Grid-Directory hat 6 Zeiger auf insgesamt 5 Buckets, x-Skala hat 3 Eintrage, y-Skala hat 2 Eintrage. 46 B D 6 8 BC 6 4 6 8 10 12 14 Splitting Policy Bei U berlauf eines Buckets, dessen Region aus einer Zelle besteht, entsteht eine Gitterverfeinerung. (Annahme: 3 Records pro Datenbucket) - - - Hierzu Region halbieren, dabei Dimension abwechseln. Skala modizieren, Directory modizieren. Bei U berlauf eines Buckets, dessen Region aus mehreren Gitterzellen besteht, entsteht keine Gitterverfeinerung. PPP P q P 1 - - Achtung: Bei Verfeinerung einer Skala ist directory-Modikation erforderlich: 0 10 30 40 70 80 100 110 0 10 30 40 50 70 80 100 110 6 Beim U berlauf eines Directory-Blockes wird dieser halbiert und auf zwei Blocke verteilt. Hierbei kann es zu einer Vergroberung der Skala kommen. Der Einstieg in den zustandigen Directory-Block erfolgt uber das Root-Directory im Hauptspeicher mit vergroberten Skalen. 47 Beispiel: 3 Records pro Datenblock 4 Zeiger pro Directoryblock 300 Einfügen von A, B, C verursacht A einen Datenblock und C einen Directoryblock. 300 100 10 50 B 200 10 50 300 Einfügen von D verursacht Datenblocksplit. A D C 300 100 10 30 50 B 200 10 30 50 300 Einfügen von E verursacht Datenblocksplit. A D C E 300 250 250 200 B 200 10 30 50 48 10 30 50 Einfügen von F verursacht Datenblocksplit und 300 Directoryblocksplit. F A D C E 250 300 300 250 250 200 10 20 30 200 30 50 B 200 10 20 50 30 Ein Directoryblock kann seine Skala in y-Richtung vergröbern. 300 F D A C E 300 250 250 200 300 10 20 30 B 200 10 20 30 50 Beispiel 49 200 30 50 Merging Policy legt fest 1. Wer ist Mischpartner? 2. Wann wird Mischen ausgelost? zu 1) Mischpartner zu einem Bucket X kann nur ein Bucket Y sein, wenn die Vereinigung der beiden Bucketregionen ein Rechteck bilden. Grund: Zur ezienten Bearbeitung von Range-Queries sind \gradlinige" Gitter sinnvoll! - Query testet 7 Punkte! nicht erlaubt erlaubt zu 2) wenn Bucket hochstens zu 30 % belegt ist und wenn vereinigtes Bucket hochstens zu 70 % belegt sein wurde (um erneutes Splitten zu vermeiden) Achtung: Werden beliebige Nachbarn (mit Rechteckbedingung) als Mischpartner zugelassen, besteht Deacklockgefahr, d.h. trotz schlechter Blockausnutzung sind keine weiteren Verschmelzungen mehr moglich. 50 3.12 Verwaltung geometrischer Objekte Bisher: Punkte reprasentieren Attributkombinationen Jetzt: Punkte reprasentieren geometrisches Objekt Beispiel: Zu verwalten seien eindimensionale Intervalle E 0 A 1 C B 2 3 4 5 F D 6 7 8 9 10 11 Ordne jedem Intervall zwei Zahlen zu, z.B. Anfang und Ende ) alle Eintrage oberhalb der Diagonale, bei kurzen Intervallen in schmaler Bandbreite rx 15 6 ; 14 F ; 13 ; 12 ; 11 ; 10 ; C D ; 9 ; 8 ; 7 E B ; 6 ; 5 ; 4 ; A 3 ; 2 ; ; 1 ; - lx 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Ordne jedem Intervall zwei Zahlen zu, z.B. Mittelpunkt und halbe Lange ) bessere Ausnutzung der Flache dx 3 6 E 2 1 B A C D F - cx 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 51 12 13 14 Typische Queries: Gegeben Punkt P, nde alle Intervalle, die ihn enthalten. Gegeben Invervall I, nde alle Intervalle, die es schneidet. Ein Punkt P ist enthalten im Intervall mit Mitte cx und halber Lange dx , cx ; dx p cx + dx. dx 4 6 Beispiel fur p=5 AA A 3 2 A E A A A A A A A 1 C B D A A F 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 - cx Ein Intervall mit Mitte p und halber Lange d schneidet ein Intervall mit Mitte cx und halber Lange dx , cx ; dx p + d und cx + dx p ; d dx 4 6 Beispiel fur p = 10 d = 1 3 E 2 1 AA A A B A A A A C A A A D A A F 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 - cx Fazit: Es entstehen Range-Queries mit kegelformigem Abfragebereich. Zur Verwaltung von orthogonalen Rechtecken in der Ebene bietet sich an: Ein Rechteck wird reprasentiert als ein Punkt im 4-dimensionalen Raum, gebildet durch die beiden 2-dimensionalen Punkte fur horizontale bzw. vertikale Lage. Zu einem Query-Rechteck, bestehend aus horizontalem Intervall P und vertikalem Intervall Q, lassen sich die schneidenden Rechtecke nden im Durchschnitt der beiden kegelformigen Abfragebereiche zu den Intervallen P und Q. 52 Nearest Neighbor im Gridle Suche auf dem Datenblock, der fur den Querypoint Q zustandig ist, den nachstgelegenen Punkt P. Bilde Range-Query mit Quadrat um den Kreis um Q mit Radius jP ; Qj. Schranke Quadratgroe weiter ein, falls nahere Punkte gefunden werden. P R Q Idee zum Finden des nachsten Nachbarn im Gridle 53 4 Das Hierarchische Konzept 4.1 IMS-Begrie Datenbanksysteme, die auf dem hierarchischen Datenmodell basieren, sind noch sehr verbreitet, da sie sich aus Dateiverwaltungssystemen fur die konventionelle Datenverarbeitung heraus entwickelt haben. Wir stellen hier das am meisten verbreitete derartige Datenbanksystem vor: IMS (Information Management System) von IBM. Grundlage einer IMS-Datenbank sind die PDBs (physical databases) jede PDB besteht aus einer Menge von PDBRs (physical database records) eines bestimmten Typs. Ein PDBR-Typ entspricht einem Baum auf Typ-Ebene, eine PDB entspricht einer Realisierung des Baumes, und ein zugehoriges PDBR entspricht einem durch ein Wurzel-Entity erzeugten einzelnen Baum der Entity-Ebene, d.h. ein Wurzel-Entity zusammen mit allen hierarchisch untergeordneten Entities. Spieler Name Gebdatum Adresse PLZ root segment Segment-Typ Position Ort Muller Posnr ? Posbez PDBR-Typ - segment occurrence PDBR-occurrence Jedes PDBR besteht aus Segmenten. Ein Segment entspricht einem Entity-Typ, eine Auspragung davon heit segment occurrence und entspricht einem entity. Die Wurzeln der Baume auf Entity-Ebene heien root segments. Jedes Segment besteht aus elds (entsprechen den Attributen), Auspragungen davon heien eld occurrence (entsprechen den Attributwerden). Eine PDB wird beschrieben (als Baum der Typebene) durch eine DBD (data base description). Die Menge aller DBDs einschlielich einiger Transformationsregeln zwischen konzeptueller und interner Ebene ergibt das konzeptuelle Schema. 54 Zusatzlich gibt es in zwei Verwendungen die LDB (logical database): auf konzeptueller Ebene, um verschiedene PDBs durch logische Zeiger in Beziehung zu setzen. Beschreibung erfolgt als DBD. auf externer Ebene, um Benutzersichten darzustellen (Einschrankung auf eine PDB bzw. konzeptuelle LDB). Beschreibung erfolgt durch den Anwendungsadministrator als PCB (program communication block). Die Menge aller fur den Benutzer relevanten externen LDBs bilden sein externes Modell, die Menge aller zugehorigen PCBs werden in einem PSB (program specication block) zusammengefat und bilden das externe Schema. ; @ Benutzer ; @ fCOBOLjPL/2g + DL/I @ ; @ ; A A A A A A ; Benutzer @ @ASS + DL/I; PSB (externes Schema) PCB PCB LDBE LDBE : : : @ @ @ @ DBD PDB ; ; DBD LDBK DBD LDBK ; ; ; @ @; PCB LDBE ::: ::: Anwendungsebene externe Ebene ; ; ::: XXX @ X; XXX @ X ; DBD PDB ::: DBD PDB ::: Konzeptuelle Ebene + Teil der internen Ebene bzw. Teil der Transformationsregeln konzeptuelles/internes Modell physische Ebene IMS-Datenbankarchitektur 55 4.2 Datenbeschreibung in IMS Wir beschreiben den prinzipiellen Aufbau der DBDs anhand einer einfachen PDB mit dem Namen XA, die aus einer hierarchischen Beziehung zwischen den Segmenten PROJEKT und ANGEST besteht (Zeilen sind zu Referenzzwecken numeriert): XA 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. DBD SEGM FIELD FIELD FIELD FIELD SEGM FIELD FIELD FIELD FIELD NAME NAME NAME NAME NAME NAME NAME NAME NAME NAME NAME = = = = = = = = = = = XA, ACCESS = HIDAM PROJEKT, BYTES = 182 (PNR,SEQ,U), BYTES = 6, START = 1 PNAME, BYTES = 20, START = 7 PLEITER, BYTES = 6, START = 27 PBESCHR, BYTES = 150, START = 33 ANGEST, PARENT = PROJEKT, BYTES = 30 (NAME,SEQ,M), BYTES = 20, START = 6 ANGNR, BYTES = 5, START = 1 ABTNR, BYTES = 2, START = 26 PROZARBZ, BYTES = 3, START = 28 Erlauterung: Es werden alle Segmente in ihrer hierarchischen Reihenfolge nacheinander beschrieben: 1.) Festlegung des Namens XA fur die PDB und der Zugrismethode. Es gibt HSAM: hierarchical sequential access method HISAM: hierarchical indexed sequential access method HDAM: hierarchical direct access method HIDAM: hierarchical indexed direct access method 2.) Wurzelsegment PROJEKT hat eine Gesamtlange von 182 Bytes 3.) Feld PNR ist 6 Bytes lang, beginnt bei Position 1 (relativ zum Segment). PNR ist Sequenzfeld (SEQ), d.h. segment occurrences werden aufsteigend nach PNR geordnet abgespeichert. \U" (unique) bedeutet, da PNR eindeutig (pro Vater occurrence) ist. 7.) Das Segment ANGEST hat als Vater das Segment PROJEKT. 8.) \M" (multiple) im Sequenzfeld NAME erlaubt pro Vater occurrence mehrere bzgl. NAME gleichlautende Sohne. Man beachte, da ein Teil dieser Angaben nach unserer Notation nicht zum konzeptuellen, sondern zum internen Schema gehort. Entities vom Typ ANGEST sind nur als Sohne vom Segment PROJEKT zu erreichen. Mochte man die Angestellten auch fur sich alleine verarbeiten, so mu 56 man alle ANGEST-Entities dupliziert in einer weiteren PDB, z.B. mit dem Namen XB, halten. (Das Feld PROZARBZ ist hier weggelassen, statt dessen wurde zusatzlich ein Feld ANSCHRIFT eingefuhrt.) XB DBD SEGM FIELD FIELD FIELD FIELD NAME NAME NAME NAME NAME NAME = = = = = = XB, ACCESS = HIDAM ANGEST, BYTES = 67 (ANGNR ,SEQ), BYTES = 5, START = 1 NAME, BYTES = 20, START = 6 ANSCHRIFT, BYTES = 40, START = 26 ABTNR, BYTES = 2, START = 66 Folgende Probleme sind oensichtlich: Daten werden doppelt gespeichert Zusammenhang zwischen XA und XB ist nur dem Anwendungsprogrammierer bekannt. Dieser Mistand wird durch die Einfuhrung einer logischen Datenbank auf konzeptueller Ebene behoben. Statt der PDB XA wird eine PDB XC deniert, welche als Sohn von PROJEKT einen Entity-Typen PA enthalt. PA besitzt einen Zeiger auf das Segment ANGEST in der PDB XD: XC: PROJEKT XD: ANGEST XE: PROJEKT 6 PA PROJANG PROZARBZ ANGEST PROZARBZ PDB-Ebene LDB-Ebene Kante eines physischen Baumes (physisch realisiert) (PROJEKT \physischer Vater" von PA) - Zeiger (physisch realisiert) (ANGEST \logischer Vater" von PA) Kante eines logischen Baumes (nicht physisch realisiert) Redundanzfreie Speicherung mittels einer konzeptuellen LDB 57 Wir nennen PA den physischen Sohn von PROJEKT und den logischen Sohn von ANGEST entsprechend heit PROJEKT der physische Vater von PA und ANGEST der logische Vater. Die Beschreibung der PDBs tangaben sind weggelassen): XC XD 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. DBD SEGM FIELDs SEGM XC und XD sieht aus wie folgt (Bytes- und Star- FIELD FIELD NAME = XC, ACCESS = HIDAM NAME = PROJEKT, f ur PROJEKT wie in DBD f ur XA NAME = PA, POINTER = (LPARNT, ), PARENT = (PROJEKT,(ANGEST, XD)), NAME = (NAME, SEQ, M), NAME = PROZARBZ, DBD SEGM LCHILD FIELDs NAME = XD, ACCESS = HIDAM NAME = ANGEST, NAME = (PA, XC) f ur ANGEST wie in DBD f ur XB < < ::: ::: > ::: ::: ::: ::: > 4.) Ein Zeiger zum logischen Vater ist einzurichten. 5.) Es wird der physische (PROJEKT) und logische Vater (ANGEST in der PDB XD) genannt. 6.) Es wird NAME (aus dem Segment ANGEST) als Sequenzfeld angegeben. 10.) Es wird vermerkt, da PA in der PDB XC das logische Kind ist von ANGEST. Beide DBDs werden nun zusammengefat zu einer LDB Segment angegeben wird, wo seine Quelle SOURCE liegt: XE 1. 2. 3. 4. 5. DBD DATASET SEGM SEGM , in der fur jedes XE NAME = XE, ACCESS = LOGICAL LOGICAL NAME = PROJEKT, SOURCE = (PROJEKT, XC) NAME = PROJANG,PARENT = PROJEKT, SOURCE = ((PA,XC), (ANGEST, XD)) 1.) Die DBD XE existiert nicht physisch, sondern logisch. 3.) PROJEKT ndet sich als PROJEKT in XC. 5.) PROJANG erhalt man als Ersetzung des Zeigers PA in XC durch das Segment ANGEST ind XD. 58 Das \Einhangen" von Teilbaumen kann an beliebiger Stelle geschehen: A Y 1: PDB-Ebene: Y 2: B D C E C J Y 3: F C 66 G Y 4: LDB-Ebene: H A B Y 5: C G D J C H G H Eine many-many-Beziehung wird durch ein Zeigerpaar realisiert: PDB-Ebene: LDB-Ebene: XF: XG: - PROJEKT ANGEST PA AP PROZARBZ PROZARBZ XH: PROJEKT XJ: ANGEST PROJANG ANGPROJ ANGEST PROZARBZ PROJEKT PROZARBZ 59 Die DBDs fur XF und XG weisen auf das paarweise Auftreten der Zeiger PA und AP einmal durch das Wort PAIRED hin, zum anderen wird bei der Angabe des logischen Kindes zu PROJEKT der inverse Zeiger PA erwahnt und bei Angabe des logischen Kindes zu ANGEST der inverse Zeiger AP erwahnt. XF DBD SEGM LCHILD FIELDs SEGM < FIELD FIELD XG DBD SEGM LCHILD FIELDs SEGM < FIELD FIELD NAME NAME NAME f ur NAME PARENT NAME NAME = XF, ACCESS = HIDAM = PROJEKT, = (AP,XG), PAIR = PA PROJEKT wie in DBD f ur XA = PA, POINTER = (LPARNT, PAIRED, = (PROJEKT, (ANGEST, XG)), = (NAME, SEQ, M), = PROZARBZ, NAME NAME NAME f ur NAME PARENT NAME NAME = XG, ACCESS = HIDAM = ANGEST, = (PA, XF), PAIR = AP ANGEST wie in DBD f ur XB = AP, POINTER = (LPARNT, PAIRED, = (ANGEST, (PROJEKT, XF)) = (PNR, SEQ), = PROZARBZ, ::: > ::: ::: ::: : : :), ::: > ::: ::: ::: : : :), Der Aufbau der logischen LDBs XH und XJ geschieht analog zu XE. 4.3 Die externe Ebene von IMS Eine IMS-Datenbank besteht auf der konzeptuellen Ebene aus einer Menge von PDBs und LDBs. Da der Benutzer i.a. nicht die gesamte Datenbank sehen soll, wahlt er durch eine externe LDBE die fur ihn relevanten Teile der konzeptuellen PDBs und LDBK aus. Diese LDBE besteht aus LDBRE s eines LDBRE -Typs dieser LDBRE -Typ ist ein Teil eines PDBR-Typs oder LDBRK -Typs und entsteht durch Weglassen von mehreren oder auch null Segmenten des unterliegenden PDBR-Typs. Mit einem Segment s mu auch der gesamte Teilbaum, der s als Wurzel hat, gestrichen werden. Die root-Segmente von LDBRE und PDBR sind identisch. Jede LDBE eines Benutzers wird beschrieben durch einen PCB (Program Communication Block), der den Namen der zugrunde liegenden PDB oder LDB, das Wurzelsegement und die fur die LDBE benogtigten Segmente, die sogenannten sensitiven Segmente (SENSEG), angibt. Zu jedem sensitiven Segment mu der 60 unmittelbare Vorganger (PARENT) sowie eine Verarbeitungsart (PROCOPT = Processing Option) speziziert werden moglich sind dabei G R I D fur get fur replace fur insert fur delete (nur Lesen erlaubt) (Lesen und Schreiben erlaubt) (Einfugen erlaubt) (Loschen erlaubt) sowie beliebige Kombinationen davon. Es mu immer ein vollstandiger Weg angegeben werden, d.h. alle Segmente, die auf dem Weg von der Wurzel (einschlielich) bis zum angesprochenen Entity liegen, mussen sensitiv sein. Soll ein Benutzer nicht alle dazwischen liegenden Entities sehen, wird durch PROCOPT = K die sogenannte key sensitivity deniert, welche von einem Segment nur den Schlussel sichtbar macht. Beispiel: Folgender PCB prasentiert die LDBK Y4 dem Benutzer als \seine" LDBE Y6: Y6 PCB TYPE = DB, DBDNAME = Y4, : : : SENSEG SENSEG SENSEG SENSEG Y 4: NAME NAME NAME NAME = = = = A, B, C, G, PROCOPT = G PARENT = A, PROCOPT = G PARENT = A, PROCOPT = K PARENT = C, PROCOPT = I, D A B Y 6: C G D B H A C G PDBR-Typ oder LDBRK -Typ LDBRE -Typ IMS prasentiert die LDBE immer nur so, als ob sie tatsachlich in dieser Form existiert, d.h. die nicht sensitiven Segmente (genauer: occurrences) werden beim Baumdurchlauf ubersprungen. Achtung: Ist S ein sensitives Segment, in dessen Teilbaum nichtsensitive Elemente enthalten sind, so werden beim Loschen eines S-occurrence alle davon abhangigen occurrences, auch die nicht-sensitiven, geloscht. Der Benutzer bleibt daruber im unklaren! 61 4.4 Datenmanipulation in IMS Als DML (data manipulation language) steht in IMS die sogenannte DL/1 (data language 1) zur Verfugung, die durch Prozeduraufrufe aus dem Anwenderprogramm (COBOL, Pl/I, IBM-Assembler) realisiert wird. Die Befehle von DL/1 verursachen immer zunachst einen Einstieg ins Wurzelsegment und dann ein Durchlaufen des Baumes gema seiner hierarchischen Ordnung. Zur Festlegung dieser Ordnung denieren wir fur jedes segment den HSKV (hierarchical sequence key value) wie folgt: occurrence s HSKV(s) := HSKV (vater(s)) Typnr(s) sequenzfeld(s) Existiert kein Vater, so ist der entsprechende HSKV leer. Die Typnr fur Segmente erhalten wir durch fortlaufende Nummerierung der Knoten im PDBRTyp-Baum gema einem Preorder-Durchlauf. Alle segment occurrences sind nun geordnet in aufsteigender Folge ihrer HSKVs. Zur Identizierung eines Segments verwenden wir den FCK (fully concatenated key). Er besteht aus dem HSKV ohne Typnummern. Folgende Befehle (stark vereinfachte Syntax) gibt es in DL/1: GU get unique GN GNP get next get next within parent GHU GHN GHNP ISRT DLET REPL get hold unique get hold next get hold within parent insert delete replace direkter Zugri ab Wurzel auf erstes Segment sequentiell ab aktueller Position sequentiell innerhalb des am aktuellen Vater hangenden Teilbaums wie oben, aber DLET oder REPL geplant wie oben, aber DLET oder REPL geplant wie oben, aber DLET oder REPL geplant fuge ein losche ersetze Die Operationen bekommen als Argument ggf. eine Folge von SSAs (segment search arguments), die aus einem Segmentnamen und mehreren Bedingungen bestehen. Die SSAs mussen angegeben werden fur alle Segmente langs des Pfades von der Wurzel bis zum referierten Segment. Als aktueller Vater gilt immer das zuletzt mit GU oder GN angesprochene Segment. Die aufgerufene Prozedur liefert neben mehreren Statusmeldungen eine boolesche Variable GEFUNDEN zuruck, die signalisiert, ob der Zugri erfolgreich war. Vor Anwendung von ISRT oder RPL mu ein entsprechendes Segment mit den 62 neuen bzw. zu andernden Daten im I/O-Bereich vorbereitet werden. Das SSA kann optional einige sogenannte Command Codes enthalten. Die beiden wichtigsten sind D (data) und F (first): D bewirkt, da nicht nur das referierte Segment zuruckgeliefert F wird, sondern auch samtliche Segmente auf dem Weg von der Wurzel bis dorthin. bewirkt, da ein GNP-Befehl nicht innerhalb des aktuellen Vaters eine Vorwartssuche auslost, sondern einen Rucksprung zum ersten (naher bezeichneten) Segment des aktuellen Vaters bewirkt. Die folgenden Befehle beziehen sich auf das Beispiel Schulungsrma (Seite 66). 1.) Finde den ersten Kurs mit Durchfuhrungsort Dublin: GU COURSE OFFERING (LOCATION = 'DUBLIN') 2.) Drucke alle Horer ab dem ersten Kurs in Madrid: GU COURSE OFFERING (LOCATION = 'MADRID') STUDENT while gefunden do begin write (STUDENT.NAME) GN STUDENT end 63 3.) Drucke alle Horer mit Note A ab dem ersten Kurs in Madrid: GU COURSE OFFERING (LOCATION = 'MADRID') STUDENT (GRADE = 'A') while gefunden do begin write (STUDENT.NAME) GN STUDENT (GRADE = 'A') end 4.) Drucke alle Horer des Kurses M23 am 13. August 1973: GU COURSE (COURSE] = 'M23') OFFERING (DATE = '730813') if gefunden then begin GNP STUDENT while gefunden do begin write (STUDENT.NAME) GNP STUDENT end end 5.) Drucke Kursbeschreibung zum Kurs, der in Dublin stattndet: GU COURSE D OFFERING (LOCATION = 'DUBLIN') if gefunden then write (COURSE.DESCRIPN) 64 6.) Drucke Dozentennamen des ersten Studenten mit Namen Meier: fertig := false GU COURSE OFFERING while gefunden and not fertig do begin GNP STUDENT (NAME = 'MEIER') if gefunden then begin GNP TEACHER F write (TEACHER.NAME) fertig := true end else GN OFFERING end 7.) Fuge fur Kurs M23 als weitere Voraussetzung M18 PREREQ.COURSE] := 'M18' (Analysis) ein: PREREQ.TITLE := 'ANALYSIS' ISRT COURSE (COURSE = 'M23') PREREQ ] 8.) A ndere uberall die Schreibweise des Dozentennamens Meier in Meyer: GHU COURSE OFFERING TEACHER (NAME = 'MEIER') while gefunden do begin TEACHER.NAME := 'MEYER' REPL GHN TEACHER (NAME = 'MEIER') end 9.) Losche alle Studenten Meier: GHU COURSE OFFERING STUDENT (NAME = 'MEIER') while gefunden do begin DLET GHN STUDENT (NAME = 'MEIER') end 65 Beispiel: Schulungsrma LDBR-Typ: COURSE COURSE# TITLE PREREQ DESCRIPN OFFERING COURSE# TITLE DATE LOCATION FORMAT TEACHER STUDENT EMP# EMP# NAME NAME GRADE Auspragung: COURSE M 23 PREREQ PREREQ M 19 Calculus M 16 Trigonometry ::: Dynamics 750106 741104 730813 Oslo Dublin F2 F3 Madrid F3 761620 Tallis, T. OFFERING OFFERING OFFERING TEACHER 421633 Sharp, R. B 183009 Gibbons, O. A 102141 Byrd, W. 66 B STUDENT STUDENT STUDENT 4.5 Speicherorganisation fur IMS Jede PDB bildet eine Speichereinheit (z.B. ein Magnetband), in der alle segment occurrences abgespeichert sind. Jedes segment occurrence wird in einem sogenannten \stored segment" abgelegt, zusammen mit einem Prex, der Informationen uber Loschbit, Segment-Typ und Zeiger enthalt. Der Prex ist transparent fur den Benutzer. Es gibt vier Methoden, um die hierarchische Ordnung zu verwalten: HSAM (Hierarchical Sequential Access Method) Die hierarchische Reihenfolge der segment occurrences wird durch physikalische Anordnung der stored segments realisiert, d.h. strikt sequentiell (ohne Zeiger) hintereinander. Mehrere stored segments sind in einem stored record fester Lange zusammengefat. Spanned segment occurrences, d.h. Record-uberschreitende Segmente, sind nicht erlaubt. HSAM-Dateien liegen auf Magnetbandern, sie erlauben nur Lese- bzw. Kopieroperationen und sind fur Backup-Zwecke geeignet. HISAM (Hierarchical Indexed Sequential Access Method) Die Root-Segmente sind indiziert, d.h. sie sind uber eine Indexdatei erreichbar, welche als Schlussel die Sequenzfelder der Root-Segmente benutzt. Alle \Nachkommen" (Sohne, Enkel etc.) eines Root-Segments sind in einer weiteren Datei zu nden, in der sie in einfach verketteten Listen gema ihrer hierarchischen Reihenfolge abgelegt werden: ISAM data set COURSE PREREQ M 16 M 23 COURSE PREREQ Q M 27 L02 OSAM data set PREREQ OFFERING TEACHER STUDENT 730813 421633 102141 ::: 3 M 19 - STUDENT OFFERING OFFERING 741104 75106 761620 Q s OFFERING TEACHER TEACHER Q 740602 421633 Beispiel fur HISAM-Organisation 67 502417 HDAM + HIDAM (Hierarchical Direct Access Method + Hierarchical Indexed Direct Access Method) Bei HDAM und HIDAM sind die segment occurrences durch Zeiger miteinander verkettet. Es gibt hierarchische Zeiger (zeigen auf das nachste segment occurrence gema der hierarchischen Ordnung) Kind/Zwilling Zeiger (zeigen auf das jeweils erste segment occurrence jedes Kindes und des nachsten Zwilling) Zusatzlich zu diesen Zeigern gibt es zum Zugri auf die root occurrences in HDAM eine Hashorganisation und in HIDAM eine Indexdatei. Beispiele fur hierarchische Zeiger und fur Kind/Zwilling-Zeiger: COURSE M 23 PREREQ M 19 PP PP PREREQ M 16 ; PP ? OFFERING 750106 OFFERING 741104 ; P q OFFERING 730813 6 P STUDENT 761620 TEACHER 421633 PP P STUDENT 183009 ; STUDENT 102141 ; PP q P ; COURSE M 236 PREREQ M 19 PREREQ M 16 ; ? OFFERING 750106 ? OFFERING 741104 ; OFFERING 730813 ; STUDENT 761620 ? TEACHER 421633 ? STUDENT 183009 ; STUDENT 102141 ; 68 ; 5 Das Netzwerk-Konzept 5.1 Vorbemerkung Seit Anfang der 70er Jahre erarbeitet die DBTG (Data Base Task Group) der CODASYL (Conference on Data Systems Languages) Vorschlage zur Realisierung von Netzwerk-Datenbanken. Inzwischen liegen (vorlauge) Spezikationen und auch Implementationen vor fur eine DDL (Data Denition Language) und DML (Data Manipulation Language). Beide Sprachen sind eingebettet in die Wirts-Sprache COBOL und verwenden selbst zahlreiche COBOL-Konstrukte. 5.2 Grundidee Im Netzwerk-Konzept besteht eine Datenbank aus records verschiedener Typen. Zur Modellierung von many-one-relationships gibt es sogenannte Set-Typen, die zwei Record-Typen zueinander in Beziehung setzen. Ein Record-Typ (z.B. AUTOR) u bernimmt mittels eines Set-Typs (z.B. SCHREIBT) die Rolle des owner bzgl. eines weiteren Record-Typs (z.B. BUCH), genannt member. owner-Typ: AUTOR set-Typ: SCHREIBT member-Typ: BUCH owner occurrence 6 Simmel set occurrence - Der Henker - Selber atmen - Richtig Streiken 6 @ I ; @ member occurrence ; Der Owner-Typ mu verschieden sein vom member-Typ. Jeder Record-Typ besitzt gewohnlich mehrere Felder bei kunstlichen Kett-Records zur Realisierung von many-many-Beziehungen konnen diese auch fehlen. 69 Die einzige Operation auf dem Netzwerk ist die Navigation. Hierbei gelangt man von einem record-occurrence langs der Verbindungen zu einem weiteren record occurrence. Die Kommunikation des Benutzers mit dem Netzwerk geschieht uber die UWA (User Working Area). Sie enthalt Platzhalter fur jeden Record-Typ currency indicators, nicht explizit zuganglich, vermerken fur jedes Anwendungsprogramm pro Record-Typ und pro Set-Typ das zuletzt besuchte record occurrence bzw. set occurrence Statusinformation, z.B. die boole'sche Variable GEFUNDEN, die angibt, ob die gewunschte Operation erfolgreich war. 5.3 DDL (Data Denition Language) der DBTG Wir beschreiben die DDL anhand eines Beispiels. Denition eines Netzwerks mit zwei Record-Typen: 1. schema name is Verlag 2. record name is Autor 3. 02 Vorname pic X(15) 4. 02 Nachname pic X(15) 5. 02 Jahrgang pic 99 6. key Gesamtname is ascending Nachname ascending Vorname 7. duplicates are not allowed 8. location mode is direct 9. record name is Buch 10. 02 Titel pic X(30) 11. 02 Preis pic 9(3) 12. key Titel is ascending Titel 70 Erlauterung: 1.) 2.) 3.) 5.) 6.) Das gesamte Netzwerk heit `Verlag' Denition des Record-Typs `Autor' COBOL-Denition fur 15-Character-String COBOL-Denition fur 2-stellige Zahl alle Autoren-Records konnen bzgl. Nachname und Vorname geordnet durchlaufen werden 7.) Der unter 6. denierte key ist tatsachlich ein Schlussel 8.) Ein Autor-Record kann mittels Hashfunktion direkt angesprungen werden 11.) COBOL-Denition fur 3-stellige Zahl Denition eines Set-Typen: 1. set name is Schreibt 2. owner is Autor | System 3. order is first | last | next | prior | system default | sorted by defined keys 4. member is Buch 5. insertion is automatic | manual 6. retention is fixed | mandatory | optional 7. key is ascending Titel 8. set selection is thru Schreibt 9. owner identified by application | by key 71 Erlauterung: 1. Name des Set-Typs lautet `Schreibt' 2. \Singulare Sets" haben als owner `System', sie haben nur ein set-occurrence. 3. Der Einfugepunkt eines neuen member in einem Owner-Ring wird bestimmt: sorted by defined keys: gem a Schlussel-Information first: direkt hinter dem owner (erste Position) last: als letzter vor dem owner (letzte Position) next: hinter dem current of set-type Owner prior: vor dem current of set-type ; YH ;last H @ system default: egal ; H rst@ m R @ m 7 A 1A A U A 9 sorted m einzufugender Member m 10 HH H ; ; i P P ;next PP 6 m ; - 11 I @ current of set-type prior 4. member ist der Record-Typ `Buch' 5. Das Einfugen geschieht automactic: automatisch gem a Punkt 3 durch STORE manual: die Einf ugestelle mu \von Hand" aufgesucht werden und wird dann mit Connect gefullt 6. Das Loschen einer record-occurrence wird geregelt: fixed: record stirbt mit seinem jetzigen owner mandatory: record mu member dieses Set-Typs bleiben optional: record darf auch ohne diesen Set-Typ existieren 7. Ordnungskriterium fur `sorted by defined keys' (3.) 8. Vorspann zu 9 9. Die Festlegung des owner geschieht durch application: ein konkretes owner-occurrence wird durch den Benutzer aktiviert (current of set-type), by key: ein konkretes owner-occurrence wird durch einen Schl ussel in der UWA aktiviert 72 m 14 5.4 DML (Data Manipulation Language) der DBTG Mit der DML navigiert der Benutzer durch die Datenbank. Zur Orientierung und als Bezugspunkt dienen die (bereits in 5.2 erwahnten) currency indicators. Es gibt current of run unit Der Satz der Datenbank, egal welchen Typs, auf den zuletzt zugegrien wurde current of record type Fur jeden Record-Typ wird festgehalten, auf welches record occurrence zuletzt zugegrien wurde current of set type Fur jeden Set-Typ wird festgehalten, auf welches record occurrence (kann owner oder member sein) zuletzt zugegrien wurde. Da sets vom gleichen Typ disjunkt sind, identiziert der current of set type damit genau ein set occurrence. Ware Apfel Birne Nr Bezeichnung Tomate 6 Wb Bestellung Anz - 30 - 18 - 12 - 24 - 22 - 18 Pb ? Person Nr Name Netzwerk Lehmann Auspragung 73 Schulz Meier Anhand eines konkreten Programms, welches auf dem Schema \Teutoramsch" operiert, soll die typische DML-Syntax und die Auswirkung auf die currency indicators demonstriert werden. Das Programm druckt alle Waren aus, die Schulz bestellt hat. 1.) 2.) 3.) 4.) 5.) 6.) 7.) 8.) 9.) 10.) 11.) 12.) 13.) PERSON.NAME := 'SCHULZ' FIND ANY PERSON USING NAME IF GEFUNDEN THEN BEGIN FIND FIRST BESTELLUNG WITHIN PB WHILE GEFUNDEN DO BEGIN FIND OWNER WITHIN WB GET WARE WRITE(WARE.BEZEICHNUNG) FIND NEXT BESTELLUNG WITHIN PB END END Erlauterungen: 1.) In der UWA (User Working Area) wird ein Platzhalter vom Typ PERSON besetzt. 2.) Wenn in der Record-Beschreibung fur PERSON \location mode is direct" angegeben wurde, so ist mittels des dort angegebenen Schlussels der direkte Zugri moglich. Gilt \duplicates allowed", so wird ein erster Treer ermittelt. 5.) Innerhalb des Set-Typs PB wird nun das erste member vom Typ BESTELLUNG angesprungen. 8.) Von diesem Record wird der owner bzgl. des Set-Typs WB angesprungen. 9.) Dessen Inhalt wird in die user working area geladen. 10.) Ausgabe unter Benennung der Feldbezeichner 11.) Das nachste member im Set-Typ PB wird ermittelt. 74 Die Befehle haben die folgenden Auswirkungen auf die currency indicators: Current of : : : Nr. run unit Person 2 Schulz Schulz 5 12 Schulz 8 Apfel Schulz 11 18 Schulz 8 Birne Schulz Bestellung 12 12 18 18 Ware Apfel Apfel Birne PB WB Schulz 12 12 12 Apfel 18 18 18 Birne Im Beispiel wurden bereits behandelt: 1. FIND ANY <RECORD-NAME> USING <KEY> 2. FIND FIRST <RECORD-NAME> WITHIN <SET-NAME> 3. FIND NEXT <RECORD-NAME> WITHIN <SET-NAME> 4. FIND OWNER WITHIN <SET-NAME> 5. GET <RECORD-NAME> Weitere Befehle lauten: 6. FIND FIRST <RECORD-NAME> FIND NEXT <RECORD-NAME> Es werden alle Satze einen Typs sequentiell durchlaufen gema der Angabe \key : : : is : : :" in der Record-Denition. 7. FIND : : : USING <FIELD-LIST> Bei der Auswahl des nachsten Record wird verlangt, da er bzgl. der Feldbezeichner aus der <FIELD-LIST> mit in der UWA abgelegten Werten ubereinstimmt. Beispiel (gesucht ist die nachste Birnenbestellung): WARE.BEZEICHNUNG := `BIRNE' FIND NEXT WARE USING BEZEICHNUNG, 8. FIND CURRENT <RECORD-NAME> Der current of <RECORD-NAME> wird zur current of run unit gemacht. Dies ist vor manchen Befehlen erforderlich, die sich auf die current of run unit beziehen (z.B. GET, ERASE, : : :). 9. FIND CURRENT WITHIN <SET-NAME> Der current of <SET-NAME> wird zur current of run unit gemacht. Siehe 8. 10. FIND : : : RETAINING <RECORD-NAME> CURRENCY Es wird kein current of record type verandert. 75 11. : : : RETAINING <SET-NAME> CURRENCY Es wird der current of <SET-NAME> nicht verandert. FIND Beispiel: Von Personen, die Birnen kaufen, drucke Namen und Anzahl der Bestellungen. ware.bezeichnung := 'Birne' find any ware using bezeichnung if gefunden then begin find first bestellung within WB while gefunden do begin find owner within PB get person write (person.name) find first bestellung within PB retaining WB currency while gefunden do begin get bestellung write (bestellung.anz) find next bestellung within PB retaining WB currency end find next bestellung within WB end end sonst geht's hier schief 12. <RECORD-NAME> Ein neuer Satz vom Typ <RECORD-NAME> wird abgespeichert. Zuvor mussen seine Felder in der UWA besetzt werden. Der abgespeicherte Satz wird zur current of run unit, zum current of record type seines Record-Typs und zum current of set type fur jeden Set-Typ, in dem sein Typ owner-Typ ist, oder in dem sein Typ AUTOMATIC member ist. Zugleich werden alle Einfugungen in die Sets vorgenommen, fur die dies in der Set-Denition (INSERTION IS AUTOMATIC) vorgesehen ist. Das konkrete Set-occurrence, in das eingefugt werden soll, wird gema den Angaben der SET SELECTION ausgewahlt, d.h. entweder vom Benutzer durch Setzen des current of set type oder durch Setzen des Schlussels. STORE 76 Beispiel fur STORE: Lehmann bestellt 10 Birnen (Es sei im set WB und PB jeweils angegeben ``insertion is automatic'' person.name := 'Lehmann' find any person using name ware.bezeichnung := 'Birne' find any ware using bezeichnung bestellung.anzahl := '10' STORE bestellung 13. 14. 15. 16. 17. 18. <RECORD-NAME> Es wird der aktuelle Satz der run unit, die vom Typ <RECORD-NAME> sein mu, entfernt. Danach ist current of run unit undeniert. Die Auswirkungen auf die member des zu loschenden Satzes hangen von der retentionKlasse der Sets ab, in denen er owner ist. MANDATORY: es d urfen keine member vorhanden sein. OPTIONAL: member werden aus dem Set herausgenommen, verbleiben aber in der Datenbank. FIXED: member werden ebenfalls geloscht. ERASE ALL <RECORD-NAME> Er wird der aktuelle Satz der run unit entfernt und (rekursiv) alle seine member. CONNECT <RECORD-NAME> TO <SET-NAME> Es wird der akuelle Satz der run unit, die vom Typ <RECORD-NAME> sein mu, eingefugt in den current of <SET-NAME>. DISCONNECT <RECORD-NAME> FROM <SET-NAME> Es wird der aktuelle Satz der run unit aus dem current of < SET-NAME> entfernt (nur moglich, wenn Mitgliedschaft OPTIONAL). RECONNECT <RECORD-NAME> WITHIN <SET-NAME> Es wird die current of run unit umgehangt. Beispiel: (a) Bestimme den neuen current of set type S. (b) Bestimme das umzuhangende Element vom Typ R mit der Klausel : : : RETAINING S CURRENCY. (c) Hange R in den Set S mit der Klausel RECONNECT R WITHIN S. MODIFY <RECORD-NAME> In der current of run unit werden die in der UWA vorbereiteten Werte ubernommen (dies kann Auswirkungen auf die Sortierreihenfolge haben). ERASE 77 .) 6 Das Relationale Konzept Seien D1 : : : Dk Wertebereiche fur Auspragungen der Attribute A1 : : : Ak . Eine Relation ist eine Teilmenge des kartesischen Produktes, d.h. R D1 D2 : : : Dk . Eine Relation lat sich speichern als Tabelle mit Zeile i = i-tes Tupel Spalte j = Dj Spalten sind bezeichnet mit Attributnamen. Entity-Typ: Tabelle mit Spalten fur Attribute Relationship-Typ: Tabelle mit Spalten fur Schlussel der beteiligten Entity-Typen Student: mat nr Name hort: matr nr 123456 Meier 123456 765432 Schulz 123456 765432 vor nr Vorlesung: vor nr Titel 4711 4711 Algebra 8643 8643 Analysis 8643 Abfragesprachen fur das relationale Datenmodell 1.) Algebraische Sprachen: verknupfe Relationen durch Operatoren \ : : : 2.) Relationenkalkul: beschreibe Eigenschaften mit Hilfe der Pradikatenlogik 1. Stufe ^ _ : 9 8 3.) SQL in kommerziellen Systemen, Mischung aus 1 + 2 4.) Query by example (fur Analphabeten) 6.1 Relationenalgebra Operanden: Menge von Relationen (endlich) Operatoren: Vereinigung Dierenz Kartesisches Produkt Projektion Selektion Durchschnitt Quotient Verbund naturlicher Verbund 78 9 > > = unabhangig > > 9 > = ableitbar > Beispiel: R: A a d f B b a b C S: D E F c b g a f d a f d Vereinigung (gleiche Stelligkeit fur R und S) U := R S := ftjt 2 R _ t 2 S g a d f b b a b g c f d a Dierenz (gleiche Stelligkeit fur R und S) D := RnS := ftjt 2 R ^ t 62 S g a b c f b d Kartesisches Produkt Sei R k-stellig, sei S l-stellig. C := R S := ft = t1 : : :tk tk+1 : : :tk+l jt1 : : :tk 2 R ^ tk+1 : : :tk+l 2 S g A a a d d f f B b b a a b b C c c f f d d D b d b d b d E g a g a g a F a f a f a f Projektion Sei R k-stellig, i1 i2 : : : in verschiedene Zahlen zwischen 1 und k P := i i :::in (R) := fti ti : : :tin jt = t1 t2 : : :tk 2 Rg 1 2 1 2 13(R) = a c = AC (R) d f f d B (R) = a b 79 Selektion Sei F eine boole'sche Formel, bestehend aus Operanden: Konstante oder Attributnamen oder Attributnummern arithmetische Operatoren: < = > 6= logische Operatoren: ^ _ : (und oder nicht) S := F (R) := ft 2 RjF ist wahr fur tg (B= b ) (R) : a b c f b d 0 0 Zusatzliche Operatoren, ableitbar: Durchschnitt D := R \ S := ftjt 2 R ^ t 2 S g d a f = Rn(RnS) Verbund R '$ S '$ RnS &% &% Sei R r-stellig, S s-stellig, ' ein Vergleichsoperator = < > 6=. R i1j S := ft = t1 : : :tr+s jt1 : : :tr 2 R tr+1 : : :tr+s 2 S ti 'tj 1 i r 1 j sg = ir+j (R S) A B C D E F R A<E 1 S a b c b g a d a f b g a f b d b g a 80 Naturlicher Verbund nur sinnvoll, wenn Spaltenbezeichnungen vorhanden sind. Seien A1 A2 : : : Al die gemeinsamen Attributnamen, seien i1 : : : im die Positionen der Attributnamen, die in S, aber nicht in R vorkommen. Sei R r-stellig, S s-stellig R 1 S := 12:::rr+i r+i :::rim R:A =S:A R:A =S:A :::R:Al =S:Al (R S) 1 2 1 1 2 2 d.h. vom Kreuzprodukt solche Zeilen, die an gemeinsamen Spalten ubereinstimmen, doppelte nur einmal listen. A a d b c B b b d a C c c f b B b b a C c c d A a a d d D d e b B b b b b C c c c c D d e d e Beispiel: Was hort Meier? TitelName= Meier ((Student 1 hort) 1 Vorlesung) 0 Ergebnis: 0 Algebra Analysis Quotient Sei R r-stellig, S s-stellig Q := R S := ft = t1 : : :tr;s j8u 2 S : tu 2 Rg d.h. solche Anfangsstucke in R, zu denen samtliche Verlangerungen aus S in R sind R a b c S: c d RS b a b d x d b c d b x d Bilde T := 1:::r;s (R) T S alle Anfangsstucke alle Anfangsstucke kombiniert mit allen Verlangerungen aus S (T S)nR davon nur solche, die nicht in R sind V := 1:::r;s ((T S)nR) davon die Anfangsstucke T nV davon das Komplement 81 Zum Relationenkalkul Gegeben R(A B) S(B C) statt c(A=a (R 1 S)) konstruktiv jetzt: fcj9b : R(ab) ^ S(bc)g nicht konstruktiv Beide Ansatze sind gleichmachtig. Abfragesprache, basierend auf Relationenalgebra ISBL (Information System Base Language) von IBM Seien R S Relationen, sei F eine boole'sche Formel. Relationenalgebra ISBL RS R+S RnS R;S R\S R:S F (R) R:F A :::Ak (R) R%A1 : : : Ak R1S RS 1 R S wirkt wie das kartesische Produkt, wenn R und S keine gemeinsamen Spaltenbezeichnungen haben. Zusatzliche Features: LIST R R = E R = N!E Ausgabe der Tupel von R Ausdruck E wird ausgewertet und der Relation R zugewiesen eine Sicht R wird deniert gema dem Ausdruck E. Erst bei Referenz von R wird E ausgewertet. Beispiel: Gegeben die Relationen R(A B) S(C D) U = ((R S) : B = C)%A D unmittelbare Auswertung V = ((N!R N!S) : B = C)%A D Denition der Sicht LIST V Auswertung X =V +W Auswertung 82 Abweichungen von Relationenalgebra Attributnamen erforderlich R + S und R:S verlangen identische Attributnamen R ; S bezieht sich nur auf solche Attribute, die R und S haben Umbenennung moglich: Gegeben R(A B) und S(A C) Bilde (R%A |B ! {z C}) + S neuer Name fur B Neckermann Neckermann Quelle Hinz Kunz Hinz Kunz Beispiel: Lieferant (Name, Ware, Preis) Bestellung (Name, Ware, Anzahl) Kunde (Name, Adresse) Ball 10 Hemd 20 Hemd 25 Hemd 3 Hemd 5 Dortmund Essen a) Welche Ware liefert Firma Neckermann? % Ware b) Welche Lieferanten liefern mindestens einen Artikel, den Lehmann bestellt hat? B = (N! Lieferant % Name ! LName, Ware)* (N! Bestellung % Name, LIST (Lieferant:Name = 'Neckermann') Ware) B hat das Format (LName, Ware, Name) LIST (B:Name = 'Lehmann') LName % c) Welche Lieferanten liefern alle Artikel, die Lehmann bestellt hat? L = N! Lieferant % Name Lieferantennamen W = N! Lieferant % Ware lieferbare Waren B = (N! Bestellung : Name = 'Lehmann') % Ware Lehmann's Bestellungen NL = (N!L * N! W) - (N! Lieferant % Name, Ware) nicht lieferbare Kombinationen, Format (Name, Ware) |(N!L*N!B) {z } Lieferanten Lehmann's Bestellungen {z } | NLB = N!NL LIST (L Kombinationen von Lieferanten und Waren, die sie nicht liefern, aber Lehmann bestellt hat - NLB % Name) 83 6.2 Query by example Beispiel fur Relationenkalkul Ablauf 1.) Benutzer verlangt Tabellenskelett 2.) System liefert Tabellenskelett xxxx 3.) Benutzer tragt Tabellennamen ein 4.) System tragt Attribute ein xxxx xx xx xx 5.) Benutzer tragt Beispielantwort ein kein Prax: Konstante Prax : Variable, darf beliebig ersetzt werden Pra-Prax P.: wahlt Spalte fur Antwort xxxx xx xx xx x Beispiel: Liste die Relation Student student mat nr P. name Beispiel: Wer wohnt in Rheine? student mat nr name P. ort ort Rheine Beispiel: Wer hort Datenbanken? student hoert mat nr name plum mat nr plum vorlesung P. geb dat ort geb dat geb dat vor nr plisch vor nr titel plisch Datenbanken 84 umfang Beispiel: Welche Vorlesungen sind umfangreicher als Datenbanken? vorlesung vor nr P. titel umfang Datenbanken stunden > stunden Beispiel: Welche Vorlesung hat den hochsten Umfang? vorlesung vor nr : " titel P. umfang x > x Was auf diese Zeile zutrit, darf nicht in R sein. Welches ist der durchschnittliche Stundenumfang? Vorlesung vor nr titel umfang analog: P.AVG.ALL. 999 In wieviel Orten wohnen die Studenten? student mat nr name ort P.CNT.UN.ALL. 999 Wer ist alter als Lehmann und junger als Schulz? student mat nr conditions name P. Lehmann Schulz I. Modizieren U. vorlesung U. geb dat P. a1 a2 a3 a2 > a1 a1 > a3 Einfugen (I.) und Loschen (D.) vorlesung ort vor nr 4711 vor nr 4711 titel Algebra titel umfang 4 umfang 3 85 SUM MAX MIN CNT geb dat 6.3 INFORMIX INFORMIX ist ein relationales Datenbanksystem der Firma \Relational Database Systems, Inc", Menlo Park, California, USA. Folgende Punkte charakterisieren INFORMIX: Menue-gesteuerte Benutzeroberache, interaktiv, Erzeugen von Tabellen durch Festlegung der Spaltentypen, Indizes und Nullwertmoglichkeiten, Denition von statistischen und dynamischen Tabellen, Formulieren von Anfragen (Queries) mit der Sprache RDSQL (Erweiterung von SQL = IBM-Standard fur relationale Datenbanken), Editierung der Query mit eigenem oder SQL-Editor, Erzeugen von Bildschirmmasken zur Ein-/Ausgabe von Daten (mit Bereichsuberprufung) und zur Datensuche, Erzeugen von Reports (= formatierte Ausgaben), Gewahrung von Datensicherheit und Datenschutz durch { Zugrisrechte fur Queries, { Transaktionen (Folge von Operationen, von denen alle oder keine ausgefuhrt werden), { Logbuch (protokolliert Veranderungen), Beispieldatenbank. Die von INFORMIX verwendeten Datentypen lauten: Typ Wertebereich Platz char(n) string mit n Zeichen n Bytes smallint ;32767 : : :32767 2 Bytes integer ;2147483647 : ::2147483647 4 Bytes smalloat Gleitpunkt mit 7 Stellen Genauigkeit 4 Bytes oat Gleitpunkt mit 14 Stellen Genauigkeit 8 Bytes decimal(n m) Dezimalzahl mit n Stellen 1 + n=2 Bytes davon m hinter dem Komma serial (x) Seriennummer, beginnend mit x 4 Bytes date Datum (gespeichert als Tage seit 31.12.1899 4 Bytes money(n m) Geldbetrag (wie decimal, mit Dollarzeichen) 1 + n=2 Bytes Nicht besetzte Attributwerte werden durch das Schlusselwort NULL gekennzeichnet. 86 Eine RDSQL-Query hat den folgenden Aufbau: <Spalten-1> <Tabellen> <Bedingung-1> <Spalten-2> <Bedingung-2> <Spalten-3> <Tabelle> SELECT FROM WHERE GROUP BY HAVING ORDER BY INTO TEMP Nur die Klauseln SELECT und FROM sind erforderlich, der Rest ist optional. Es bedeuten <Spalten-1> Bezeichnungen der Spalten, die ausgegeben werden <Tabellen> Bezeichnung der verwendeten Tabellen <Bedingung-1> Auswahlbedingung f ur die auszugebenden Zeilen verwendet AND, OR, NOT, =, >, <, !=, <=, >=, IS NULL, BETWEEN, MATCHES <Spalten-2> <Bedingung-2> <Spalte-3> <Tabelle> Bezeichnungen der Spalten, die eine Gruppe denieren. Eine Gruppe bzgl. Spalte x sind diejenigen Zeilen, die bzgl. x identische Werte haben. Bedingung zur Auswahl einer Gruppe Ordnungsreihenfolge fur Spalten-1 Name einer neu angelegten temporaren Datei, die das Ergebnis der Query enthalt Vor <Spalten-1> kann das Schlusselwort UNIQUE stehen, welches identische Ausgabezeilen unterdruckt. Aggregate Functions konnen uberall dort stehen, wo Konstanten erlaubt sind. Es liefert COUNT (*) Anzahl der Zeilen COUNT (DISTINCT x) Anzahl der verschiedenen Werte in Spalte x SUM (x) Summe der Werte in Spalte x SUM (DISTINCT x) Summe der verschiedenen Werte in Spalte x AVG (x) Durchschnitt der Werte in Spalte x AVG (DISTINCT x) Durchschnitt der verschiedenen Werte in Spalte x MAX (x) Maximum der Werte in Spalte x MIN (x) Minimum der Werte in Spalte x jeweils bezogen auf solche Zeilen, die die WHERE-Bedingung erfullen. Null-Eintrage werden bei AVG, MIN, MAX und SUM ignoriert. 87 Beispiel-Queries fur das Schema mit den Relationen STUDENT VORLESUNG HOERT (NACHNAME, VORNAME, MAT NR, GEB DAT, FACH) (VOR NR, TITEL, UMFANG) (MAT NR, VOR NR) 1. Liste alle Zeilen mit samtlichen Spalten aus der Tabelle Student: select * from student 2. Liste Nachname, Vorname, Fach aus der Tabelle Student sortiere nach Nachname, Vorname: select nachname, vorname, fach from student order by nachname, vorname 3. Liste alle Facher: select unique fach from student 4. Liste Vorlesungstitel mit Umfang zwischen 2 und 4 Stunden: select * from vorlesung where umfang between 2 and 4 5. Liste Studenten, die keine Geburtstagsangabe haben: select nachname from student where geb_dat is null 6. Liste Studenten, deren Name mit W anfangt: select * from student where nachname matches "W*" 7. Liste Vorlesungstitel mit Umfang in Minuten: select titel, umfang*45 Minuten from vorlesung 8. Bestimme Anzahl der Studenten, die Mathematik studieren: select count(*) from student where fach = "Mathe" 88 9. Bestimme minimalen, maximalen, durchschnittlichen, summierten Stundenumfang der Vorlesungen: select min(umfang), max(umfang), avg(umfang), sum(umfang) from vorlesung 10. Liste Studenten mit Geburtsdatum und Alter: select nachname, geb_dat, (today - geb_dat)/ 365 Alter from student order by alter 11. Liste die Sonntagskinder: select * from student where weekday(geb_dat)=0 12. Liste Studentennamen zusammen mit ihren Vorlesungsnummern: select nachname, vor_nr from student, hoert where student.mat_nr = hoert.mat_nr order by nachname 13. Liste Studentennamen zusammen mit ihren Vorlesungstiteln: select nachname, titel from student, hoert, vorlesung where student.mat_nr = hoert.mat_nr and hoert.vor_nr = vorlesung.vor_nr order by nachname 14. Liste Studenten, die dasselbe Fach studieren wie Willi Wachtel: select y.nachname, y.vorname, y.fach from student x, student y where y.fach = x.fach and x.nachname = "Wachtel" and x.vorname = "Willi" and (y.nachname != x.nachname or y.vorname != x.vorname) 15. Liste Name und Geburtsdatum des altesten Studenten: select nachname, vorname, geb_dat from student where geb_dat = (select min(geb_dat) from student) 89 16. Liste Name und Geburtsdatum des zweitaltesten Studenten: select nachname, vorname, geb_dat from student where geb_dat = ( select min(geb_dat) from student where geb_dat > (select min(geb_dat) from student) {aeltestes Geburtsdatum} ) 17. Liste Facher zusammen mit Anzahl der Studenten: select fach, count (*) Anzahl from student group by fach 18. Liste fur jedes Fach das Geburtsdatum des Fachaltesten: select fach, min(geb_dat) Geburtsdatum from student group by fach 19. Liste Vorlesungen mit mehr als 10 Teilnehmern zusammen mit der Teilnehmerzahl: select titel, count(*) Hoerer from hoert, vorlesung where hoert.vor_nr = vorlesung.vor_nr group by titel having count(*) > 10 20. Liste Facher mit Durchschnittsalter groer als 25: select fach, avg(today-geb_dat)/365 Durchschnittsalter from student group by fach having avg(today-geb_dat)/365 > 25 90 21. Liste alle Studenten des Faches mit dem kleinsten Durchschnittsalter: select nachname, fach, geb_dat from student where fach = ( select fach from student { Fach mit kleinstem Durchschnittsalter } group by fach having avg(today-geb_dat) <= all (select avg(today - geb_dat) from student group by fach ) { alle Durchschnittsalter} ) 22. Liste alle Fachaltesten, fulle zunachst Facher und Geburtsdaten der Fachaltesten in temporare Relation facher: select fach, min(geb_dat) geb_dat from student group by fach into temp faecher Verbinde dann die Relation student mit der temporaren Relation facher: select nachname, vorname, student.fach, student.geb_dat from student, faecher where student.fach = faecher.fach and student.geb_dat = faecher.geb_dat Entferne temporare Relation: drop table faecher 23. Liste alle Studenten, die nicht die Vorlesung Internet-Dienste horen: select nachname from student where mat_nr not in (select hoert.mat_nr from hoert, vorlesung where vorlesung.titel = "Internet-Dienste" and hoert.vor_nr = vorlesung.vor_nr ) 24. Entferne die Vorlesung Textverarbeitung aus der Tabelle Vorlesung: delete from vorlesung where titel= "Textverarbeitung" 91 25. Losche den gesamten Inhalt von Tabelle Student und von Tabelle hort: delete from student delete from hoert 26. Fuge die Veranstaltung Textverarbeitung in die Tabelle Vorlesung ein: insert into vorlesung values ("6754", "Textverarbeitung",2) 27. Fuge in die Relation student alle Tupel aus der Datei \student.doc" ein: load from "student.doc" insert into student 28. Alle Studenten sollen Datenbanksysteme horen: insert into hoert select mat_nr, vor_nr from student, vorlesung where titel = "Datenbanksysteme" 29. Alle Systemwissenschaftler horen Internet-Dienste: insert select where and into hoert mat_nr, vor_nr from student, vorlesung fach = "System" titel = "Internet-Dienste" 30. Erika Mustermann soll alle Veranstaltungen horen. Hierzu werden zunachst ihre schon vorhandenen Vorlesungsnummern in der temporaren Relation mustermann vor nr gespeichert: select vor_nr from student, hoert where nachname = "Mustermann" and vorname = "Erika" and student.mat_nr = hoert.mat_nr into temp mustermann_vor_nr Dann werden alle Vorlesungsnummern, die nicht schon in der temporaren Relation stehen, zusammen mit Mustermanns Matrikelnummer in die Tabelle hort eingefugt: insert into hoert select mat_nr, vor_nr from student, vorlesung where nachname = "Mustermann" and vorname = "Erika" and vor_nr not in (select vor_nr from mustermann_vor_nr) 92 Zum Schlu wird die temporare Tabelle entfernt: drop table mustermann_vor_nr 31. A ndere das Geburtsdatum von Willi Wachtel: update student set geb_dat = date("06/27/65") where nachname = "Wachtel" and vorname = "Willi" 32. Schreibe alle Tupel der Relation student in die Datei \student.doc": unload to "student.doc" select * from student 33. Deniere eine Sicht, bestehend aus Vorlesungstiteln und Horerzahlen: create view hoerer (titel, hoererzahl) as select titel, count(*) from hoert, vorlesung where hoert.vor_nr = vorlesung.vor_nr group by titel Die Sicht kann wie eine Tabelle verwendet werden: select * from hoerer where ... 34. Deniere eine Sicht systies als Teilmenge der Studenten, die Systemwissenschaften studieren: create view systies as select * from student where fach="System" 35. Deniere eine Sicht dbsysties als Teilmenge der Studenten, die Systemwissenschaften studieren und Datenbanksysteme horen: create view dbsysties as select nachname, vorname, geb_dat, student.mat_nr, fach from student, hoert, vorlesung where fach = "System" and student.mat_nr = hoert.mat_nr and hoert.vor_nr = vorlesung.vor_nr and vorlesung.titel= "Datenbanksysteme" 93 36. Liste Informationen auf ... info tables info columns for student { { { { { { info indexes for student info access for student info status for student alle Tabellen der Datenbank } alle Spalten zur Tabelle student } mit Bezeichnung, Typ, Null/nichtnull } Indexinformationen zur Tabelle student} Zugriffsrechte zur Tabelle student } Besitzer, Anzahl der Eintraege, ... } 37. Bestimme die drei haugsten Vornamen der Tabelle student. Schicke hierzu den Output einer Query als Input in ein Shellkommando. Idee: Sortiere, zahle Doppel, sortiere absteigend, ltere die ersten drei. output to pipe "sort | uniq -c | sort -r | head -3" without headings { ohne Tabellenkopf select vorname from student { Liste Vornamen 94 } } { statistik.ace: { { { { database uni end script zum Erstellen eines Reports mit Angaben zu Fach, Nachname, Vorname, Geburtsdatum und Vermerk, ob der Geburtstag auf einem Sonntag liegt Pro Fachgruppe wird das Fach nur einmal gelistet Uebersetzen erzeugt statistik.arc { verwende Datenbank uni } } } } } } output report to "statistik.doc" page length 70 { schreibe nach "statistik.doc" } { 70 Zeilen pro Seite } nachname, vorname, mat_nr, geb_dat, fach from student order by fach { { { { { { { { end select erzeuge Tabelle mit SQL-Query Nachname Vorname Matrikelnummer Geburtsdatum Studienfach aus der Relation student sortiert nach Faechern end format { es folgen Formatangaben first page header { Kopfzeile print "Studentenstatistik vom ", today using "dd. mmm yy" { Tagesdatum skip 2 lines { zwei Leerzeilen before group of fach { vor jedem Fachwechsel print fach { drucke Fach ohne Vorschub on every row { fuer jede selektierte Zeile print column 18, nachname, { drucke Nachname in Spalte 18 column 30, vorname { drucke Vorname in Spalte 30 if weekday(geb_dat)=0 { falls Geburtstag ein Sonntag then print " *" { drucke Stern else print " " { sonst drucke Leerzeichen after group of fach { nach jedem Fachwechsel print "---------------------------------------------" on last row { am Reportende print column 27, "Sonntagskinder: ", { drucke in Spalte 27 count where weekday(geb_dat)=0 { die Zahl der Sonntagskinder using "##" { als zweistellige Integer end { Ende der Reportbeschreibung 95 } } } } } } } } } } } } } } } } } } } } } } } } } } { student.per: Maske zum Eingeben von Daten in die Relation student { Uebersetzen erzeugt student.frm { Mit der Maske koennen Datensaetze gesucht, manipuliert { und geloescht werden database uni screen size 24 by 80 { Nachname f000 ] Vorname f001 ] Matrikelnummer f002 ] Geburtsdatum f003 ] Studienfach f004 ] Mathe = Mathematik Physik = Physik System = angewandte Systemwissenschaften Gast = Gasthoerer CL&KI = Computerlinguistik & Kuenstliche Intelligenz } } } } } end tables student attributes f000 = student.nachname f001 = student.vorname f002 = student.mat_nr, { include=("200000" to "999999") { f003 = student.geb_dat, { comments = "Format: MM/TT/JJ" { f004 = student.fach, { include = ("Mathe","Physik", "System","Gast","CL&KI") end 96 zugelassen sind Strings zwischen 200000 und 999999 Kommentar erscheint am unteren Bildschirmrand zulaessige Werte fuer fach } } } } } { verbund.per: { Maske zur Manipulation der Daten aus den Relationen student, hoert, vorlesung } } database uni screen size 24 by 80 { Nachname Vorname Matrikelnummer Geburtsdatum Studienfach f000 f001 f002 f003 f004 ] Vorlesungsnummer Vorlesungstitel Vorlesungsumfang } end f007] f008 f009 ] ] ] ] ] ] tables student hoert vorlesung { { { { attributes f000 = student.nachname f001 = student.vorname f002 = *student.mat_nr = hoert.mat_nr beteiligt sind die Tabellen Student hoert Vorlesung { angezeigte Attribute: { Nachname { Vorname { Matrikelnummer, als join { zwischen student und hoert f003 = student.geb_dat { Geburtsdatum f004 = student.fach { Studienfach f007 = *vorlesung.vor_nr=hoert.vor_nr { Vorlesungsnummer, als join f008 = vorlesung.titel { Vorlesungstitel f009 = vorlesung.umfang { Vorlesungsumfang instructions { Anweisungen zum Blaettern der Seiten student master of hoert { zu einem Student koennen mehrere hoert master of vorlesung { Vorlesungen durchlaufen werden end 97 } } } } } } } } } } } } } } } } } 7 Funktionale Abhangigkeiten 7.1 Armstrong-Axiome Gegeben sei eine Relation R. Nicht alle Auspragungen sind moglich wegen 1. Beschrankung durch Semantik der Wertebereiche, z.B. Gewicht, Groe, Geburtsdatum (dieses ist ohne Einu auf den Entwurf der Relationenschemata) 2. Beschrankung durch Abhangigkeiten zwischen den Attributen (dies hat Einu auf den Entwurf der Relationenschemata) Def.: Sei R(A1 A2 : : : Ak ) ein Relationenschema. Seien X Y fA1 A2 : : : Ak g. Wir sagen \Y ist funktional abhangig von X" oder \X bestimmt Y " (Schreibweise X ! Y ) , fur jede Auspragung r 2 R, 8s t 2 r : X (s) = X (t) ) Y (s) = Y (t). Funktionale Abhangigkeit bedeutet also: sind zwei Tupel bzgl. X gleich, so sind sie auch bzgl. Y gleich. Wichtig: diese Eigenschaft mu immer gelten, nicht nur fur die momentane Auspragung r. Funktionale Abhangigkeit entsteht durch die Bedeutung der Attribute. Beispiel: Gegeben sei eine Relation mit der momentanen Auspragung Meier Rheine Lehmann Dortmund Schulz Bremen trotzdem gilt nicht Ort ! Name Zur Schreibweise: Statt fA B C g schreiben wir ABC. Beispiel: Gegeben das Relationenschema R (city, street, zip), welches die (amerikanischen) Postleitzahlen enthalt. Es gelten die funktionalen Abhangigkeiten city street zip city ! ! zip da mehrere Straen eines Bezirks zu einem ZIP-Code zusammengefat sind. Def.: Sei F eine Menge von funktionalen Abhangigkeiten fur das Relationenschema R. F impliziert X ! Y (Schreibweise F j= X ! Y ), falls jede Relation r 2 R, die F erfullt, auch X ! Y erfullt. 98 Def.: F + := fX ! Y jF j= X ! Y g Beispiel: Sei R(A B C) F = fA ! B B ! C g ) F + := fABC ! AB AB ! BC BC ! B : : :g Gesucht: Inferenzregeln, um von F zu F + zu gelangen. Armstrong-Axiome Gegeben Relationenschema R mit Attributmenge U, Abhangigkeiten F. A1) Reexivitat: Aus Y X U folgt X ! Y . A2) Erweiterung: Aus X ! Y folgt XZ ! Y Z fur Z U. A3) Transitivitat: Aus X ! Y Y ! Z folgt X ! Z. Beispiel: Zeige: \ Alles ist von zip street funktional abhangig" 1. zip ! city (gegeben) 2. zip street ! city street (Erweiterung von 1. mit street) 3. city street ! zip (gegeben) 4. city street ! city street zip (Erweiterung von 3. mit city 5. zip street ! city street zip (Transitivitat von 2. + 4.) Behauptung: Armstrong Axiome sind \sound" und \complete" (nichts ist falsch) (nichts fehlt) Beweis fur \sound": Reexivitat ist \sound" (Y X ) X ! Y ): 2 Tupel, die bzgl. X ubereinstimmen, stimmen auch bzgl. jeder Teilmenge von X uberein. Erweiterung ist \sound" (X ! Y ) XZ ! Y Z): Annahme: 2 Tupel stimmen bzgl. XZ uberein, aber nicht bzgl. Y Z. Dann mussen sie bzgl. Y dierieren. Widerspruch, da X ! Y . Transitivitat ist \sound" (X ! Y Y ! Z ) X ! Z): Annahme: 2 Tupel stimmen bzgl. X uberein, aber nicht bzgl. Z. Wenn sie bzgl. 99 ) street Y nicht ubereinstimmen, ist X ! Y verletzt, wenn sie bzgl. Y uberereinstimmen, ist Y ! Z verletzt. Daher: Widerspruch. Es gibt weitere Axiome, die aus A1 ; A3 abgeleitet werden konnen A4: Aus X ! Y X ! Z folgt X ! Y Z (Vereinigung) A5: Aus X ! Y WY ! Z folgt XW ! Z (Pseudotransitivitat) A6: Aus X ! Y Z Y folgt X ! Z (Zerlegung) Def.: Gegeben Relationenschema R, Attributmenge U, Abhangigkeiten F . Sei X U. Der Abschlu einer Attributmenge X wird deniert als X + := fY 2 U jX ! Y folgt aus Armstrongaxiomen angewandt auf F g Lemma: Gegeben eine Menge F von funktionalen Abhangigkeiten. X ! Y folgt aus Armstrongaxiomen , Y X + Beweis: (() Sei Y = A1A2 : : :An X + . Nach Denition von X + gilt: X ! Ai folgt aus Armstrongaxiomen fur i = 1 : : : n. Nach Axiom A4 (Vereinigung) folgt X ! A1 : : :An, d.h. X ! Y . ()) Es folge X ! Y aus den Armstrongaxiomen. Nach der Zerlegungsregel gilt X ! Ai fur i = 1 : : : n. Daraus folgt Y X + . D.h., um festzustellen, ob X ! Y aus den Armstrongaxiomen folgt, testet man, ob Y in X + liegt. Beweis fur \complete": Sei F eine Menge von funktionalen Abhangigkeiten uber Attributmenge U und sei X ! Y nicht ableitbar aus den Axiomen. Zeige: F impliziert nicht X ! Y . D.h. nde Relation r, die F erfullt, aber X ! Y nicht. Betrachte Relation r mit 2 Tupeln Attribute z }| von{ X 1 1 1 ::: 1 1 1 1 :::1 + andere z }|Attribute { 1 1 1 : : :1 0 0 0 : : :0 Zu zeigen a) alle Abhangigkeiten von F sind erfullt durch r: Annahme: V ! W 2 F sei nicht erfullt ) V X + , denn sonst wurden die beiden Tupel von r bzgl. V dierieren und konnten V ! W nicht verletzen. Auerdem W 6 X + , denn sonst ware V ! W durch r erfullt. Sei daher A ein Attribut aus W, das nicht in X + liegt. 100 Da V X + ) X ! V ist ableitbar mit Armstrong ) X ! V 2 F + (Lemma) (sound) auerdem: auerdem: also: dann ware V !W 2F W ! A (Reexivitat) X ! A (Transitivitat) A 2 X + . Widerspruch! Also: Jede funktionale Abhangigkeit V ! W ist erfullt. b) Zu zeigen: X ! Y wird von r nicht erfullt Annahme: X ! Y sei erfullt von r Es gilt X X + , daraus folgt Y X + , denn sonst ist die Abhangigkeit durch die beiden Tupel verletzt (auf X identisch, auf Y nicht). Aus Y X + folgt (wg Lemma): X ! Y ist mit Armstrong ableitbar. Widerspruch zu \sei X ! Y nicht aus den Axiomen ableitbar". Also: Annahme falsch, d.h. X ! Y wird von r nicht erfullt. Aus a + b folgt: Wenn X ! Y nicht mit den Armstrong-Axiomen aus F ableitbar ist, dann impliziert F die Abhangigkeit X ! Y auch nicht. Also: Armstrong Axiome sind sound. Korollar: X + = fY jF impliziert X ! Y g Korollar: F + = fX ! Y jX ! Y ist aus F mit den Armstrong-Axiomen ableitbarg. Gegeben sei F , und gegeben sei die Frage \Gilt X ! Y ?" Es ist unklug, F + aus F zu berechnen und dann auf X ! Y zu testen. Denn sei F = fA ! B1 A ! B2 : : : A ! Bn g ) F + enthalt 2n Elemente. Besser (und korrekt wegen Lemma): Berechne X + und teste, ob Y 2 X + . Algorithmus zur Bestimmung von X + : Input: Menge F von funktionalen Abhangigkeiten uber Attributmenge U, Teilmenge X U. Output: X + Bestimme X 0 X 1 X 2 : : : wie folgt: X 0 := X X i+1 := X i Z, falls Y ! Z 2 F Y X i (d.h. suche Regel in F, deren linke Seite in X i enthalten ist, nimm rechte Seite hinzu). Abbruch, wenn X i+1 = X i 101 Beispiel: Sei U Sei F Sei X X0 X1 X2 X3 Also: (BD)+ = fA B C D E Gg = fAB ! C C ! A BC ! D ACD ! B D ! EG BE ! C CG ! BD CE ! AGg = fB Dg = BD = BDEG = BCDEG = ABCDEG = X 4 , Abbruch. = ABCDEG Ein ezienter Algorithmus zur Bestimmung von X + speichert die bereits erreichten Attribute in einem boole'schen array und die Nummern der inzwischen anwendbaren Regeln in einer Schlange. Genauer: Numeriere alle Regeln. Initialisiere fur jedes Attribut eine Liste der Regeln, in denen es auf der linken Seite vorkommt. Initialisiere fur jede Regel einen Zahler mit der Anzahl der noch fehlenden Attribute (unter Berucksichtigung der Startmenge X). Regelnummern mit Zahlerstand 0 werden in Schlange ubernommen. Solange Schlange nicht leer ist: Entferne Regel aus Schlange Fur jedes Attribut A der rechten Seite: erweitere X um A fur jede Regel aus der Liste von A erniedrige den Zahler falls Zahler auf 0 springt, ubernimm Regelnr. in Schlange Die Laufzeit betragt O(jF j). 102 Attribut Regeln Zähler 1: AB ! C 1 2: C ! A 1 B 3: BC ! D 1 C 4: ACD ! B 2 D 5: D ! EG 0 E 6: BE ! C 1 7: CG ! BD 2 A G 8: CE ! AG 2 bisher erreichbare Attribute BD Schlange: 5 Beh.: Algorithmus berechnet X + 1. wenn A in X j plaziert wird, so gehort A zu X + Induktion uber j. j = 0 ) X0 X+ Sei bis j bewiesen, d.h. X j X + . Kommt nun Z in X j +1 wegen Regel Y ! Z und Y X j , so ist das korrekt wegen Transitivitat. 2. Sei A 2 X + , so gilt: es gibt j : A 2 X j Zeige: Lat sich X ! Y aus F ableiten, so gilt Y X j . Fuhre dazu Induktionsbeweis uber die Lange der Ableitung (Armstrong Schritte) 103 Def.: Zwei funktionale Abhangigkeitsmengen F G sind aquivalent, falls F + = G+ . Zum Testen, ob F + = G+ : Fur jede Abhangigkeit X ! Y 2 F teste, ob X ! Y 2 G+ , d.h. teste, ob Y X + bzgl. G. Def.: Eine Menge von funktionalen Abhangigkeiten heit minimal , 1. Jede rechte Seite hat nur ein Attribut. 2. Weglassen einer Abhangigkeit aus F verandert F + . 3. Weglassen eines Attributs in der linken Seite verandert F + . Konstruktion der minimalen Abhangigkeitsmenge geschieht durch Aufsplitten der rechten Seite und durch probeweises Entfernen von Regeln bzw. von Attributen auf der linken Seite. Beispiel: Sei U = f A B C D E Gg Sei F = f AB ! C, D ! EG C ! A, BE ! C, BC ! D, CG ! BD, ACD ! B, CE ! AG g Aufspalten der rechten Seiten liefert AB ! C C ! A BC ! D ACD ! B D ! E D ! G BE ! C CG ! B CG ! D CE ! A CE ! G Regel CE ! A CG ! B ist redundant wegen ist redundant wegen C CG C ACD Regel ACD ! B kann gekurzt werden zu CD 104 ! ! ! ! ! A D A B B, wegen C ! A 7.2 Normalformen Problemstellung: Entwurf der Relationenschemata Frage: Was ist ein guter Entwurf? Zunachst: Beispiel fur schlechten Entwurf: Gegeben sei das Relationenschema Grosshandel (Name, Adresse, Best Nr, Ware, Preis) mit folgenden Bedeutungen: Name: Name des Lieferanten Adresse: Adresse des Lieferanten Best nr: Bestellnummer der Ware Ware: Bezeichnung der Ware Preis: Preis der Ware Folgende Eekte sind zu beobachten: Redundanz: Adresse ist mehrfach gespeichert. Update Anomalie: Adresse wird nicht uberall geandert. Insertion Anomalie: Lieferant kann nur eingefugt werden, wenn er mindestens einen Artikel liefert. Oder: einige Attribute auf 0 setzen, gibt Probleme, wenn sie Teil des Schlussels sind. Deletion Anomalie: Beim Loschen der letzten Ware eines Lieferanten verschwindet der Lieferant. Besser: Lieferant (Name, Adresse) Lieferbar (Name, Best Nr, Ware, Preis) Gro$handel = Lieferant * Lieferbar Es gilt: . Fazit: Probleme entstehen durch funktionale Abhangigkeiten. Def.: Sei R(A1 : : : An ) ein Relationenschema, seien X Y (A1 : : : An). Eine Attributmenge Y heit voll funktional abhangig von X , X ! Y und 8X 0 X : X 0 6! Y Eine Attributmenge X heit Schlusselkandidat , A1 : : : An ist voll funk- tional abhangig von X. Ein Attribut A heit Primarattribut , A kommt in mindestens einem Schlusselkandidaten vor. A heit Nichtprimarattribut , A kommt in keinem Schlusselkandidaten vor. Def.: Eine Relation R ist in 1. Normalform (1. NF.) , jedes Tupel enthalt nur atomare Komponenten, d.h. kein Attribut besteht aus zusammengesetzten Werten. 105 Def.: Eine Relation R ist in 2. Normalform nach Codd , 1.) R ist in 1. NF 2.) Jedes Nichtprimarattribut ist voll funktional abhangig von jedem Schlusselkandidaten. Etwas scharfer: Def.: Eine Relation R ist in 2. Normalform nach Kent , 1.) R ist in 1. NF 2.) Jedes Attribut im Komplement eines Schlusselkandidaten ist von diesem Schlusselkandidaten voll funktional abhangig. Idee: |A1 :{z: :Ak} A | k+1{z: : :An} Primarattribute Nichtprimarattribute voll funktional abhangig, d.h. nicht von Teilen des Schlussels abhangig Satz: R in 2. NF nach Kent ) R in 2. NF nach Codd Beweis: Sei R in 2. NF nach Kent. Jedes Nichtprimarattribut liegt im Komplement jedes Schlusselkandidaten (da es in keinem Schlussel vorkommt), also (2. NF Kent) ist es von diesem Schlusselkandidaten voll funktional abhangig, also 2. NF Codd. Satz: R in 2. NF nach Codd 6) R in 2. NF nach Kent Gegenbeispiel: R (Vorlesung, Dozent, Termin, Raum) Algorithmen Datenbanksysteme Datenbanksysteme Graphenalgorithmen Seehusen Vornberger Vornberger Vornberger Mo, Mo, Di, Do, 14:15 14:15 16:15 14:15 32/102 31/449 31/449 31/449 Die Schlusselkandidaten lauten: Vorlesung Dozent Raum Termin Termin Termin Also gibt es keine Nichtprimarattribute, also liegt 2. NF nach Codd vor. Aber: liegt im Komplement des Schlusselkandidaten Vorlesung Termin und ist nicht voll funktional abhangig davon (es gilt Vorlesung ! Dozent). Die Relation Grosshandel ist nicht in 2. NF nach Codd (und daher auch nicht nach Kent), da Adresse nicht voll funktional abhangig ist vom einzigen Schlusselkandidaten Name Best Nr. Aber: Lieferant und Lieferbar sind beide in 2. NF nach Kent (und somit auch nach Codd): Ware Preis sind voll funktional abhangig von Name Best Nr. und Adresse ist voll funktional abhangig von Name. Dozent 106 Bemerkung: Relationen mit atomarem Schlussel sind immer in 2. NF nach Kent und nach Codd. Beispiel: Student (Mat Nr, Fachbereich, Dekan) ist in 2. NF nach Kent und nach Codd. Aber: es bestehen Abhangigkeiten zwischen den Nichtprimarattributen, z.B. Dekan hangt vom Fachbereich ab. D.h. bei Dekanswechsel mussen mehrere Tupel geandert werden. Def.: Seien X Y Z Mengen von Attributen eines Relationenschemas R mit Attributmenge U. Z heit \transitiv abhangig" von X, falls gilt X \Z = 9 Y U : X \ Y = Y \ Z = X ! Y ! Z Y 6! X Beispiel: Dekan ist transitiv abhangig von Mat Nr: ! Mat Nr 6 Fachbereich ! Dekan. Def.: Eine Relation R ist in 3. NF nach Codd , 1.) R ist in 2. NF nach Codd. 2.) Jedes Nichtprimarattribut ist nicht-transitiv abhangig von jedem Schlusselkandidaten. Def.: Eine Relation R ist in 3. NF nach Kent , 1.) R ist in 2. NF nach Kent. 2.) Jedes Attribut im Komplement eines Schlusselkandidaten ist nichttransitiv abhangig von diesem Schlusselkandidaten. Satz: R in 3. NF nach Kent ) R in 3. NF nach Codd. Beweis: Sei R in 2. NF nach Kent. Jedes Nichtprimarattribut liegt im Komplement jedes Schlusselkandidaten und ist (wegen 3. NF Kent) nicht-transitiv abhangig von ihm. Also sind alle Nichtprimarattribute nicht-transitiv abhangig von allen Schlusselkandidaten. Satz: R in 3. NF nach Codd 6) R in 3. NF nach Kent Gegenbeispiel: R (Vorlesung, Dozent, Termin, Raum) Es gibt keine Nichtprim arattribute ) 3. NF nach Codd. ! Aber: Termin Raum 6 Vorlesung ! Dozent, d.h. das Attribut Komplement des Schlussels Raum Termin Dozent ist transitiv von ihm abhangig. im Beobachtung: Um Relationen in 3. Normalform zu erhalten, ist haug eine starke Aufsplittung erforderlich. Dies fuhrt naturlich zu erhohtem Aufwand bei Queries, da ggf. mehrere Verbundoperationen erforderlich werden. 107 8 Das objektorientierte Konzept 8.1 Schwachen von relationalen Systemen Die Relation Buch (ISBN, Verlag, Titel, Autor, Version, Stichwort) erfordert bei 2 Autoren, 5 Versionen, 6 Stichworten fur jedes Buch 2 5 6 = 60 Eintrage. Aufsplittung ergibt Buch Autor Version Stichwort (ISBN, (ISBN, (ISBN, (ISBN, Titel, Verlag) Name, Vorname) Auflage, Jahr) Stichwort) Astra GL: Astra GS: Golf L: Golf GT: fRadio, ZVg fRadio, Alu-Felgen, Airbagg fSSD, ZVg fAllradg Nachteil: Informationen zu einem Buch sind auf vier Tabellen verteilt. Beim Einfugen eines neuen Buches mussen mehrmals dieselbe ISBN eingegeben werden. Die referentielle Integritat mu selbst uberwacht werden. Query Liste Bucher mit den Autoren Meier und Schmidt ist umstandlich zu formulieren. Query Liste Bucher mit ihren Stichworten fuhrt zu Verbund, bei dem Bucher ohne Stichworte herausfallen. Sets of sets: Ein Autotyp habe mehrere Ausstattungspakete, jedes Paket hat mehrere Komponenten. Typ Astra GL Astra GS Golf L Golf GT Die Relation Paket 1 2 3 4 Paket 1 1 2 2 2 3 3 4 Inhalt Radio ZV Radio Alu-Felgen Air-Bag SSD ZV Allrad verlangt die Tabellen Person (Name, Ort, Stra$e, Hobbies) Person (Name, Ort, Stra$e) Hobbies (Name, Ort, Stra$e , Hobby) und | {z } dient als Schlussel Wiesenweg> seinen Wohnsitz, so gehen seine Hob- A ndert <Meier, Hamburg, bies verloren. Fur die Relation Person (Name, Vorname, Ort, Stra$e, Vater) fuhrt die Query Liste Vorname des Vaters von Erika Mustermann in SQL zu einem SelfJoin oder einer Subquery. 108 8.2 Objektorientierte Programmierung Historie: 1940 1950 1960 1970 1980 Beispiel: Maschinenprogrammierung Assembler Hohere Programmiersprachen Strukturierte Programmierung Objektorientierte Programmierung class Geo type tuple (x: real, y: real, z: real) method zeichne end class Kugel inherit geo type tuple (radius: real) method zeichne end method body zeichne in class Kugel { /* zeichnet Kugel unter Verwendung von x, y, z, radius */ } var g : Geo k : Kugel k = new Kugel g = k g->zeichne Objekte einer Klasse werden charakterisiert durch ihre Datenstruktur und durch die auf ihnen zugelassenen Methoden. Der Aufbau einer Klasse kann vererbt werden (Spezialisierung/Verallgemeinerung). U berladen von Methoden verlangt dynamisches Binden. 109 8.3 Objekt-Identitat Jedes Objekt erhalt bei Eintritt ins System einen eindeutigen Objekt-Identier (OID). Der OID bleibt dem Anwender verborgen, er ist unveranderlich und unabhangig vom momentanen Objekt-Inhalt. Er dient auch zum Verwalten von Objekt-Beziehungen. Die momentane physikalische Adresse eines Objekts ergibt sich aus dem Inhalt einer Tabelle, die mit dem OID referiert wird. Manche OODatenbanksysteme verlangen, da selbst konstante Werte als Objekt dargestellt werden einfacher ist es, zwischen Objekten (mit OIDs) und Werten (ohne OIDs) zu trennen. 8.4 Objekt-Struktur Beginnend mit den atomaren Typen (z.B. boolean, character, integer, real, string) werden unter Verwendung von Konstruktoren (z.B. atom, tuple, list, set) hierarchisch strukturierte Objekte geformt. Ein Objekt besteht somit aus einem Tripel < i c v >, wobei i der eindeutige Objekt-Identier ist, c der verwendete Konstruktor und v der Wert des Objekts. Ist c = atom so enthalt v einen atomaren Wert. Ist c = tuple, so besteht der Wert v aus einer Folge von Paaren < ai oi > wobei ai ein Attributname und oi der zugehorige Objekt-Identier ist. Ist c = list oder c = set, so besteht der Wert v aus einer Folge von OIDs. Neben strukturierten Objekten gibt es auch strukturierte Werte, die durch dieselben Konstruktoren entstehen (aber keine OIDs besitzen). titel: "Selber atmen", tuple autor: version: list list tuple vorname: "Peter, nachname: "Pan", adresse tuple tuple vorname: "Willi", nachname: "Wacker", adresse tuple auflage: 1, jahr: 1991 tuple auflage: 2, jahr: 1995 strasse: "Heuweg 2", plz: "12100", ort: "Berlin" tuple strasse: "Ostallee 10", plz: "26131", ort: "Oldenburg" Ausschnitt aus der Verzeigerungsstruktur fur ein Objekt der Klasse Buch 110 Notation in O2: class Buch public type tuple ( isbn verlag titel autor version : : : : : string, Verlag, string, list (Person), list (tuple ( auflage : integer, jahr : integer ) ), stichwort: set (string) ) end class Verlag public type tuple ( name : string, adresse : Adresse ) end class Adresse public type tuple (strasse: string, plz : string, ort : string ) end class Person public type tuple ( vorname nachname adresse geb_dat geschlecht photo partner kinder ) end : : : : : : : : string, string, Adresse, Date, char, Bitmap, Person, list(Person) 111 Die Sichtbarkeit der Attribute variiert von \nicht sichtbar" uber \nur lesbar" zu \veranderbar": private gehalt: real, /* nicht sichtbar */ read nachname: string, /* lesbar */ public project: string, /* veraenderbar */ Fur die Modellierung von isa-Beziehungen bietet sich die Vererbung an: class Student inherit Person public type tuple (/* zusaetzliche Attribute */) Fur die Modellierung von many-one-Beziehungen bietet sich ein mengenwertiges Attribut an: class Buch type tuple ( . . . vorgemerkt von: set (Person), . . . ) end class Student type tuple ( . . . vorgemerkt: set (Buch), . . . ) 112 8.5 Persistenz Es wird zwischen transienten und persistenten Objekten unterschieden. Transiente Objekte existieren nur wahrend der Laufzeit des Anwendungsprogramms und verschwinden nach der Terminierung (wie eine Variable). Persistente Objekte uberdauern einzelne Programmlaufe und werden in der Datenbank gespeichert. Objekte werden persistent durch die Vergabe eines Namens oder indem sie von einem persistenten Objekt erreichbar sind. name alle buecher : set (Buch) o2 Buch b . . . alle buecher = alle buecher + set(b) Jetzt ist auch das Buch b persistent. 8.6 Objekt-Methoden Prozeduren zur Manipulation von Objekten heien Methoden. Innerhalb der Klassendenition taucht nur der Prozedurkopf, genannt Signatur, auf. Separat davon wird die Implementation beschrieben. class Person public type tuple ( ... ) method kind_hinzu (vorname : string, geschlecht : char) end method body kind_hinzu (vorname: string, geschlecht: char) in class Person { o2 Person nb = new Person /* lege Platz fuer neue Person an */ nb->vorname = vorname /* Vorname gegeben durch Parameter */ nb->nachname = self->nachname /* Nachname wird uebernommen */ nb->adresse = self->adresse /* Adresse wird uebernommen */ nb->geb_dat = new Date (0,0,0) /* Geburtstag = heutiges Datum */ nb->geschlecht= geschlecht /* Geschlecht */ self->kinder += list(nb) /* erweitere Menge der Kinder */ personen += set(nb) /* erweitere Menge der Personen */ self->refresh_all /* zeichne Praesentation neu */ if (self->partner != nil) { /* falls Partner vorhanden */ self->partner->kinder+=list(nb)/* dessen Kindermenge erweitern */ self->partner->refresh_all /* auch dort neu zeichnen */ } printf("Kind eingefuegt\n") } 113 Typischerweise wird eine Methode dadurch aufgerufen, da eine entsprechende Nachricht an das Objekt geschickt wird. Zum Beispiel bekommt ein Objekt p vom Typ Person eine Tochter namens Martina durch den Aufruf p->kind hinzu ("Martina", `w'). Die folgende Methode verwendet die aus O2kit importierte Klasse Box zur Auswahl eines Heiratskandidaten: method body heirate: boolean in class Person { o2 Box dialog /* Variable vom Typ Box o2 string ergebnis /* Variable vom Typ String o2 list(string) liste /* Liste von Strings o2 Person p /* Variable vom Typ Person */ */ */ */ dialog = new Box /* lege eine Box an */ for (p in personen) if (p != self) liste += list(p->vorname + " " + p->nachname) /* /* /* /* */ */ */ */ durchlaufe alle Personen uebernimm in Liste die Konkatenation von Vorname und Nachname ergebnis = dialog->selection("Heiratskandidaten:","",liste) if (ergebnis != "") for (p in personen) { if ((ergebnis == p->vorname + " " + p->nachname) && (p->geschlecht != self->geschlecht) && (p->partner == nil)) /* /* /* /* /* /* /* Box */ falls nicht cancel durchlaufe alle Personen suche nach Person mit ergebnis-Vor/Nachnamen anderes Geschlecht und ohne Partner */ */ */ */ */ */ { self->partner = p p->partner = self if (self->geschlecht=='M') p->nachname = self->nachname else self->nachname=p->nachname self->refresh_all self->partner->refresh_all return true } } else return false } 114 /* setze Partnerverweise */ /* trage Familiennamen ein */ /* zeichne Person neu /* zeichne Partner neu */ */ 8.7 Applikation Programme zum Aufruf von Methoden werden in einer Applikation zusammengefat. Die folgende Prozedur verheiraten sucht nach Vorgabe von Vor- und Nachnamen zwei Personen in der benannten Variablen personen und setzt die Partnerverweise entsprechend. transaction body verheiraten(vorname1: string, nachname1: string, vorname2: string, nachname2: string): boolean in application uni { o2 Person x,y /* zwei Personen */ for (x in personen) { if ((x->vorname == vorname1) && (x->nachname== nachname1)&& (x->partner == nil)) { for (y in personen) { if ((y->vorname == vorname2) && (y->nachname== nachname2) && (y->geschlecht != x->geschlecht) && (y->partner == nil)) { y->partner = x x->partner = y if (x->geschlecht=='M') y->nachname = x->nachname else x->nachname = y->nachname y->refresh_all x->refresh_all return true } } } } return false } 115 /* durchlaufe Personen */ /* suche nach Vorname1 /* und Nachname1 /* ohne Partner */ */ */ /* durchlaufe Personen */ /* /* /* /* */ */ */ */ suche Vorname2 und Nachname2 anderes Geschlecht ohne Partner /* setze Partnerverweise */ /* bestimme Familienname */ /* zeichne das display /* beider Personen neu /* Heirat erfolgreich */ */ */ /* Heirat gescheitert */ 8.8 O2 SQL Die Abfragesprache O2 SQL kann als Ergebnis einer Query Werte, strukturierte Tupel oder Objekte zuruckliefern. 1. Liste alle Personen (als Objekte) select p from p in personen 2. Liste das Alter aller Personen (als Wert) select p->alter from p in personen 3. Liste Vorname und Alter aller Personen (als Tupel) select tuple(name : p->vorname, alter: p->alter) from p in personen 4. Liste die Kinder von Willi Wachtel (als Objekte) select p->kinder from p in personen where p->nachname = "Wachtel" and p->vorname = "Willi" 5. Liste die Vornamen der Kinder von Willi Wachtel (als Werte) select q->vorname from p in personen, q in p->kinder where p->nachname = "Wachtel" and p->vorname = "Willi" 6. Liste die Vornamen der Kinder von Willi Wachtel (als Tupel) select tuple(kinder : select k->vorname from k in p->kinder) from p in personen where p->nachname = "Wachtel" and p->vorname = "Willi" 116 7. Liste die Vornamen aller Partner (als Tupel) select tuple(mann: p->vorname, frau: p->partner->vorname) from p in personen where p->geschlecht ='M' and p->partner != nil 8. Liste die Vornamen aller Vater mit den Vornamen ihrer Kinder (als Tupel) select tuple(vater : p->vorname, kinder: select b->vorname from b in p->kinder) from p in personen where p->geschlecht='M' and count(p->kinder) > 0 9. Liste alle Vornamen mit der Anzahl der Kinder (als Tupel) select tuple(vorname: p->vorname, anzahl: count(p->kinder)) from p in personen 10. Liste das Durchschnittsalter der Kinder von Willi Wachtel (als Wert) select avg(select k->alter from k in p->kinder) from p in personen where p->nachname = "Wachtel" and p->vorname = "Willi" 11. Liste alle Vornamen von Personen, die als Buchtitel auftauchen (als Werte) select p->vorname from p in personen, b in buecher where p->vorname = b->titel 12. Bestimme das hochste Alter (als Wert) max(select p->alter from p in personen) 13. Finde die alteste Person (als Objekt) select p from p in personen where p->alter = max(select q->alter from q in personen) 117 14. Gruppiere alle Personen bezuglich ihrer Kinderzahl (als Objekte) group p in personen by (wenig : count(p->kinder) < 2, mittel: count(p->kinder) = 2, viel : count(p->kinder) > 2) 15. Gruppiere alle Personen nach ihren Vornamen (als Objekte) group p in personen by (vorname: p->vorname) 16. Liste zu jedem Vornamen seine Haugkeit (als Tupel) group p in personen by (vorname: p->vorname) with ( anzahl : count(partition)) 17. Liste Vorlesungen von Willi Wachtel (als Objekte) select s->hoert from s in student where s->nachname = "Wachtel" and s->vorname = "Willi" 18. Liste Vorlesungstitel von Willi Wachtel (als Werte) select v->titel from s in student, v in s->hoert where s->nachname = "Wachtel" and s->vorname = "Willi" 118 Das Ergebnis einer Query kann alphanumerisch oder graphisch dargestellt werden. Fur die ersten drei Queries lautet die alphanumerische Antwort: set( Person] Person] Person] ) set( 40 43 52 ) set( tuple( name: Erika alter: 40 ) tuple( name: Willi alter: 43 ) tuple( name: Daniel alter: 52 ) ) 119 9 Synchronisation paralleler Transaktionen 9.1 Transaktionen Bisher: Jetzt: Serieller Zugri auf die Datenbank Paralleler Zugri auf die Datenbank Beispiel: Flugplatzreservierung im Reiseburo 2 Kunden fragen an, Antwort: ja, beide bekommen den letzten Platz Losung: Zusammenfassung nicht-trennbarer Aktionen zu Transaktionen Wechselseitiger Ausschlu (mutual exclusion) Def.: Eine Transaktion ist die Zusammenfassung zusammengehoriger Einzelaktionen Beispiele fur 2 Transaktionen: t1 t2 t1 t2 a b seien Konten desselben Kunden read(a) read(a) read(b) a := a - 1 write(a) read(a) a := a - 1 a := a - 1 read (a) read(b) write(a) write(a) b:= b + 1 write(b) " falsches Ergebnis in a " inkonsistente Sicht bzgl. der Summe der Sparguthaben Also: Erforderlich ist exklusiver Zugri! Def.: Ein Item ist eine Einheit der Datenbank, das mit einem lock fur einen exclusiven Zugri reserviert werden kann (locks vergibt der lock manager). Transaktionen lauten jetzt: lock(a) read(a) a := a - 1 write(a) unlock(a) 120 Bedeutung von lock(a): falls a nicht reserviert: reserviere es fur Aufrufer sonst: blockiere Aufrufer. Bedeutung von unlock(a): lose Reservierung fur a falls jemand durch lock(a) blockiert ist, lose Blockierung und reserviere a fur ihn. Probleme durch locks: 1.) Livelock (Starvation) Eine Transaktion t wartet mit lock(a) ewig, da sich andere Transaktionen mit lock(a), unlock(a) abwechseln. Losung: Bedienung der Warteschlange fur ein Item nach First-Come-FirstServed. 2.) Deadlock t1 t2 lock(a) lock(b) lock(b) lock(a) unlock(b) unlock(a) unlock(a) unlock(b) .. . .. . t1 und t2 warten ewig aufeinander. Losung: z.B. alle locks gleichzeitig beantragen z.B. lineare Ordnung auf Items einfuhren, locks nur in dieser Reihenfolge beantragen z.B. von Zeit zu Zeit im wait-for-graph nach Kreisen suchen und \brutal" auosen wait-for-graph: m Ti m - Tj Ti wartet auf item, das Tj belegt. Im weiteren: weder livelocks noch deadlocks vorhanden Problem jetzt: Verhindern von ungewollten Seiteneekten. 121 9.2 Serialisierbarkeit Def.: Ein Schedule fur eine Menge von Transaktionen ist eine Festle- gung fur die Reihenfolge samtlicher Einzelaktionen (die Reihenfolge der Einzelaktionen einer Transaktion mu naturlich berucksichtigt werden). Def.: Ein Schedule heit seriell, wenn jeweils alle Schritte einer Transaktion unmittelbar hintereinander ablaufen. Def.: Ein Schedule heit serialisierbar, wenn es ein serielles Schedule gibt, das denselben Eekt produziert. seriell: serialisierbar: read(a) a := a-10 write(a) read(b) b := b+10 write(b) read(a) read(b) read(a) a := a-10 b := b-20 write(a) write(b) read(b) read(c) b := b+10 c := c+20 write(b) a := a-10 read(b) write(a) read(b) b := b-20 write(b) read(c) c := c+20 write(c) vorher nacher nicht serialisierbar: a a-10 b b-10 b := b-20 read(b) write(b) b := b+10 read(c) write(b) c := c+20 write(c) write(c) c c+20 a a-10 Wichtig: b b-10 c c+20 a a-10 b b+10 Sei f(a) die Wirkung einer Transaktion T auf a zwischen lock(a) und unlock(a). Dann verursachen fur uns g(f(a)) und f(g(a)) zwei verschiedene Eekte! (auch wenn zufallig f(g(a)) = g(f(a)) sein sollte)! 122 c c+20 Algorithmus zum Testen auf Serialisierbarkeit: Input: Output: Ein Schedule S fur Transaktionen T1 : : : Tk . entweder: \ nein, ist nicht serialisierbar" oder: \ja, ist serialisierbar wie folgt + serielles Schedule" Methode: Bilde gerichteteten Graph, dessen Knoten den Transaktionen entsprechen. Sei Aktion Ti : unlock(x), suche nachste Aktion der Form Tj : lock(x). Bilde Ti - Tj Idee: In jedem seriellen Schedule mu Ti vor Tj kommen. Es gilt: G hat keinen Kreis , S ist serialisierbar, und zwar gema der topologischen Ordnung von G. m Beispiel: T1 : lock (a) T2 : lock (b) T2 : lock (c) T2 : unlock (b) T1 : lock (b) T1 : unlock (a) T2 : lock (a) T2 : unlock (c) T2 : unlock (a) T3 : lock (a) T3 : lock (c) T1 : unlock (b) T3 : unlock (c) T3 : unlock (a) m m@ T1 ergibt @ I R @ @ m T2 m; T3 ; Beweis fur Korrektheit: ()) Hat G keinen Kreis, so betrachte fur item a die Folge von locks und unlocks und die zugehorigen Transaktionen. Ti : lock (a) unlock (a) Ti : .. . lock (a) unlock (a) Tir : lock (a) unlock (a) 1 2 123 Nach Konstruktion gilt Ti ! Ti ! Ti ! : : : ! Tir . Also wird im konstruierten seriellen Schedule diese Reihenfolge eingehalten. Keine weiteren Transaktionen fuhren locks auf a aus. Also hat das konstruierte Schedule denselben Eekt bzgl. a wie Schedule S. Dies gilt fur alle Items ) serialisierbar. 1 2 3 (() Hat G einen Kreis Tj ! Tj ! : : : ! Tj t ! Tj , so nimm an, R sei ein zu S aquivalentes, serielles Schedule. Die erste Transaktion in R vom Kreis sei Tj p . Wegen Tjp ! Tjp im Kreis gilt oenbar Tjp : unlock a Tjp : lock a Tj p wendet auf a Funktion f an. In R wendet spater Tjp g an. In S wird jedoch durch Tjp g vor f angewendet. Widerspruch! 1 2 1 ;1 ;1 ;1 ;1 Fazit: Beliebige Verzahnung von Transaktionen kann Livelock, Deadlock oder nicht-serialisierbare Schedules hervorbringen. Der Scheduler mu beim Bemerken dieser Eekte eingreifen: er setzt eine oder mehrere Transaktionen zuruck. Def.: Eine Transaktion gehorcht dem 2-Phasen-Sperrprotokoll, falls sie nach dem ersten unlock kein lock mehr anfordert. sperren 6 - 124 Zeit Satz: Ein Schedule S, entstanden nach dem 2-Phasen-Sperrprotokoll, ist serialisierbar. Beweis: Annahme: nicht. Wegen Beweis fur Korrektheit des Algorithmus zum Testen auf Serialisierbarkeit mu der Vorranggraph G fur S einen Kreis Ti ! Ti ! : :(: ! Tip ! Ti haben. Dann aber gilt 1 2 .. . Ti 1 ( Ti unlock(x) lock(x) .. . .. . 2 Tip ( Ti ( 1 .. . unlock(y) lock(y) .. . 1 Also folgt in Ti nach einem unlock ein lock. Widerspruch! 1 Beobachtung: Nicht immer wird zwischen lock und unlock das Item verandert! Also: unterscheide zwischen read-only-Zugri und read-write-Zugri. also: reserviert x zum Lesen reserviert x zum Schreiben gibt x frei Ein Item kann mehrere rlocks haben, aber nur ein wlock. rlock(x) wlock(x) unlock(x) Sei Ti : rlock(a) eine Transaktion, die lesen will. Sei Tj : wlock(a) die nachste Transaktion, die schreiben will. Dann gilt Ti ! Tj . Sei Ti : wlock(a) eine Transaktion, die schreiben will. Sei Tj : wlock(a) die nachste Transaktion, die schreiben will. Dann gilt Ti ! Tj . Sei Tm : rlock(a) eine Transaktion, die lesen will und zwar nach Ti : und vor Tj : wlock(a). Dann gilt Ti ! Tm . 125 unlock(a) Algorithmus zum Testen auf Serialisierbarkeit mit read- und write-locks Input: Schedule S Output: A quivalentes, serielles Schedule, falls existiert Methode: Bilde gerichteten Graph G, Knoten Transaktionen, Kanten gema der Fallunterscheidung. T1 T2 T3 wlock a T4 rlock b unlock a rlock a unlock b rlock wlock b a unlock b wlock b unlock a unlock a wlock a unlock b rlock b unlock a unlock b Es ergibt sich der folgende Graph: T1 Y H H T2 6 H HH HH HH H - T4 ? T3 H H 126 Beobachtung: Nicht immer wird bei write .. . lock das Item gelesen. write (x) unlock (x) Eekt geht verloren! wlock (x) x := 0 write (x) unlock (x) Also: Wenn im Schedule S die Transaktion T2 ein Item x liest, welches von T1 geschrieben wurde, so gilt: m T1 m - T2 und niemand darf zwischen T1 und T2 Item x verandern. D.h. wenn im Schedule S Transaktion T3 das Item x schreibt, so mu dies entweder vor T1 oder nach T2 erfolgen. Der resultierende Graph hat \entweder-oder"-Kanten, der Test auf Serialisierbarkeit hat exponentielle Laufzeit. 127 9.3 Zeitstempelverfahren Jede Transaktion erhalt beim Eintritt ins System einen eindeutigen Zeitstempel (durch System-Uhr, z.B. bei 1 tic pro millisecunde ) 32 Bits reichen fur 49 Tage). Schedule korrekt, falls seine Wirkung dem seriellen Schedule gema Eintrittszeiten entspricht. Jede Einzelaktion druckt einem Item seinen Zeitstempel auf. D.h. jedes Item hat einen Lesestempel hochster Zeitstempel, verabreicht durch eine Leseoperation Schreibstempel hochster Zeitstempel, verabreicht durch eine Schreiboperation Marken sollen Verbotenes verhindern: 1. Transaktion mit Zeitstempel t darf kein Item lesen mit Schreibstempel tw > t. (Denn alter Item-Wert ist weg.) 2. Transaktion mit Zeitstempel t darf kein Item schreiben mit Lesestempel tr > t. (Denn der neue Wert kommt zu spat.) Bei Eintreten von Fall 1, 2 mu Transaktion zuruckgesetzt zu werden. Bei den beiden anderen Fallen brauchen die Transaktionen nicht zuruckgesetzt zu werden: 3. 2 Transaktionen konnen dasselbe Item zu beliebigen Zeitpunkten lesen. 4. Wenn Transaktion mit Zeitstempel t ein Item beschreiben will mit Schreibstempel tw > t, so wird der Schreibbefehl ignoriert. Also folgt als Regel fur Einzelaktion X mit Zeitstempel t bei Zugri auf Item mit Lesestempel tr und Schreibstempel tw : if (X = read) and (t tw ) f uhre X aus und setze tr := maxftr , tg if (X = write) and (t tr ) and (t tw ) then f uhre X aus und setze tw := t if (X = write) and ( r w ) then tue nichts else (X = read and ) or (X = write and w setze Transaktion zur uck f t t<t t<t 128 t < tr )g Beispiel: 1.) 2.) T1 Stempel T2 150 read(a) r := 150 t 3.) 4.) 5.) a := a - 1 6.) write(a) Item 160 a hat tr = tw = 0 read(a) := 160 tr a := a - 1 write(a) tw := 160 ok, da 160 tr = 160 und 160 tw = 0 T1 wird zruckgesetzt, da 150 < tr = 160 Beispiel: T1 200 1.) 2.) 3.) 4.) 5.) 6.) 7.) T2 150 T3 175 a tr = 0 tw = 0 read(b) read(a) read(c) write(b) write(a) tr = 150 tw = 200 write(c) write(a) 129 ignoriert, da 175 < tw (a) = 200 b tr = 0 tw = 0 tr = 200 tw = 200 c tr = 0 tw = 0 tr = 175 Abbruch von T2 , da 150 < tr (c) = 175 9.4 Recovery Zum Schutz vor Systemzusammenbruchen werden Sicherungskopien auf Magnetbandern erstellt (z.B. taglich). Zwischen den Sicherungslaufen durchlauft das Datenbanksystem eine Folge von konsistenten Zustanden, von denen jeweils der letzte auf Platte gespeichert ist. Bei einem Systemzusammenbruch kann der letzte konsistente Zustand mit Hilfe eines log-Files rekonstruiert werden. Im log-File werden alle A nderungsaktionen der Datenbank protokolliert. Ein typischer Eintrag enthalt Angaben zur Kennung der Transaktionen, des veranderten Items sowie Anfangs- und Endezeit. Wenn alle Aktionen einer Transaktion im Arbeitsbereich beendet sind und diese Aktionen im log-File vermerkt sind, gilt eine Transaktion als committed. Wenn eine Transaktion committed ist, wird der neue Zustand in die Datenbank ubertragen. Dann wird im log-File die Endezeit vermerkt. Bei einem Problem wahrend des U bertragens des Arbeitsbereiches in die Datenbank wird eine solche Transaktion wiederholt, die zwar eine Anfangszeit, aber keine Endezeit im log-File aufweist. Bei einem Systemabsturz ohne Plattencrash werden, beginnend beim aktuellen Datenbankzustand, alle committed Transaktionen mit Hilfe des log-Files wiederholt. Bei einem Plattencrash werden, beginnend bei der auf Band gesicherten Version, alle committed Transaktionen mit Hilfe des log-Files wiederholt. Obacht: Transaktionen, die Items von non-committed-Transaktionen lesen wollen, mussen entweder auf das commit warten oder durfen fortfahren mit der Bereitschaft, sich spater zurucksetzen zu lassen. 130 10 Datenschutz Ziel: Mibrauch der gespeicherten Daten verhindern. Rechtlicher Aspekt: Durch gesetzgeberische Manahmen ist festzulegen, welche Daten in welchem Umfang schutzbedurftig sind. Technischer Aspekt: Durch technische Manahmen ist der geforderte Schutz zu gewahren. Zum rechtlichen Aspekt: Bundesdatenschutzgesetz, 1977: Gesetz zum Schutz vor Mibrauch personenbezogener Daten bei der Datenverarbeitung Zum technischen Aspekt: 10.1 Organisatorische Manahmen | | | | | bauliche Manahmen Pfortner Ausweiskontrolle Diebstahlsicherung Alarmanlage 10.2 Identitatskontrolle | Magnetkarte | Stimmanalyse/Fingerabdruck | Pawort: w ohne Echo eintippen, System uberpruft, ob f(w) eingetragen ist, f ;1 aus f nicht rekonstruierbar | dynamisches Pawort: vereinbare Algorithmus, der aus Zufallsstring gewisse Buchstaben heraussucht Pawortverfahren sollten mit U berwachungsmanahmen kombiniert werden (Ort, Zeit, Fehleingabe notieren) 131 10.3 Zugriskontrolle Verschiedene Benutzer haben verschiedene Rechte bzgl. derselben Datenbank. Berechtigungsmatrix (wertunabhangig): Benutzer Ang-Nr Gehalt Leistung A R R RW (Manager) B RW RW R (Personalchef) C R R | (Lohnburo) wertabhangig: Zugri (A, Gehalt): R: Gehalt < 10.000 W: Gehalt < 5.000 Wesentlich kostspieliger, da erst nach Lesen der Daten entschieden werden kann, ob der Benutzer die Daten lesen darf. Ggf. werden dazu Tabellen benotigt, die fur die eigentliche Anfrage nicht verlangt waren. Beispiel: Zugri verboten auf Gehalter der Mitarbeiter an Projekt 007. Realisierung durch Sichten: define view v(ang nr, gehalt) as select ang nr, gehalt from angest where gehalt < 3000 Realisierung durch Abfragemodikation: deny (name, gehalt) where gehalt > 3000 liefert zusammen unter der Query select gehalt from angest where name = 'Schmidt' die Query select gehalt from angest where name = 'Schmidt' and not gehalt > 3000 In statistischen Datenbanken durfen Durchschnittswerte und Summen geliefert werden, aber keine Aussagen zu Einzelpersonen. Dies ist sehr schwer einzuhalten, selbst wenn die Anzahl der referierten Datensatze gro ist. Es habe z.B. Manager X als einziger die Eigenschaft Q. x := select sum (gehalt) from angest / y := select sum (gehalt) from angest where not Q / x ; y liefert das Gehalt von Manager X. In manchen relationalen Datenbanksystemen sind Zugrisrechte nicht statisch/zentral, sondern dynamisch verteilt. D.h. der Eigentumer einer Relation kann anderen Benutzern Rechte erteilen und entziehen. 132 f grant read | insert | delete | update | all rights on <relation> to <user> with grant option] : read insert delete update all rights with grant option : : : Beispiel: A: B: B: : : g darf Tupel lesen darf Tupel einfugen darf Tupel loschen darf Tupel andern read + insert + delete + update <user> darf die ihm erteilten Rechte weitergeben B grant read, insert on angest to with grant option grant read on angest to with grant option grant insert on angest to C C Jeder Benutzer, der ein Recht vergeben hat, kann dieses mit einer Anweisung wieder zurucknehmen: f revoke read | insert | delete | update | all rights on <relation> from <user> - Revoke g Beispiel: B : revoke all rights on angest from C Es sollen dadurch dem Benutzer C alle Rechte entzogen werden, die er von B erhalten hat, aber nicht solche, die er von anderen Benutzern erhalten hat. Auerdem erloschen die von C weitergegebenen Rechte. Idee: Der Entzug eines Grant G soll sich so auswirken, als ob G niemals gegeben worden ware! Beispiel: A: B: D: A: grant read, insert, update grant read, update grant read, update revoke insert, update on on on on angest angest angest angest D D E to to with grant option to from D Hierdurch verliert D sein insert-Recht, E verliert keine Rechte. Falls aber vorher A Rechte an B gab, z.B. durch A: grant all rights on angest to B with grant option dann muten D und E ihr update-Recht verlieren. 133 10.4 Kryptographische Methoden Schlussel Schlussel ? Klartext - Verschlusselungsalgorithmus - verschlusselter Text ? - Entschlusselungsalgorithmus - Klartext Beispiel: Klartext Schlussel Alg.: XOR Schlussel Alg: XOR 011 110 101 110 011 000 110 110 110 000 111 110 001 110 111 001 110 111 110 001 geeignet fur lokales Verschlusseln. Problem beim U bertragen. ? - Spion ? - - 1. Losung: Schicke Schlussel per Kurier. 2. Losung: Schicke \oentlichen" Schlussel uber Leitung, fuhrt zu Public Key Systems. Public Key Systems: z.B. Verschlusselungsalgorithmus enc(x) = xe mod n Entschlussungsalgorithmus dec(x) = xd mod n e d n sind so gewahlt, da dec(enc(x)) = x Aus der Kenntnis von enc(x) e n lat sich d nicht ezient berechnen. Also: Empfanger B veroentlicht e n. Sender bildet y = xe mod n. Empfanger bildet yd mod n = x. 134