Upload
marthe-worms
View
102
Download
0
Embed Size (px)
Citation preview
Karczewski Datenbanken II 1
Objekt-Relationale (OR) Datenbanken
Übersicht
• Einführung: Objekt-relationale Erweiterungen von SQL (ORSQL) • Objekte und Tabellen • OR-Create, -Insert, -Update, -Select• User-Defined Functions (UDFs) und Methoden
Literatur
O´Neil / O´Neil: Database – Principles, Programming, and Performance, 2nd Edition. Morgan Kaufmann Publishers, 2001.
Karczewski Datenbanken II 2
ORSQL Möglichkeiten
Relationale Tabellendefinitionen werden erweitert durch user defined types:Spalten, die mehr als einen Eintrag besitzen und solche, die eine interne Struktur haben (wie ein Record), sind erlaubt (Verletzung 1NF).Beispiel:
eid ename position dependents
dep_name dep_age
e01 Smith, John Agent Michael J. 9Susan R. 7
e02 Andrews, David Superintendent David M. Jr. 10
e03 Jones, Franklin Agent Andrew K. 11Mark W. 9Louisa M. 4
Karczewski Datenbanken II 3
Objekte und Tabellen
Ein Objekt-Typ besitzt Attribute unterschiedlicher Typen, analog zu Spalten einer Tabelle.
Beispiel (Oracle):
create type name_t as object -- „Create Object Type“(
lname varchar(30), -- last namefname varchar(30), -- first namemi char(1) -- middle initial
);/ -- SQL*Plus
Karczewski Datenbanken II 4
Nach der Definition eines Typs (mit „create type“) kann man diesen so definierten Typ wie ein gewöhnliches Attribut benutzen.
Beispiel (Oracle):
create table teachers -- „Create Table Scheme“(
tid int, -- identifiertname name_t, -- object type defined aboveroom int -- room number
);
Bis hierher existieren noch keine Objekte vom Typ name_t.
Objekte und Tabellen
Karczewski Datenbanken II 5
Einträge in die zuvor definierte Tabelle sind wie in SQL durch den insert-Befehl möglich. Insert wird erweitert um die Möglichkeit, Objekt-Typen zu integrieren. Dies geschieht durch Benutzung eines Objekt-Konstruktors in dem insert-Befehl.
Beispiel (Oracle):
insert into teachers values (
1234, name_t(’Einstein’, ’Albert’, ’E’), 120
);
Objekt-Konstruktor
Objekte und Tabellen
Karczewski Datenbanken II 6
Nach Ausführung des insert-Befehls liegt folgender Tabelleninhalt vor:
Beispiel (Oracle):
tid
1234
tnamelname fname miEinstein Albert E
room
120
Objekte und Tabellen
Karczewski Datenbanken II 7
Die Punkt-Notation wird konsequent genutzt, um Werte des Objekt-Typs zu nutzen:
select t.tid from teachers t where t.room = 120; -- normal SQL-select
select t.tid, t.tname.fname, t.tname.lnamefrom teachers twhere t.room = 123; -- extended SQL
select tid, tname.fname, tname.lnamefrom teacherswhere room = 123; -- doesn´t work
Der alias t muss verwendet werden, damit die mehrfache Punkt-Notation funktioniert.
Objekte und Tabellen
Karczewski Datenbanken II 8
Man kann die Objekt-Typ-Definition innerhalb einer anderen Objekt-Typ-Definition verwenden.
Beispiel:
create type person_t as object (
ssno int,pname name_t, -- must be defined firstage int
);/
person_t ist abhängig von name_t, d.h. man kann name_t nicht löschen bevor person_t gelöscht ist.
Objekte und Tabellen
Karczewski Datenbanken II 9
Eine Tabelle wird Objekt-Tabelle genannt, wenn ihre Zeilen vom Objekt-Typ sind. Das bedeutet: Jede Zeile enthält ein Objekt dieses Typs.
Beispiel:
create table people of person_t(
primary key(ssno));
Objekte und Tabellen
Karczewski Datenbanken II 10
Beispiel-Tabelle people:
nameless top-levelcolumn (Zeilen-Objekte)
named columns (alsoknown as top-levelattributes)
attributes within pname
row 1
row 3
row 2
ssno
123550123
023894455
245882134
pname
pname.lname pname.fname pname.mi
Sanchez Jose F
Delaney Patrick X
March Jacquelin E
age
23
30
59
people
row objectscolumn objectsselect *
select value(p)
Objekte und Tabellen
Karczewski Datenbanken II 11
select p.age from people p where p.ssno = 123550123 (wie bei SQL)
select p.pname from people p where p.age > 25Spalten werden mit vorangestelltem Typ ausgegeben, z.B. name_t(´Sanchez´, ´Jose´, ´F´)
select * from people p where p.age > 25Liefert die top-level Attribute (row objects)
ssno pname(lname,fname,mi) age--------- ------------------------------- ----245882134 name_t(´Delaney´,´Patrick´,´X´) 59023894455 name_t(´Sanchez´,´Jose´,´F´) 30
Objekte und Tabellen (select-statements)
Karczewski Datenbanken II 12
select value(p) from people p where age > 25Die Zeilen-Objekte werden ausgegeben (nameless top level column). Value(p) ist nicht zu verwechseln mit VALUES im insert-Befehl.
Value(p) (ssno, pname(lname,fname,mi), age)-------- ------ ---------------------- ----person_t (245882134, name_t(´Delaney´,´Patrick´,´X´), 59)person_t (023894455, name_t(´Sanchez´,´Jose´,´F´), 30)
Person_t ist der Objekt-Konstruktur, mit dem die Tabelle definiert wurde. Das Ergebnis ist ein anderes als das beim „select *“-Befehl.
Durch den Objekt-Konstruktor gibt es eine (neue) Objekt-Sicht auf die Zeilen der Tabelle.
Objekte und Tabellen (select-statements)
Karczewski Datenbanken II 13
select value(p) from people p where p.pname = name_t(´Sanchez´,´Jose´,´F´)
Der Objekt-Konstruktor „name_t(´Sanchez´,´Jose´,´F´)“ kann auch innerhalb der where-Klausel verwendet werden.
Value(p) (ssno, pname(lname,fname,mi), age)-------- ------ ---------------------- ----person_t (023894455, name_t(´Sanchez´,´Jose´,´F´), 30)
Objekte und Tabellen (select-statements)
Karczewski Datenbanken II 14
select p.pname, p.age from people pwhere p.pname.fname like ‘Pat%‘ and p.age > 50;
“Nested dot”-Notation ist erlaubt. Der Vorname startet mit Pat und das Alter ist größer als 50.
pname(lname,fname,mi) age--------------------- ---name_t(´Delaney´,´Patrick´,´X´) 59
Objekte und Tabellen (select-statements)
Karczewski Datenbanken II 15
Wichtig: Man muss immer den vollqualifizierten Namen mit einem Alias verwenden, um auf strukturierte Attribute zuzugreifen.
select pname.fname from peoplepname.fname ist kein Top Level-Attribut -> Der Befehl funktioniert so nicht.
select people.pname.fname from peopleAuch hier muss ein Alias benutzt werden. Das Voranstellen des Tabellennamen nutzt nichts. -> Der Befehl funktioniert so nicht.
select p.pname.fname from people p;Korrekte Alternative!
Objekte und Tabellen (select-statements)
Karczewski Datenbanken II 16
create table scientists of name_t(primary key (lname));Generierung der Tabelle mit Namen “scientists” des zuvor definierten Objekt-Typs “name_t”.
insert into scientists select p.pname from people p;Insert mit Einfügen mehrerer Zeilen durch Selektion aller “pnames” von “people”. In diesem Fall werden alle Namen aus people eingefügt.
insert into scientists values (‘Einstein’, ‘Albert’, ‘E’);Direktes Einfügen einer Zeile mit dem insert-Befehl.
Objekte und Tabellen (create und insert)
Karczewski Datenbanken II 17
update scientists s set s = name_t(‘Eisenstein’, ‘Andrew’, ‘F’) where values(s) = name_t(‘Einstein’, ‘Albert’, ‘E’);Update einer Zeile mit Hilfe des Objekt-Konstruktors name_t.
insert into people values (123441998, name_t(’Einstein’, ’Albert’, ’E’), 100);Einfügen einer Zeile in “scientists” mit direkten Werten. Der Objekt-Konstruktor name_t ist nötig bei dem strukturierten Attribut.
insert into people values (321341223, null, null);insert into people (ssno) values (321341223);Zwei äquivalente Befehle, um unvollständige Zeilen mit NULL-Werten einzugeben. “pname” und “age” müssen optional sein.
Objects and Tables (insert)
Karczewski Datenbanken II 18
update people p set p.pname = name_t(‘Gould’, ‘Ben’, null) where ssno = 321341223;Update einer Zeile mit NULL-Werten. Der “middle initial” bleibt NULL.
update people p set p.pname.mi = ‘C’ where ssno = 321341223; Update des “middle initial” der vorherigen Änderung.
update people p set p = Person_t(332341223, name_t(‘Gould’, ‘Glen’, ‘A’), 55)
where ssno = 321341223; Update einer Person mit dem “row object”-Konstruktor. Auch der primary key ssno darf verändert werden.
Objects and Tables (update)
Karczewski Datenbanken II 19
Relational / Objekt-Relational
Produkt: Nummer Bezeichnung
Funktion
110222 Tee-Service
Gebrauch
106222 Kanne Gebrauch
201312 Schale Deko
Karczewski Datenbanken II 20
Relational / Objekt-Relational
Markt: Bezeichnung Standort Kategorie
Internationaler Töpfermarkt
Krefeld Töpfermarkt
Töpfermarkt Sommerhausen
Sommerhausen
Töpfermarkt
Internationaler Töpfermarkt
Hanau Töpfermarkt
Karczewski Datenbanken II 21
Relational / Objekt-Relational
WAA: Nummer Bezeichnung Standort
110222 Internationaler Töpfermarkt
Krefeld
106222 Internationaler Töpfermarkt
Krefeld
201312 Töpfermarkt Sommerhausen
Sommerhausen
201312 Internationaler Töpfermarkt
Hanau
Karczewski Datenbanken II 22
Beispiel ORDB
Markt: Bezeichnung Standort Kategorie Marktteilnehmer
Nummer Bezeichnung Funktion
Internationaler Töpfermarkt
Krefeld Töpfer-markt
110222 Tee-Service Gebrauch
106222 Kanne Gebrauch
Töpfermarkt Sommerhausen
Sommer-hausen
Töpfer-markt
201312 Schale Deko
Internationaler Töpfermarkt
Hanau Töpfer-markt
201312 Schale Deko
Karczewski Datenbanken II 23
Beispiel ORDB
Markt
BezeichnungStandortKategorieCollection of Produkt_T
Karczewski Datenbanken II 24
Beispiel ORDB
Karczewski Datenbanken II 25
Beispiel ORDB
Karczewski Datenbanken II 26
Beispiel ORDB
Karczewski Datenbanken II 27
Beispiel ORDB
Karczewski Datenbanken II 28
Beispiel ORDB
Karczewski Datenbanken II 29
Beispiel ORDB
Karczewski Datenbanken II 30
Beispiel ORDB
Karczewski Datenbanken II 31
Beispiel ORDB
Karczewski Datenbanken II 32
Beispiel ORDB
Karczewski Datenbanken II 33
Beispiel ORDB
Karczewski Datenbanken II 34
User Defined Functions (UDF) können zur Bindung von Funktionen an Objekte genutzt werden (Methoden-Begriff).
Die Definition von UDFs erfolgt in zwei Schritten:1. Definition des Funktionskopfes (function header)2. Definition des Funktionsrumpfes (function body)
Der function header wird zusammen mit den Attributen des Objekttyps definiert.
Der function body wird definiert mit einem speziellen Kommando mit einer Referenz zum header.
User Defined Functions
Karczewski Datenbanken II 35
Beispiel (Personen und ihre Mitarbeiter (dependents)):
create type name_t as object -- „Create Object Type“(
lname varchar(30), -- last namemi char(1), -- middle initialfname varchar(30)-- first name
);/
create type person_t as object (
ssno int,pname name_t, -- must be defined firstage int
);/
create type depPerson_t as table of person_t;/
User Defined Functions
Karczewski Datenbanken II 36
Example (Function Header):
create type Employee_t as object( ENR int,
Person person_t,depPerson depPerson_t,member function NumberOfDepreturn integer,member function BigBossreturn varchar
);/
Die function header (auch mehrere möglich) werden hinter allen Attribut-Definitionen definiert. Die Schlüsselwörter “member function” und “return” mit entsprechendem Datentyp sind notwendig.
User Defined Functions
Karczewski Datenbanken II 37
Beispiel (Funktionsrumpf):
create type body Employee_t asmember function NumberOfDepreturn integer isbegin
return self.depPerson.count;end NumberOfDep;
member function BigBossreturn varchar isbegin
if self.depPerson.count > 2then return 'Big Boss';else return 'Boss';end if;
end BigBoss;end;/
User Defined Functions
Der Rumpf der Funktionen erhält den selben Namen wie der zuvor definierte Objekt-Typ (Verbindung zwischen Kopf und Rumpf).
Der Name und return-Typ muss hier wiederholt werden.
Innerhalb “begin” und “end” wird die Funktion definiert.
Mindestens ein return-Befehl ist nötig.
Karczewski Datenbanken II 38
Beispiel (Tabellen-Definition):
create table Employee of Employee_t(
primary key (ENR)) nested table depPerson store as dep_tab;
User Defined Functions
Diese Tabellendefinition realisiert die gewünschte Tabelle.
Der Primärschlüssel kann erst hier definiert werden.
Die “nested table”-Klausel erlaubt die Nutzung von Tabellen innerhalb der Tabelle.
Möglich sind auch mehrere “nested tables” innerhalb einer Tabelle.
Karczewski Datenbanken II 39
Beispiel (Insertion):
insert into Employee values (1, person_t(11, name_t('Josef', 'R', 'Ewing'), 59), depPerson_T(person_t(33, name_t('Franz', 'X', 'Nonsense'), 33), person_t(44, name_t('Uschi', 'K', 'Glas'), 48), person_t(55, name_t('Mika', 'L', 'Most'), 52)));
insert into Employee values (2, person_t(22, name_t('Karla', 'M', 'Hut'), 34), depPerson_T(person_t(66, name_t('Hans', 'L', 'Moser'), 72), person_t(77, name_t('Paul', 'A', 'Popp'), 41)));
User Defined Functions
Das Einfügen geschieht wie bisher. Die UDFs ändern das bisherige Vorgehen nicht!
Karczewski Datenbanken II 40
Beispiel (Selection):
select ENR, E.NumberOfDep() from Employee E;
ENR E.NUMBEROFDEP()---------- --------------- 1 3 2 2
User Defined Functions
Beispiel (Selection):
select ENR, E.BigBoss() from Employee E;
ENR E.BIGBOSS()---------- ------------
1 Big Boss2 Boss
Der Resultat-Wert des Funktionsaufrufs wird als eigene Spalte ausgegeben.Die Klammern müssen angegeben werden.Der alias ist Pflicht!
Karczewski Datenbanken II 41
Beispiel ORDB (UDF)
Karczewski Datenbanken II 42
Beispiel ORDB (UDF)
Karczewski Datenbanken II 43
Beispiel ORDB (Ref)
Produkt
Nummer: intBezeichnung: StringFunktion: StringSubprodukt: collection of Produkt
anzsub: int… weitere Methoden zur Stückliste
Karczewski Datenbanken II 44
Beispiel ORDB (Ref)
Karczewski Datenbanken II 45
Beispiel ORDB (Ref)
Karczewski Datenbanken II 46
Beispiel ORDB (Ref)
Karczewski Datenbanken II 47
Beispiel ORDB (Ref)
Karczewski Datenbanken II 48
Beispiel ORDB (Ref)
Karczewski Datenbanken II 49
Beispiel ORDB (Ref)