Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

1 Teil I Datenmodelle Kapitel 6: Objektorientierte Anfragesprachen.

Ähnliche Präsentationen


Präsentation zum Thema: "1 Teil I Datenmodelle Kapitel 6: Objektorientierte Anfragesprachen."—  Präsentation transkript:

1 1 Teil I Datenmodelle Kapitel 6: Objektorientierte Anfragesprachen

2 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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. 3.-6. bleiben gleich.

18 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 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 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 > 100.0 Vielflächner mit großen Flächen: selectvName fromalleVielflächner wherefor all f in flächen : f.fläche() > 100.0

21 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 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 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 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 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 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 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 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 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 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(); };


Herunterladen ppt "1 Teil I Datenmodelle Kapitel 6: Objektorientierte Anfragesprachen."

Ähnliche Präsentationen


Google-Anzeigen