Konzepte objektorientierter Datenbanken Strukturteil Vorderungen an OODBS objektorientierter Bereich • komplexe Objekte • Objektidentität • Einkapselung • Typen und Klassen • Klassenhierarchien • Überladen von Methoden • Erweiterbarkeit optional: • Mehrfachvererbung Datenbankbereich • Persistenz • Sekundärspeicher-Verwaltung • Nebenläufige Transaktionen • Recovery-Mechanismen • Anfragesprachen • Datenbankoperationen optional: • verteilte Datenbank • Versionsverwaltung 3.1 Typkonstruktoren, komplexe Objekte • Um viele Objekte speichern und bearbeiten zu können, braucht man einen Mengenkonstruktor • Typ einer relationalen Tabelle SET OF (TUPLE OF (Typ1 A1, . . . , Typn An)) • In OODBS können außer Grundtypen auch benutzerdefinierte Klassen verwendet werden. • TUPLE OF entspricht der Aggregation. • Unterschiedliche Realisierung des Mengenkonstruktors bei verschiedenen OODBMs Überblick Typkonstruktoren • Tupelkonstruktor TUPLE OF – fasst mehrere Komponenten unterschiedlicher Typen zusammen – entspricht der Aggregation • Mengenkonstruktor SET OF – mehrere Elemente eines Typs bilden eine Menge – jedes Element ist nur einmal in der Menge enthalten • Multimengenkonstruktor BAG OF: wie Menge, aber – ein Element kann mehrfach vorkommen • Listenkonstruktor LIST OF: wie Multimenge, aber – Reihenfolge interessant Typkonstruktoren werden rekursiv angewendet Beispiel komplexer Typ in O2: Personen SET OF (TUPLE OF (Name: TUPLE OF (Vorname: STRING, Nachname: STRING), Adresse: TUPLE OF (PLZ: STRING, Ort: STRING, Straße: STRING, Hausnr: STRING), Hobbies: SET OF (Hobby: STRING), Geburtsdatum: DATE)) Beispiel Personen: Graphik Menge Tupel Beispiel Personen in Object Store • CLASS Namen {public: STRING Vorname; STRING Nachname}; • CLASS Adressen {public: STRING PLZ; STRING Ort; STRING Straße; STRING Hausnummer}; • CLASS Personen {public: Namen Name; Adressen Adresse; os_Set <STRING> Hobby; DATE Geburtsdatum}; • os_Set <Personen*> Personenmenge Typkonstruktoren in Objekt Store • Aggregation durch Klassenbildung • Mengenkonstruktoren durch vordefinierte generische Klassen os_Collection mit den Unterklassen • Mengenkonstruktor: os_Set • Multimengenkonstruktor: os_Bag • Listenkonstruktor: os_List • Elementtypen sind Zeiger auf andere Klassen Übung • Stellen Sie den Objekttyp Bücher als komplexen Typ in O2-Syntax dar! • Verwenden Sie für die Autoren den Listenkonstruktor! • Stellen Sie den Objekttyp Bücher graphisch dar! • Geben Sie den gleichen Objekttyp in Object-Store an! • Machen Sie sich die Auswirkungen rekursiver Typen klar. Was passiert z. B., wenn die Freunde einer Person im Objekttyp Person berücksichtigt werden? Objekttyp Bücher graphisch Operationen auf komplexen Typen • Tupelkonstruktor – Komponentenzugriff – Test auf Gleichheit zweier Tupel • Mengenkonstruktor – – – – Zugriff auf alle Elemente Test auf ein Element Mengenvergleiche: =, Mengenoperationen, z. B. Durchschnitt • Listenkonstruktor – Zugriff auf Elemente in Reihenfolge • allgemein: Einfügen, Löschen, Ändern 3.2 Objektidentität: Nachteile von Schlüsseln • Kein Unterschied zwischen Änderung des Objektwertes (Inhalt) und der Objektidentität (Schlüssel). • Problem, wenn mehrere Objekte ein gemeinsames Komponentenobjekt beinhalten (z. B. Raumnr. bei Vorl.) • Es ist nicht möglich, verschiedene Objekte mit gleichem Wert darzustellen, da der Schlüssel zum Wert gehört. • Bei Abfragen sind ineffiziente Joins nötig. Arten der Objektidentität • physische Adressen, direkte Referenzen, Zeiger – Zeiger zeigen auf Komponentenobjekt – Zeiger zeigen auf Beginn einer Liste bei mengenwertigen Attributen • Namen aus einem benutzerdefinierten Namensraum – z. B. Personalnummern nach bestimmtem Schema • Identifier-Attribute = automatische Schlüssel = Surrogate • abstrakte Objekte Unterscheide Objekte und Werte Objekte – Beispiel: Person Martin Hulin – nicht druckbar – müssen erzeugt und definiert werden – tragen selbst keine Information – werden beschrieben Werte – Beispiel: Zahl 182 – druckbar – sind schon da – tragen selbst die Information – beschreiben etwas Objektidentität durch physische Adressen • Beispiel: Häuser werden durch ihre Adresse oder ihre Koordinaten identifiziert • Vorteile – einfach zu implementieren – effizient, da Komponenten schnell zu finden sind – ist kein Wert sondern Objekt • Nachteile – physikalische Datenunabhängigkeit verletzt – Objekt nicht verschiebbar – Was passiert beim Löschen? Objektidentität durch Namen • Beispiel: Nummernschilder von Autos • Vorteil – Name kann strukturiert sein und damit leicht zu lesen. • Nachteile – – – – kann als Wert interpretiert werden Name kann sich ändern (z. B. Autoummeldung) Eindeutigkeit muss überwacht werden. siehe Schlüssel! Objektidentität durch Identifier-Attribute • Beispiel: AutoZähler in Access, SEQUENCE in Oracle • Vorteile – Eindeutigkeit wird vom System garantiert – kann nicht geändert werden – trägt (fast) keine Information, ist also Objekt(ersatz) • Nachteile – Fremdschlüsselbedingungen müssen definiert werden – Identifier-Attribute können nicht wie normale Attribute behandelt werden. Beispiel Buch mit Identifier-Attribut SET OF (TUPLE OF ( Bücher_ID: ISBN: Titel: Verlags_ID: Autoren: Stichworte: Versionen: IDENTIFIER, STRING, STRING, IDENTIFIER, LIST OF (Autor: STRING), SET OF (Stichwort: STRING), SET OF (TUPLE OF (Auflage: INT, Jahr: INT)))) Bücher mit Identifier-Attributen Buch_ID ISBN Titel 0110110 3-19-5-3 DB2 Verl_ID Autoren Stichw. 0010011 Vossen RDBS Witt Lehrb. 0110100 0-53-5-3 Princ. of 0010111 Elmasri RDBS Navathe Lehrb. ODBS Objektidentität durch abstrakte Objekte • Objekte sind Elemente einer – – – – unstrukturierten, abzählbar unendlich großen, abstrakten Menge über deren Elemente man nur weiß, dass sie verschieden sind • Davon unterschieden werden Werte von Objekten • abstrakte Objekte können (mehr oder weniger gut) implementiert werden durch – physische Adressen – Namen – Identifier-Attribute Darstellung durch Zustandsboxen Objekt 19 19 Zustand von Objekt 19 Hugo 1.5.89 2 88250 Weingarten Gartenstr. 5 abstrakte Objekte • Vorteile – unabhängig von der Implementierung – theoretisch fundiert – Fremdschlüsselbedingungen werden vom System garantiert • Nachteile – nur in wenigen realen OODBMSn realisiert • Zwei Varianten – Eine unendliche Menge mit abstrakten Objekten für alle Klassen – Für jeden Objekttyp wird eine eigene abstrakte Domäne eingeführt. Diese Domänen sind disjunkt. Bücher mit abstrakten Objekten und disjunkten Domänen Buch ISBN Titel Verlag Autoren Stichw. 1 3-19-5-3 DB2 1 Vossen RDBS Witt Lehrb. 2 0-53-5-3 Princ. of 2 Elmasri RDBS Navathe Lehrb. ODBS 1 ist keine Adresse eines Verlags, kein Schlüssel eines Verlags, sondern ein gesamtes Objekt vom Typ Verlag Operationen auf Objekten • Test auf Identität: o1 == o2 z. B. Vater von Peter == Vater von Susanne • Test auf flache (Wert-)Gleichheit • Test auf tiefe (Wert-)Gleichheit • Zuweisung: erzeugt wird Referenz auf Objekt • flaches Kopieren • tiefes Kopieren Übung zu Objektoperationen • Erzeugen Sie ein neues Buch-Objekt 3 durch flaches Kopieren von 1 • Erzeugen Sie ein neues Buch-Objekt 4 durch tiefes Kopieren von 1 • Test auf flache Gleichheit zwischen 1 und 3? • Test auf flache Gleichheit zwischen 1 und 4? • Zuweisung von 1 an die Variable Lieblingsbuch • 1 == Lieblingsbuch? • 1 == 3? 3.3 Klassen und Typen Klasse hat 2 Bedeutungen: • Menge zusammengehöriger Objekte, Sammelbehälter • Typ = Aufbauschema dieser Objekte Bestandteile einer Klasse: • Domäne für (abstrakte) Objekte • Menge aller bisher erzeugten Objekte der Klasse • Zustandstyp der Klasse = Aufbauschema • Zustandsfunktion ordnet jedem Objekt seinen Wert, ein Element des Zustandstyps, zu Alternative Konzepte bei Klassen • Typ-basiertes Schema – Klasse definiert einen komplexen Typ – Objekte der Klasse (Variablen) werden nicht gesammelt – Extra Sammelobjekte nötig, z. B. os_Set • Klassen-typ-basiertes Schema (siehe vorige Folie) – Klasse definiert einen komplexen Typ – Klasse ist Sammelbehälter • Klassen-basiertes Schema – Klasse ist Sammelbehälter – Typen der Komponenten sind nicht festgelegt Typ-basiert Typ von Class Linie Linie x Punkt anf; Punkt end; int dicke; (3;15); (5;17); 6; Linie a2 (3;0); (5;17); 2; os_Set <Linie*> Linien Linie yxa (3;15); (1;1); 6; Klassen-Typ-basiert Linie x Class Linien Punkt anf; Punkt end; int dicke; (3;15); (5;17); 6; Linie a2 (3;1); (5;17); 3; Linie gt (3;15); (5;1); 6; Klassen-basiert Linie x Class Linien anf; end; dicke; (3;15); (5;17); 6; Linie a2 (3;1); (5;17); 3; Linie gt "p1"; "p2"; "dünn"; 3.4 Beziehungen zwischen Klassen • Jede Klasse besteht aus Attributen = Komponenten. • Diese können wieder Klassen sein. • Klassen-Komponentenklassen-Beziehung realisiert Relationen zwischen verschiedenen Klassen. • Andere Art von Relation: Klasse-Unterklasse-Beziehung siehe 3.5! • Unterschiedliche Semantik von Komponentenklassen – gemeinsame/private Komponentenobjekte – abhängige/unabhängige Komponentenobjekte – eingekapselte/eigenständige Komponentenobjekte gemeinsame/private Komponentenobjekte • gemeinsame Komponentenobjekte: – Ein Komponentenobjekt ist Komponente von mehreren übergeordneten Objekten – Komponente kann in Objekten verschiedener Klassen sein – M:N(1)-Relation zwischen Klasse und Komponentenklasse – Beispiel: Verlage ist gemeinsame Komponente bei Bücher • private Komponentenobjekte: – Jedes Komponentenobjekt ist Komponente von nur einem übergeordneten Objekt – 1:N(1)-Relation zwischen Klasse und Komponentenklasse – Beispiel: Mitarbeiter ist private Komponente von Abteilung abhängige/unabhängige Komponentenobjekte • abhängige Komponentenobjekte – existieren nur mit übergeordnetem Objekt – werden mit übergeordnetem Objekt erzeugt und gelöscht – Gemeinsame abhängige Objekte werden mit letztem übergeordneten Objekt gelöscht. – Beispiel: Adresse ist von Person abhängig. • unabhängige Komponentenobjekte – – – – existieren auch ohne übergeordnetes Objekt werden unabhängig erzeugt und gelöscht beim Löschen muss auf übergeordnete Objekte geachtet werden Beispiel: Verlage sind unabhängige Komponente von Bücher. eingekapselte/eigenständige Komponentenobjekte • eingekapselte Komponentenobjekte – – – – sind nur über ihre übergeordneten Objekte erreichbar. sind immer abhängig. Redundanz bei M:N-Relationen Beispiel: Name ist eingekapselt in Personen • eigenständige Komponentenobjekte – sind direkt erreichbar. – sind auch über ihre übergeordneten Objekte erreichbar. – Beispiel: Verlage ist eine eigenständige Klasse. Eine Auflistung aller Verlage kann erstellt werden, ohne die Klasse Bücher. Darstellung von Relationen: 1. gekapselte Komponentenklassen komplexe Objekte mit eingekapselten Strukturen – geeignet für 1:1- und 1:N-Relationen – bei M:N-Relationen Redundanz – Zugriff nicht symmetrisch: • einfach von Klasse auf Komponente • schwierig von Komponente auf umfassende Klasse Beispiel Studenten SET OF (TUPLE OF ( MatrikelNr: STRING, Teilnahme: SET OF (TUPLE OF( VName: STRING, VPrüfungsart: CHAR, Note: INTEGER)))) Darstellung von Relationen: 2. gegenseitige Komponentenklassen Zwei Klassen haben die jeweils andere als Komponente – geeignet für 1:1-, 1:N- und M:N-Relationen – Zugriff symmetrisch – System muss die Symmetrie überwachen bei Änderungsoperationen – Die Relation darf keine eigenen Attribute haben, z. B. ist die Note eines Studenten für eine Vorlesung nicht darstellbar Beispiel: Student und Vorlesung • CLASS Student { STRING MatrikelNr; os_Set <Vorlesung*>besuchte_Vorlesungen INVERSE_MEMBER os_Set<Teilnehmer>;} • CLASS Vorlesung { STRING VName; char Prüfungsart; os_Set <Student*>Teilnehmer INVERSE_MEMBER os_Set<besuchte_Vorlesungen>;} Darstellung von Relationen: 3. Verbindungsklasse • Die Relation wird zu einer eigenen Klasse – geeignet für M:N-Relationen mit eigenen Attributen – jeweils 1:N-Relationen von den Klassen zur Verbindungsklasse • Beispiel: Studenten und Vorlesungen CLASS Student { ... os_Set<Zeugniseintrag*>Zeugnis INVERSE_MEMBER Stud; ...}; CLASS Vorlesung { ... os_Set<Zeugniseintrag*>Teilnehmer INVERSE_MEMBER V; ...}; CLASS Zeugniseintrag {Student Stud; Vorlesung V; int Note;} 3.5 Strukturvererbung • Besondere Relation zwischen Klassen: "ist ein" z. B. Student Müller "ist eine" Person • Typvererbung Seien T_O und T_U Typen. T_O ist Obertyp von T_U, T_U Untertyp von T_O – bei atomaren Typen, wenn T_U T_O z. B. short int long int – bei Tupeltypen, wenn T_U mindestens alle Komponenten von T_O hat, z. B. Student und Person – bei Mengentypen, wenn der Elementtyp von T_U Untertyp des Elementtyps von T_O ist Strukturvererbung (Forts.) • Klassenhierarchie Seien K_U und K_O Klassen – K_U ist spezieller als K_O, wenn Objektmenge (K_U) Objektmenge (K_O) – K_U ist Unterklasse, K_O ist Oberklasse • Klassen- und Typhierarchie passen zusammen, z. B. – – – – Klassenhierarchie: Studenten Personen Typhierarchie: Student hat alle Attribute von Person und mehr DBMS sichert zu, dass jedes Objekt von Student auch Person ist In C++ nur Typhierarchie Operationen zur Klassenbildung • Spezialisierung – definiert Unterklassen durch Vererbung der Oberklasse – Nicht alle Objekte der Oberklasse müssen in einer der Unterklassen vorkommen • Generalisierung – fasst mehrere Klassen zu gemeinsamer Oberklasse zusammen – Alle Objekte der Unterklassen kommen in die Oberklasse • Spezialisierung und Generalisierung erzeugen sog. freie Klassen ohne eigene abstrakte Objektmenge • In C++ nur Spezialisierung möglich, Generalisierung muss vorher im Kopf (Konzept) erfolgen. Klassenbaum und Klassengraph • Von Unterklasse bilde wiederum Unterklasse Klassenbaum Tiere Wirbeltiere Säugetiere wirbellose Tiere Vögel Klassenbaum und Klassengraph • Bilde Unterklasse von mehreren Klassen (multiple Vererbung) Klassengraph • Nicht bei allen objektorientierten Systemen möglich • bei C++ erlaubt Objekte in mehreren Klassen Beispiel: ER-Diagramm eines Adressbuchs Name Adresse TelNr Person Kollege RaumNr Tel dienstl o Freund Geb.datum Hobbies Probleme bei der Realisierung • In C++ kann jedes Objekt nur in einer Klasse sein Neue Klasse Kollege_und_Freund nötig als Spezialisierung von Kollege und von Freund Explosion von Kombinationsklassen • Klassenwechsel eines Objekts nicht möglich, z. B. – Kollege wird Freund – Kollege und Freund geht in Rente, bleibt aber Freund Objekt muss gelöscht und in anderer Klasse neu eingefügt werden. Klassenhierarchie für Beispielszenario Legende für Klassengraph Aufgabe: Klassengraph erstellen • Bei einem Autohändler in Ravensburg kann man nicht nur Autos kaufen, sondern auch Reisen buchen. • Erstellen Sie einen Klassengraph für folgende Klassen – – – – – – – – Fahrzeuge Autos Lastkraftwagen Urlaubsreisen Personen Kunden Mitarbeiter Verkäufe 3.6 Integritätsbedingungen • Im objektorientierten Modell inherente Integritätsbed. – Fremdschlüssel unnötig, da Komponentenbeziehung und Unterklassenbeziehung – Unterklassen von Standardtypen statt Check-Constraints • NOT-NULL-Constraint • UNIQUE-Constraint: – Eine Kombination von Attributen (evtl. auch von Komponentenklassen) muss eindeutig sein. – wird auch für Zugriffsoptimierung verwendet • Einschränkung von M:N-Relationen auf 1:N- oder 1:1-Relatinen