1 Teil I Datenmodelle Kapitel 6: Objektorientierte Anfragesprachen.

Slides:



Advertisements
Ähnliche Präsentationen
Imperative Programmierung
Advertisements

PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
der Universität Oldenburg
Systemüberblick Beispiele: Microsoft Access Oracle Ingres Informix
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
Java: Grundlagen der Sprache
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
SQL als Abfragesprache
IS: Datenbanken, © Till Hänisch 2000 CREATE TABLE Syntax: CREATE TABLE name ( coldef [, coldef] [, tableconstraints] ) coldef := name type [länge], [[NOT]NULL],
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
SQL/XML. © Prof. T. Kudraß, HTWK Leipzig 2 2 Motivation Speicherung von XML in allen großen kommerziellen DBMS vorhanden proprietäre Lösungen für die.
Otto-von-Guericke-Universität MagdeburgGamal Kassem Übung 7 Reports mit Datenbankzugriff.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Programmieren mit JAVA
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
Zusammenfassung Vorwoche
SQL 2 Order by null Aggregatfunktionen group by Join subselect.
Objektorientierte DBMS Klassen und Beziehungen Seminar: Verteilte Datenbanken Manuela Fischer.
DVG Klassen und Objekte
Abfragen – Tipps und Tricks Buch S102ff (Informatik I, Oldenbourg-Verlag) Nach einer Vorlage von Dieter Bergmann.
Einführung in die Programmierung Datensammlung
RelationentheorieObjektorientierte Datenbanken AIFB SS Die Objekt-Definitionssprache ODL (1/24) Alle Elemente des Objektmodells können beschrieben.
RelationentheorieObjektorientierte Datenbanken AIFB SS Das ODMG-Objektmodell vs. relationales Modell (1/9) ODMG-Objektmodell Literal_type Atomic_literal.
Kollektionstypen (1) Es sind polymorphe Typkonstruktoren, jeweils als Sorten- und als Klassenkonstruktor (t,v beliebige Typen): –set, Set :Ungeordnete.
Klassen und Schnittstellen Klasse: Definiert Zustandsraum ihrer Instanzen vollständig (Implementierung der Struktur, soweit Voraussetzung für die Methoden-
OQL-Anfragen (1) Alle Punkte, die auf der Null-Ebene liegen: selectstruct (ex : x, ey : y) fromallePunkte wherez = 0 Rückgabetyp: bag > Alle Kanten, die.
Polymorphe Konsistenzbedingungen (1)
1 Gruppierung (1) Motivation: Bisher existierte nur die gesamte Relation als eine einzige Gruppe. Interessanter ist es, Aggregierungen über Teilmengen.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Hauptseminar Datenbanksysteme - Datenbanken und XML - Thema: Type-Checking OQL Queries In The ODMG Type Systems.
Was umfaßt die CORBA Core Spezifikation? Welche zusätzlichen Komponenten muß ein ORB Produkt beinhalten? Core: CORBA Objekt Modell CORBA Architektur OMG.
ODL-Spezifikation von Kunde
Generalisierung/Spezialisierung Subtypisierung/Vererbung
WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R Vorlesung #4 SQL (Teil 1)
SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Vorlesung #7 SQL (Teil 2)
Vorlesung #4 SQL (Teil 1).
WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R Vorlesung #7 SQL (Teil 4)
WS 2013/14 Datenbanksysteme D0 15:15 – 16:45 R Vorlesung #5 SQL (Teil 2)
Befehle in SQL Erläuterungen.
Datenbanksysteme für hörer anderer Fachrichtungen
Einführung in Datenbankmodellierung und SQL
1 Gruppierung, Aggregierung und Sortierung (2) Abarbeitungsmodell bei Gruppierung: Werte from- und where-Klauseln aus wie bisher (Bildung von Kreuzprodukt.
Einfache OQL-Ausdrücke (1) Literale und Objekte können direkt konstruiert werden; gültige Ausdrücke und ihre Typen sind z.B.: "Quader77": string struct(x:1.0,
SQL - Structured Query Language AIFB SS (1/9) Join-Operationen in SQL-92(1/9) Syntax einer Join-Operation: join-op := CROSS JOIN | [NATURAL]
Verdichten von Daten mit Gruppenfunktionen
Datenbanksysteme II Vorlesung WS 2006 / 2007 Paul Manthey
Structured Query Language
Benutzerdefinierte Datentypen (1)
1 Polymorphe Konsistenzbedingungen (1) Polymorphe Konsistenzbedingungen legen fest, welche Arten von Zustandsbeschränkungen nach einer Konkretisierung.
Vorlesung #5 SQL (Teil 2).
1 Sichten-Änderungen (1) Änderungen von Sichten sind i.d.R. problematisch, da sie in entsprechende Änderungen der Basisrelationen überführt werden müssen.
OQL-Anbindung an Java (1) Java als Beispiel für die Einbettung von OQL in eine Programmiersprache Die OQL-Einbettung in Java ist teilweise mit dynamischem.
Persistenz: Objekt-Lebensdauer In RDBMS wird Lebensdauer von Werten durch ihren Typ festgelegt: Instanzen von Relationstypen sind persistent, alle anderen.
Tupelkalkül: Notation (1)
Objekte und Literale ODMG-Objektmodell kennt zwei Arten von Datenelementen: Literale: Identität ist ausschließlich durch Wert gegeben. Nur maximal eine.
RelationentheorieObjektorientierte Datenbanken  AIFB SS Anfragen auf Sammlungen(1/29) OQL besteht aus einer Menge von Anfrageausdrücken, die.
Motivation Motivation für objektorientierte DBMS (ODBMS): –„Impedance Mismatch“ zwischen relationalem Datenmodell und Programmiersprachen-Datenmodell erfordert.
RelationentheorieObjektorientierte Datenbanken  AIFB SS C++-ODL (1/6) Erweiterung des deklarativen Teils einer C++-Klasse Datentypen d_String,
WS 2014/15 Datenbanksysteme D0 15:15 – 16:45 R Vorlesung #6 SQL (Teil 3)
1 Syntaktische Grundform selectA 1, A 2, …, A n fromR 1, R 2, …, R m wherebedingung w ;
Objektorientierte Datenbanken zBeim vorigen Mal: yDer Object Data Standard der ODMG-Group xKurz: ODMG-Standard yDie POET-Implementierung FastObjects (t7)
Tutorium Software-Engineering SS14 Florian Manghofer.
Vorlesung #5 SQL (Teil 2).
 Präsentation transkript:

1 Teil I Datenmodelle Kapitel 6: Objektorientierte Anfragesprachen

2 Der ODMG-Standard für ODBMS ODMG = Object Database Management Group, gegründet 1991 als Arbeitskreis von ODBMS-Herstellern. Ziel: Entwicklung eines Standards für die objektorientierte Datenhaltung (ODBMS, ORDBMS,...). Stand: ODMG-Standard Version 3.0 (2000) definiert: sprachneutrales Objektmodell, Object Definition Language (ODL), Object Interchange Format (OIF) und Object Query Language (OQL), Sprachanbindungen des Objektmodells an C++, Java, SmallTalk. Mehrheit der Produkte unterstützt ODMG, allerdings oft ohne ODL, OIF, OQL.

3 Object Definition Language (ODL) Im Gegensatz zu SQL sind DML und DDL im ODMG- Standard getrennt: Schema einer ODMG-Datenbasis wird in ODL spezifiziert. (Interaktive) Datenmanipulation erfolgt in OQL. ODL ist reine Daten-Definitionssprache, Programmierung von Methoden muss in Wirtssprache Java, C++ oder SmallTalk erfolgen. Praxisrelevanz von ODL begrenzt, da DB-Schema oft per Schemagenerator direkt aus Applikation gewonnen wird.

4 Kollektionstypen ODMG-Objektmodell definiert folgende Literal- bzw. Klassenkonstruktoren für Kollektionen (t,v beliebige Typen): set, Set :Ungeordnete Menge ohne Duplikate bag, Bag :Ungeordnete Menge mit Duplikaten list, List :Geordnete Menge mit Duplikaten array, Array :Funktion von {1, 2,..., n} nach t Alle Kollektionstypen implementieren das Interface Collection mit (u.a.) folgenden Operationen: insert_element() remove_element() is_empty() cardinality() contains_element() create_iterator()

5 Konsistenz: Schlüssel class Vielflächner (extent alleVielflächner key vName ) {attribute string vName; attribute float oberfläche; relationship set flächen inverse Fläche::körper; void translation(in Punkt p) }; Bedeutung einer key-Spezifikation: ODBMS erzwingt, dass Vielflächner-Instanzen mit verschiedenen Objekt-Identifikatoren auch verschiedene vname-Werte haben. Objekt-Identifikator ist dennoch separat von vname-Wert (letzterer kann sich ändern, ersterer nicht).

6 Referenzielle Konsistenz class Vielflächner (extent alleVielflächner key vName ) {attribute string vName; attribute float oberfläche; relationship set flächen inverse Fläche::körper; void translation(in Punkt p) }; class Fläche { relationship set körper inverse Vielflächner::flächen; } Nur zweistellige Beziehungen können spezifiziert werden. Unterschied zwischen Beziehungen und einfachen objektwertigen Attributen: ODBMS sorgt bei Beziehungen für Wahrung der referenziellen Konsistenz.

7 Object Query Language (OQL) ODMG-Standard spezifiziert Object Query Language (OQL) als deklarative Anfragesprache für ODMG-Objektmodell. Entwurfsprinzipien: Weitgehende Kompatibilität mit SQL-92. Strenge Typisierung: Alle Ausdrücke haben statisch bestimmbare Typen innerhalb des ODMG-Typsystems. Orthogonalität: Alle Ausdrücke können, soweit ihre Typen verträglich sind, beliebig kombiniert werden; keine syntaktischen Ausnahmen und Sonderstellungen für spezielle Typen. Wahrung der Objektkapselung: Objektänderungen nur durch Aufruf entsprechender Methoden. In existierenden ODBMS allerdings noch nicht sehr verbreitet, daher im Folgenden nur kursorische Präsentation.

8 Beispielschema class Punkt ( extent allePunkte ) { attribute float x; attribute float y; attribute float z; void translation(in Punkt p); }; class Kante { ( extent alleKanten ) { attribute Punkt p1; attribute Punkt p2; void translation(in Punkt p); float länge() }; class Fläche { ( extent alleFlächen ) { attribute string fName; attribute set kanten; relationship Vielflächner körper inverse Vielflächner::flächen; void translation(in Punkt p); float fläche() }; class Vielflächner ( extent alleVielflächner key vName ) { attribute string vName; attribute float oberfläche; relationship set flächen inverse Fläche::körper; void translation(in Punkt p); }; class Quader extends Vielflächner ( extent alleQuader ) { float volumen(); };

9 Einfache OQL-Ausdrücke (1) Literale und Objekte können direkt konstruiert werden; gültige Ausdrücke und ihre Typen sind z.B.: "Quader77": string struct(x:1.0, y:2.0, z:0.0) struct Punkt(x:1.0, y:2.0, z:0.0) Punkt Kante(Punkt(x:1.0, y:2.0, z:0.0), Punkt(x:1.0, y:2.0, z: 0.0)) Kante bag(1,1,2,3,3) bag set(1,2,3,4,5) set

10 Einfache OQL-Ausdrücke (2) Klassen mit Extensionen: Extensionen für Klassen nur, wenn im Schema vereinbart allePunkte set liefert Menge der dauerhaften Instanzen der Klasse Punkt Klassen ohne Extension: Dann sind alle Instanzen nur indirekt durch Referenzierung zugänglich Beispiel: Wenn Punkt keine Extension hätte, wären Punkte nur noch z.B. über Kante erreichbar

11 Einfache OQL-Ausdrücke (3) Funktionen über Ausdrücken ergeben wieder Ausdrücke, z.B. abs, not t tt numerischer bzw. boolescher Typ +, -, *, /, mod t t tt numerischer Typ Aggregatfunktionen über Ausdrücken sind auch möglich count: collection unsigned longt beliebig min, max, sum, avg: collection tt numerisch Beachte: collection ist Obertyp von set, bag, list etc. und somit substituierbar

12 OQL-Pfadausdrücke Attribut- und Methodenzugriffe erfolgen mit "."-Operator: p.x floatp sei Verweis auf Punktobjekt Pfadausdrücke können mehrere Stufen aufweisen: k.p1.x floatk sei Verweis auf Kanteobjekt Trifft gleichermaßen zu auf tieferes Eindringen in ein komplexes Objekt entlang struct oder auf Fortschreiten über mehrere Objekte entlang der Referenzen (dann automatisches Dereferenzieren). Bei Methoden können Parameterlisten angegeben werden: k.translation( Punkt(x:1.0, y:2.0, z:0.0) ) void

13 OQL-Bedingungen Elementare Vergleiche (!=, =,, like) und boolesche Kombinationen wie in SQL. Etwas andere Form der Quantifizierung: exists x in e : c for all x in e : c wobei e Ausdruck mit Kollektionstyp und c Bedingung, z.B. (f Verweis auf Flächenobjekt): exists k in f.kanten : k.p1.x = 0.0 Diverse Kurzformen existieren als Zugeständnis an SQL: x in eals Kurzform fürexists y in e : x = y x all eals Kurzform fürfor all y in e : x y x any eals Kurzform fürexists y in e : x y

14 Select-Ausdrücke Gegenüber SQL geringfügig andere Syntax: select[distinct] e from[x 1 in] e 1, [x 2 in] e 2,..., [x n in] e n [wherec] [order byf 1,..., f m ] e 1...e n Ausdrücke mit Kollektionstypen, e beliebiger Ausdruck, f 1...f m Ausdrücke mit atomaren oder strukturierten Literaltypen, c Bedingung und x 1...x n optionale Variablendeklarationen. Typ eines select-Ausdrucks ist (mit t = Typ von e): list wenn order by angegeben wurde, set wenn distinct, aber nicht order by angegeben wurde, bag wenn weder distinct noch order by angegeben wurde.

15 Semantik von Select-Ausdrücken (1) Semantik ist analog zu SQL. Auswertung eines Select-Ausdrucks (vereinfachte Version): 1.Werte Ausdrücke e 1...e n in from-Klausel aus und konvertiere Ergebnisse in Bags b 1...b n. 2.Kartesisches Produkt: Bilde alle Tupel x 1...x n mit x i b i. 3.Eliminiere Tupel, die Bedingung c aus where-Klausel nicht erfüllen. 4.Werte auf jedem verbleibenden Tupel Ausdruck e aus select- Klausel aus und füge Resultat in Ergebnis ein. 5.Falls distinct spezifiziert wurde, eliminiere Duplikate 6.Falls order by spezifiziert wurde, sortiere Ergebnis nach Werten der Ausdrücke f 1...f m.

16 Semantik von Select-Ausdrücken (2) Gruppierung analog zu SQL: select … from… where … [group by y 1 : g 1, y 2 : g 2,..., y n : g n ] [havingc] g 1...g n Ausdrücke mit Kollektionstypen, c Bedingung und y 1...y n nichtoptionale Bezeichner. Angabe von group by wird jedoch nicht benötigt, da geschachtelte Ergebnisse direkt spezifiziert werden können Beispiel: Typ set >> beschreibt Punkte gruppiert nach Namen von Vielflächnern.

17 Semantik von Select-Ausdrücken (3) Erweiterte Syntax (Ausschnitt): selecte(x 1, x 2, …, x n, x n+1, …, x n+p ) fromx 1 in e 1 (x n+1, …, x n+p ), x 2 in e 2 (x 1, x n+1, …, x n+p ), x 3 in e 3 (x 1, x 2, x n+1, …, x n+p ), …, x n in e n (x 1, x 2, …, x n-1, x n+1, …, x n+p ) Was bei Abhängigkeiten zwischen den x i ? Auswertung eines select-Ausdrucks (erweiterte Version): 1.Werte Ausdrücke e 1...e n in from-Klausel aus und konvertiere Ergebnisse in Bags b 1...b n. 2.Bilde alle Tupel x 1...x n mit x i b i wobei die Abhängigkeiten zwischen den x i sich nun als Joins auswirken. Existieren keine Abhängigkeiten, degeneriert dieser Schritt wieder zu einem einfachen kartesischen Produkt bleiben gleich.

18 OQL-Anfragen (1) Alle Punkte, die auf der Null-Ebene liegen: selectstruct (ex : x, ey : y) fromallePunkte wherez = 0 Rückgabetyp: bag > Alle Kanten, die zu Flächen mit mindestens vier Kanten gehören: selectstruct (kp1 : k.p1, kp2 : k.p2) fromf in alleFlächen, k in f.kanten wherecount (f.kanten) >= 4 Rückgabetyp: bag > Impliziter Join!

19 OQL-Anfragen (2) Dieselbe Anfrage, aber gruppiert nach Flächen: selectstruct (fläche: f.fName, punkte: (select struct (kp1 : p1, kp2 : p2) from f.kanten)) fromf in alleFlächen wherecount (f.kanten) >= 4 Rückgabetyp: bag >>> Beachte: Gruppierung ohne group by

20 OQL-Anfragen (3) Ergebnis kann Resultat von Operatoraufrufen enthalten z.B.: selectvolumen() fromalleQuader Länge aller Kanten von großen Flächen: selectk.länge fromf in alleFlächen, k in f.kanten wheref.fläche > Vielflächner mit großen Flächen: selectvName fromalleVielflächner wherefor all f in flächen : f.fläche() > 100.0

21 OQL-Anfragen (4) Aggregierung nach Gruppen, z.B. zuerst Gruppierung der Quader nach Oberfläche, dann Berechnung des mittleren Volumens über alle Quader mit dieser Oberfläche, dies aber nur für Oberflächen über 20: selectstruct (ofläche, dvolumen: avg( volumen() ) fromalleQuader group byofläche : oberfläche havingoberfläche >= 20.0 Rückgabetyp: bag >

22 OQL-Anfragen (5) Auch die Sortierungsklausel existiert in OQL, z.B.: select fromalleQuader order byoberfläche desc, volumen() asc Es kann nach mehreren Attributen bzw. Methodenresultaten sortiert werden Aufsteigend: asc (Voreinstellung) Absteigend: desc

23 OQL-Anfragen (6) Gesamtzahl aller Kanten, die aus dem Nullpunkt entspringen: count(select fromalleKanten wherep1.x = 0.0 andp1.y = 0.0 andp1.z = 0.0) Ergebnistyp: unsigned long Bemerkung: OQL erlaubt (als Tribut an SQL) auch Syntax selectcount ( ) fromalleKanten wherep1.x = 0.0 andp1.y = 0.0 andp1.z = 0.0)

24 OQL-Anfragen (7) Liste aller Flächen mit Umfang über 1000: selectf fromf in alleFlächen where1000 < sum(selectk.länge fromk in f.kanten) Ergebnistyp: bag

25 Vordefinierte Anfragen Anfragen können in OQL parametrisiert und vordefiniert werden, z.B.: define oberflächeZuName(x) as selectoberfläche fromalleVielflächner wherevName = x oberflächeZuName(x) kann jetzt in anderen Anfragen wiederverwendet werden.

26 OQL-Anbindung an Java (1) Java als Beispiel für die Einbettung von OQL in eine Programmiersprache Die OQL-Einbettung in Java ist teilweise mit dynamischem SQL zu vergleichen OQL-Anfrage wird als Zeichenkette angegeben OQL kann von Java aus auf zwei Wegen angesprochen werden: Mit einer Methode der Collection -Schnittstelle Über die generische OQLQuery -Klasse

27 OQL-Anbindung an Java (2) Ausschnitt aus der Collection-Schnittstelle: interface Collection { Collection query(String predicate);...} Beispiel (alle Vielflächner, die Fünfecke enthalten): Set körperMitfünfEck = (Set)meineVielflächner.query( exists f in flächen : count(f.kanten) = 5); Äquvalente OQL-Query: select frommeineVielflächner whereexists f in flächen : count(f.kanten) = 5 Diese Form der Anfrage legt den select- und from-Teil der Anfrage bereits durch den Elementtyp der Kollektion fest

28 OQL-Anbindung an Java (3) Die Verwendung der query-Methode ist zwar sehr einfach, doch hat sie einige Nachteile: Anfragen können nicht parametrisiert werden Ausnahme: Anfragen über dynamisch zusammengebaute Zeichenketten DBMS bekommt jedoch immer ihm unbekannte Zeichenketten, die immer neu zu analysieren und optimieren sind! Anfragen können nicht wiederverwendet werden Auch hier gilt: Wiederverwendung über Zeichenketten ist nur die halbe Lösung. Das DBMS bekommt davon nichts mit. Beispiel: Alle Vielflächner, die Sechsecke enthalten... Alle Vielflächner, die n-Ecke enthalten

29 OQL-Anbindung an Java (4) Diese Nachteile behebt die generische OQLQuery- Schnittstelle: interface OQLQuery { public create(String query); public bind(Object parameter); public Object execute(); } Ein OQLQuery -Objekt wird zunächst mittels einer Fabrikmethode des DBMS erzeugt. create() erzeugt eine Anfrage wie bei der query-Methode, ohne sie jedoch auszuführen, Parameter haben die Syntax $1, $2, $3 etc. bind() bindet aktuelle Parameter an die formalen, wobei die Reihenfolge eine Rolle spielt: beim ersten Aufruf wird das Parameterobjekt an $1 gebunden, usw. execute () führt die Anfrage schließlich aus, und liefert eine passende Kollektion in Form eines Objektes zurück.

30 OQL-Anbindung an Java (5) Beispiel für den Einsatz von OQLQuery : Liefere alle Vielflächner, die n Ecken enthalten und eine gewisse Mindestoberfläche vorweisen können! // Java // statische (einmalige) Initialisierung OQLQuery query = dbms.newOQLQuery(); query.create( select * from alleVielflächner where exists f in flächen : count(kanten) = $1 and oberfläche >= $2);... // Methode mit Parameterübergabe und Ausführung public Set vielFlächnerMitNEcken(long n, float f) { Long anzahl = new Long(n); Float minOberfläche = new Float(f); query.bind(anzahl); query.bind(minOberfläche); return (Set)query.execute(); };