Kap. 7: Objektrelationale Datenbanken und SQL:1999 • Bei ODMG spricht man von revolutionärer Abkehr von RDBMS, hat aber im Laufe der Zeit gesehen, dass eine grössere Unabhängigkeit von Programmiersprachen vorteilhaft ist. • Bei ORDBMS ist die evolutionäre Erweiterung bestehender relationaler Denkweise im Vordergrund. Man hat erkannt, dass Grundkonstrukte semantischer Datenmodelle und (abstrakte) Benutzerdatentypen nötig sind. Letzteres motiviert auch die Entwicklung einer (4GL-) Sprache für Methodenund Anwendungsentwicklung. • Häufig wird die Gleichung “ORDBMS = RDBMS + OODBMS” gesehen. Dies drückt die Verwendung von Prinzipien aus. • SQL:1999 (oft auch SQL-99 oder SQL3 genannt): – Aktueller DB-Standard – Ziel: Vorteile von OO-Konzepten einführen, ohne bewährte SQL-Konzepte aufzugeben ORDB und SQL:1999-1 IS-K2002 ORDBMS im Überblick Mächtigkeit der Operationen Relationales Modell Dateien Komplexe Objekte/ Geschachtelte Relationen Hierarchisches Modell Objekt-Relationales Modell NetzwerkModell Semantisches Datenmodell Strukturelle Komplexität IS-K2002 ORDB und SQL:1999-2 Charakterisierung von ORDBMS Hauptmerkmale: • Erweiterung der Basisdatentypen – Attributtypen können benutzerdefiniert sein • Komplexe Objekte durch Typkonstruktoren – Tupel, Set, Multiset, List, Array, … • Objektreferenzen • Typvererbung und Subtabellen • Methoden, Funktionen und Trigger ORDB und SQL:1999-3 IS-K2002 ORDB - Tupeltabellen vs. Objekttabellen Mitarbeiter (Tupeltabelle (Tupeltabelle mit nichtnicht-atomaren Attributen) Name Adresse <Strasse, PLZ, Ort> Hobbies Bewerbun g Dienstwagen Foto VARCHA R ROW(VARCHAR, INT, VARCHAR) SET(CHAR) Object(...) REF(Auto) SCOPE Wagen BLOB 'Jim' ROW('Seeblick', 8008, 'Zürich') SET('Kino', 'Sport') Object(...) X'120332828474292' X'...' atomare Spalte tupelwertige Spalte referenzwertige Spalte LOBLOBSpalte mengenwertige objektwertige Spalte Spalte strukturierter Typ (Objekttyp) Wagen (Objekttabelle) OID Hersteller Fotos Farbe PS Motor VARCHAR VARCHAR SET(BLOB) VARCHAR INTEGER Object(...) X'120332828474292' 'Aston Martin' SET(X'...', X'...') 'Silber' 324 Object(...) OIDOID-Spalte • • • • strukturierter Wert (Objektwert) Objekttabelle basiert auf einem Objekttyp Zeilen sind Objekte (Methoden können darauf aufgerufen werden) Zeilen haben eine OID und sind damit mittels Referenzspalten referenzierbar Tabellenhierarchien sind möglich IS-K2002 ORDB und SQL:1999-4 Hintergrundinformation zu SQL:1999 SQL/89 mit Integrity Enhancement 120 Seiten SQL/92 579 Seiten Entry Level Intermediate Level Full Level SQL:1999 > 3000 Seiten SQL Foundation SQL Call Level Interface SQL Persistent Stored Modules SQL Language Binding + Object Language Binding SQL Java Types and Routines SQL Multimedia and Application (Full Text, Spatial, Still Image) SQL:2003 SQL XML-related Specifications ORDB und SQL:1999-5 IS-K2002 SQL:1999 - Übersicht (1) • Typsystemerweiterung: Erweiterbarkeit, OO-Konzepte – Typkonstruktoren für strukturierte Attribute (komplexe Werte): ... damit einige Konstrukte • Tupeltypen (ROW Types) des “erweiterten NF2• Kollektionstypen Modells” enthalten – Benutzerdefinierte Datentypen (UDT) – Referenzdatentyp (REF) – Subtypen und Subtabellen ... damit Konstrukte von OODBMS enthalten • Neue vordefinierte Datentypen – Boolean, Binary Large Objects, Character Large Objects • Rekursion (Berechnen der transitiven Hülle) IS-K2002 ORDB und SQL:1999-6 SQL:1999- Übersicht (2) • Call Level Interface (CLI) → dynamisches SQL • Erweiterung von SQL zu voller Programmiersprache (Procedural Extensions, SQL/PSM "Persistent Stored Modules") – Module, Prozeduren, Funktionen im Server speichern / ausführen – volle Berechenbarkeit • Primitive für Transaktionsmodelle – Chained Transactions, Savepoints, etc. • Trigger: Integrität und Unterstützung aktiver Datenbanken – mehrere Trigger pro Tabelle – mehrere Statements als Aktion definierbar • Roles für verbesserte Autorisierung IS-K2002 ORDB und SQL:1999-7 Die wichtigsten Typen in SQL:1999 • Ausgangspunkt: Tabellendefinition (CREATE TABLE): – Zeilen können wie folgt definiert werden • implizit (wie bisher) • explizit durch Row-Typdefinition – Spalten können folgende Typen besitzen: • vordefinierte Standarddatentypen (wie bisher) • konstruierte Typen - Typkonstruktoren: ROW / REF / ARRAY - MULTISET (in SQL:2003) • benutzerdefinierte Typen (UDT) - aufbauend auf vorderfinierten, konstruierten, und/oder bereits existierenden benutzerdefinierten Typen • • Tabellen sind die einzigen Einstiegspunkte in die Datenbank Instanzen von Typen, die innerhalb einer Tabelle vorkommen, sind automatisch persistent IS-K2002 ORDB und SQL:1999-8 Definition von strukturierten Typen (1) • Strukturierte Typen als eine Form von benutzerdefinierten Typen CREATE TYPE AdressTyp AS ( Strasse VARCHAR(30), Ort VARCHAR(40), PLZ INTEGER, Land VARCHAR(25) ) NOT FINAL; vordefinierte Typen benutzerdefinierter Typ konstruierte Typen CREATE TYPE PersonTyp AS ( Name VARCHAR(30), Anschrift AdressTyp, Ehepartner REF(PersonTyp), Kinder REF(PersonTyp) ARRAY[10] ) NOT FINAL; Subtypen können vorhanden sein ORDB und SQL:1999-9 IS-K2002 Definition von strukturierten Typen (2) • Objektverhalten kann in Methoden kodiert werden • Methoden sind Funktionen, die sich auf genau einen strukturierten Typen beziehen • Beispiel für eine Methodendeklaration: CREATE TYPE PersonTyp ( Name VARCHAR(30), Anschrift AdressTyp, Ehepartner REF(PersonTyp), Kinder REF(PersonTyp) ARRAY[10] ) NOT FINAL METHOD AnzahlKinder() RETURNS INTEGER; • • • Realisierung über prozedurale SQL-Spracherweiterungen Overloading / Late Binding: Methodennamen können überladen werden Overriding: Methoden können in Subtypen überschrieben werden – dynamisches Binden (Auswahl der Implementierung) zur Laufzeit IS-K2002 ORDB und SQL:1999-10 Einkapselung von strukturierten Typen • Attribute gleich behandelt wie Methoden (Funktionen) • vollständige Einkapselung – Attribute nur über Methoden zugreifbar • für jedes Attribut werden implizit Observer- und Mutator-Methoden generiert Observer: FUNCTION Strasse(AdressTyp) FUNCTION Ort(AdressTyp) FUNCTION Plz(AdressTyp) FUNCTION Land(AdressTyp) Mutator: RETURNS VARCHAR(30); RETURNS VARCHAR(40); RETURNS INTEGER; RETURNS VARCHAR(25); FUNCTION Strasse(AdressTyp, VARCHAR(30)) FUNCTION Ort(AdressTyp, VARCHAR(40)) FUNCTION Plz(AdressTyp, INTEGER) FUNCTION Land(AdressTyp, VARCHAR(25)) RETURNS AdressTyp; RETURNS AdressTyp; RETURNS AdressTyp; RETURNS AdressTyp; ORDB und SQL:1999-11 IS-K2002 Attributzugriff bei Instanzen strukturierter Typen • Zugriff über Funktionsaufrufe oder Dot-Operator (syntaktischer Zucker) – X.Attributname entspricht Attributname(X) – SET X.Attributname = Wert entspricht Attributname(X, Wert) • Pfadausdrücke: nacheinander Anwendung des Dot-Operators – navigierende Zugriffe • Beispiel: BEGIN ... DECLARE p PersonTyp; SET p = PersonTyp(); SET p.Name = ‘Luke Skywalker’; SET p.Anschrift.Ort = ‘Hollywood’; ... END; IS-K2002 ORDB und SQL:1999-12 Erzeugen von Instanzen strukturierter Typen • unter Verwendung des Default-Konstruktors • Initialisierung mittels – Mutator-Methoden – redefiniertem Konstruktor (kann beliebig überladen werden) • Beispiel: Erzeugen einer PersonTyp-Instanz, bei der das Attribut Name gesetzt wird CREATE FUNCTION PersonTyp (n VARCHAR(30)) RETURNS PersonTyp RETURN PersonTyp().Name(n); Pfadausdruck mit Aufruf des Default-Konstruktors ORDB und SQL:1999-13 IS-K2002 Definition von typisierten Tabellen (Objekttabellen) • Typisierte Tabellen basieren auf einem strukturierten Typen • Instanzen (Zeilen) sind Objekte dieses Typs • Beispiel: CREATE TABLE Personen OF PersonTyp (REF IS oid SYSTEM GENERATED, Ehepartner WITH OPTIONS SCOPE Personen, Kinder WITH OPTIONS SCOPE Personen); • Referenzklausel (hier mit SYSTEM GENERATED) muss für jede Wurzeltabelle angegeben werden • Bestimmt die Art der Referenzgenerierung (OID-Erzeugung) • Scope-Klausel muss für jedes Referenzattribut definiert werden • Bestimmt typisierte Tabelle, auf dessen Instanzen referenziert wird IS-K2002 ORDB und SQL:1999-14 Definition von Tupeltypen (ROW Types) • Tupeltyp besteht aus einer Sequenz von Attribut/Datentyp-Paaren • eingebettet innerhalb von Typ- oder Tabellendefinitionen • Beispiel: CREATE TABLE PersonenTupelTabelle ( Name ROW( Vorname VARCHAR(15), Nachname VARCHAR(15)), Anschrift ROW( Strasse VARCHAR(30), Ort VARCHAR(40), PLZ INTEGER, Land VARCHAR(25)) ); ORDB und SQL:1999-15 IS-K2002 Definition von Distinct-Typen • Zweite Form von benutzerdefinierten Typen • Erstellt Kopie eines existierenden Datentyps unter einem neuen Namen – Wiederverwendung – Distinct-Typen werden unterschieden (strenge Typisierung) CREATE TYPE Franken AS NUMERIC(9,2); CREATE TYPE Euro AS NUMERIC(9,2); CREATE TABLE CHBank(Knr INTEGER, Stand Franken); CREATE TABLE EuroBank(Knr INTEGER, Stand Euro); SELECT DISTINCT c.Knr, c.Stand FROM CHBank c, EuroBank e WHERE c.Stand > e.Stand; Fehler: Schweizer Franken und Euro sind nicht vergleichbar … WHERE c.Stand > Franken(CAST(e.Stand AS NUMERIC(9,2))); IS-K2002 Korrekt: Casting ORDB und SQL:1999-16 Typhierarchie • Vererbung von Attributen und Methoden – Sub-/Supertyp-Beziehung • Beispiel: Mitarbeiter als spezielle Personen CREATE TYPE MitarbeiterTyp UNDER PersonTyp AS ( PNr INTEGER, Bewerbung CLOB(50K), Bild BLOB(5M), Vorgesetzter REF(MitarbeiterTyp), Projekte REF(ProjektTyp) ARRAY[10], Gehalt Franken ) NOT FINAL METHOD Gehaltserhöhung() RETURNS Franken; • keine Mehrfachverbung (maximal ein direkter Supertyp) IS-K2002 ORDB und SQL:1999-17 Beispiel: Definition von SQL-Methoden CREATE METHOD AnzahlKinder() RETURNS INTEGER FOR PersonTyp RETURN CARDINALITY(SELF.Kinder); CREATE METHOD Gehaltserhöhung RETURNS Franken FOR MitarbeiterTyp BEGIN DECLARE altesGehalt Franken; SET altesGehalt = SELF.Gehalt; IF (SELF.AnzahlKinder < 3) OR (SELF.AnzahlProjekte < 2) THEN SET SELF.Gehalt = 1,03 * altesGehalt; ELSE SET SELF.Gehalt = 1,05 * altesGehalt; ENDIF IF (SELF.Gehalt > 500000) THEN SIGNAL 'Gehalt zu hoch'; RETURN SELF.Gehalt; END; IS-K2002 ORDB und SQL:1999-18 Erweiterung von SQL zur Programmiersprache compound statement BEGIN … END; SQL variable declaration DECLARE Variablenname Typname; if statement IF Prädikat THEN … ELSE …; case statement CASE subject (nachr) WHEN ‘SQL’ THEN … WHEN … END CASE; loop statement LOOP … END LOOP; while statement WHILE Prädikat DO … END WHILE; repeat statement REPEAT … UNTIL Prädikat END REPEAT; for statement FOR Schleifenvariable AS … DO … END FOR; return statement RETURN Rückgabewert; call statement CALL Prozedurname(Parameter); assignment statement SET Variable = Wert; signal / resignal statement SIGNAL Ausnahmebedingung; ORDB und SQL:1999-19 IS-K2002 Tabellenhierarchie • Extensionale Teilmengen-Beziehung zwischen Sub-/Supertabelle – Alle Instanzen einer Subtabelle sind auch Instanzen der zugehörigen Supertabelle(n) CREATE TABLE Mitarbeiter OF MitarbeiterTyp UNDER Personen (Vorgesetzter WITH OPTIONS SCOPE Mitarbeiter, Projekte WITH OPTIONS SCOPE Projekt); • IS-K2002 Typ der Subtabelle muss ein direkter Subtyp des Typs der Supertabelle ORDB und SQL:1999-20 Beispiel - typisierte Tabellen und Subtabellen Personen OF PersonTyp OID Name Anschrift Ehepartner Kinder VARCHAR VARCHAR AdressTyp REF(PersonTyp) REF(PersonTyp) ARRAY[10] UNDER Mitarbeiter OF MitarbeiterTyp OID Name Anschrift Ehepartner Kinder PNr Bewerbung . . . Gehalt VARCH AR VARCH AR AdressT yp REF(PersonT yp) REF(PersonTyp) ARRAY[10] INTEG ER CLOB . . . Franke n ORDB und SQL:1999-21 IS-K2002 Einfügungen / Löschungen in Tabellenhierarchien • INSERT an Supertabellen propagiert und DELETE wirkt auf Sub- und Supertabellen Personen PersonTyp INSERT INTO Personen(Name) VALUES('Billy'); ('Billy', ...) DELETE FROM Personen WHERE Name='Joe'; ('Joe', ...) ('Jim', ...) UNDER Mitarbeiter MitarbeiterTyp INSERT INTO Mitarbeiter(Name) VALUES('Joe'); ('Joe', ...) INSERT INTO Mitarbeiter(Name) VALUES('Jim'); ('Jim', ...) DELETE FROM Mitarbeiter WHERE Name='Jim'; IS-K2002 ORDB und SQL:1999-22 Einfügeoperationen INSERT INTO Personen VALUES ('Bernstein', AdressTyp().Strasse('Editharing 31').Ort('Zürich').PLZ(8092).Land('CH'), NULL, NULL); erzeugt eine Person INSERT INTO Mitarbeiter VALUES ('Joe', AdressTyp().Strasse('Kreuzstrasse 15').Ort('Zürich').PLZ(8008).Land('CH'), NULL, NULL, 1234, NULL, NULL, NULL, Franken(5000)); erzeugt einen Mitarbeiter INSERT INTO Mitarbeiter VALUES ('Jim', AdressTyp().Strasse('Helenastrasse 67').Ort('Zürich').PLZ(8008).Land('CH'), NULL, NULL, 6789, NULL, NULL, (SELECT oid FROM Mitarbeiter WHERE Name = 'Joe'), Franken(3500)); erzeugt einen Mitarbeiter Setzen einer Referenz IS-K2002 ORDB und SQL:1999-23 Einfache Beispielanfragen (1) SELECT * FROM Personen; liefert alle Personen, auch die Mitarbeiter SELECT * FROM Mitarbeiter; liefert die vollständigen Tupel der Mitarbeiter SELECT * FROM ONLY(Personen); liefert alle Personen, die keine speziellen Personen (z.B. Mitarbeiter) sind IS-K2002 ORDB und SQL:1999-24 Einfache Beispielanfragen (2) Dereferenzierung über Pfeil-Operator -> SELECT * FROM Mitarbeiter WHERE Vorgesetzter->Name = 'Joe'; Dereferenzierung mit anschliessendem Komponentenzugriff SELECT * FROM Mitarbeiter WHERE Vorgesetzter->Anschrift.PLZ = 8008; Verwendung von CLOB-Prädikaten SELECT Name FROM Mitarbeiter WHERE POSITION('Diplom' IN Lebenslauf) > 0; ORDB und SQL:1999-25 IS-K2002 Referenzen & Deferenzierung • Dereferenzierung mittels DEREF-Operator SELECT DEREF(Ehepartner) FROM Mitarbeiter; • Zuweisen von Referenzen in Updates UPDATE Projekt SET Leiter = (SELECT oid FROM Mitarbeiter WHERE Name = ‘Gates’) WHERE AnzahlMitarbeiter > 10; IS-K2002 ORDB und SQL:1999-26 Methoden-/Funktionsaufrufe • in der SELECT-Klausel SELECT Anzahl(Projekte) FROM Mitarbeiter; • in der FROM-Klausel SELECT Name FROM GuteMitarbeiter(); • liefert einen Wert liefert eine Menge von Mitarbeitertupeln SQL:1999 unterstützt diese Variante nicht! in der WHERE-Klausel SELECT Name FROM Mitarbeiter WHERE Grossverdiener(Gehalt); liefert TRUE oder FALSE ORDB und SQL:1999-27 IS-K2002 Rekursive Anfragen CREATE TABLE Flüge ( Abflug VARCHAR(30), Ziel VARCHAR(30), Carrier VARCHAR(30), Preis Franken ); Abflug Zürich Zürich Frankfurt Sydney Paris WITH RECURSIVE Erreichbar(Abflug, Ziel) AS ( SELECT Abflug, Ziel FROM Flüge UNION SELECT e.Abflug, f.Ziel FROM Erreichbar e, Flüge f WHERE e.Ziel = f.Abflug ) SELECT * FROM Erreichbar WHERE Abflug = 'Zürich'; IS-K2002 Ziel Frankfurt London Sydney New York New York Abflug Zürich Zürich Zürich Zürich Carrier SR BA LH TWA AF Preis 499 599 1099 1549 1299 Ziel Frankfurt London Sydney New York ORDB und SQL:1999-28 Diskussion: Kollektionstypen und Typkonversion CREATE TABLE Mitarbeiter ( PNr INTEGER, Name VARCHAR(30), Anschrift AdressTyp, Vorgesetzter INTEGER, Projekte SET (INTEGER), Fachgebiete LIST (VARCHAR (20)) ); SET/ LIST / MULTISET sind a priori keine TABLEs. Sie werden mit UNNEST zu solchen gemacht zum Zwecke der Anfragen SELECT m.Name FROM Mitarbeiter m WHERE ‘Datenbanken’ IN (SELECT * FROM UNNEST(m.Fachgebiete)); ORDB und SQL:1999-29 IS-K2002 Diskussion: TABLE innerhalb TABLE CREATE TABLE Abteilungen (AbtNr INTEGER PRIMARY KEY, Manager INTEGER REFERENCES Mitarbeiter, Projekte TABLE ( ProjNr INTEGER, ProjName CHAR (30), Budget DECIMAL (10, 2)) ); Finde die Nummer, den Gesamtetat, und den durchnittlichen Lohn jeder Abteilung: SELECT a.AbtNr, TABLE(SELECT FROM TABLE (SELECT FROM WHERE FROM Abteilungen a; IS-K2002 sum (Budget) a.Projekte) AS Gesamtetat, avg (Gehalt) Mitarbeiter m m.AbtNr = a.AbtNr ) AS Durchschnittsgehalt ORDB und SQL:1999-30 Abschliessender Vergleich (1) Konzept RMSDM KL-ONE RM NF 2 OO-Basis ODMG SQL:1999 9 9 Objekttypen atomar/konkret Objekttypen 9 9 9 9 abstrakte Objekttypen 9 - - 9 9 9 Subtypen - - - 9 9 9 9 9 - 9 9 9 (9) (2) 9 - konstruierte Objekttypen - konstruierte Tupel 9 konstruierte Set - (1) konstruierte List - - - - - 9 - konstruierte Bag - - - - - 9 - konstruierte Array - - - - - 9 9 - - - - - (9) Surrogat ORDB und SQL:1999-31 IS-K2002 Abschliessender Vergleich (2) Konzept RMSDM KL-ONE RM NF 2 OO-Basis ODMG SQL:1999 Objektklassen 9 benutzerdefiniert durch prädikat P Subklassen P (9) (4) 9 9 (3) 9 9 (9) 9 - - 9 - - - - 9 9 9 Bemerkungen: (1) Sets treten im RM als Relationen = Menge von (Tupel-)Instanzen auf. Dies sind daher Typenextensionen und erfassen damit benutzerdefinierte Klassen. (2) Sets treten nicht explizit, sondern als mengenwertige Funktionen auf. (3) Objektklassen über CLASS / EXTENT kombination unter INTERFACE (4) In Verbindung mit Rollenrestriktion IS-K2002 ORDB und SQL:1999-32 Literatur • ISO/ANSI/IEC 9075-2: Information Technology - Database Languages - SQL - Part 2: Foundation (SQL/Foundation), September 1999 • J. Melton: Advanced SQL - Understanding the Object-Relational and Other Advanced Features, Features Morgan Kaufmann, 2002 • A. Geppert: Objektrelationale und objektorientierte Datenbanksysteme, Datenbanksysteme dpunkt.Verlag, 2002 • G. Saake, I. Schmitt, C. Türker: Objektdatenbanken - Konzepte, Sprachen, Architekturen, Architekturen International Thomson Publishing, 1997 • A. Heuer: Objektorientierte Datenbanken - Konzepte, Modelle, Standards und Systeme, Systeme Addison-Wesley, 2. Auflage, 1997 IS-K2002 ORDB und SQL:1999-33