Objektové databáze a OQL

Post on 14-Jan-2016

64 views 0 download

description

Objektové databáze a OQL. Jakub Kotrla Ondřej Kmoch Vlastimil Menčík. Obsah. ODMG objektový model jazyky pro specifikace objektů mapování modelu do programovacích jazyků OQL. Historie ODMG. počátky práce v roce 1991 ODMG 1.0 v roce 1993 ODMG 3.0 v roce 2000 - PowerPoint PPT Presentation

transcript

Objektové databáze a OQL

Jakub KotrlaOndřej Kmoch

Vlastimil Menčík

Obsah

• ODMG objektový model• jazyky pro specifikace objektů• mapování modelu do programovacích

jazyků• OQL

Historie ODMG

• počátky práce v roce 1991• ODMG 1.0 v roce 1993• ODMG 3.0 v roce 2000• v roce 2001 pracovní skupina rozpuštěna

Objektový model ODMG

• vychází z objektového modelu OMG• definuje, co to jsou objekty, literály,

typy, atributy, operace, vztahy apod.• designér aplikace používá objektový model

ODMG k vytvoření objektového modelu aplikace

• výsledkem je ODMS schéma pro konkrétní aplikaci (v ODL)

Základy objektového modelu

• primitiva object, literal• jsou nějakého typu

– objekt (objektový typ), instance typu– literál (literálový typ), literál („proměnná“)

• rozsah stavů objektu – množina vlastností(atributy a vztahy k jiným objektům)

• stav objektu - hodnoty vlastností• chování objektu - množina operací

Typy – externí specifikace typu

• jen jedna• popisuje typ zvenku pro uživatele typu• implementačně nezávislá• definuje vlastnosti, operace a výjimky,

které mohou operace vyhodit

• definice rozhraní (interface) – operace objektového typu• definice třídy (class) – stav a operace objektového typu• definice literálu (literal) – stav literálového typu

Rozhraní, třída, literál

Rozhraní Třída Literál

Chování - operace

Stav -vlastnosti

Typy – implementace typu

• jedna či více• reprezentace - mapování vlastností

objektu do programovacího jazyka• metody - těla/kód funkcí

• interní metody• mapování literálových typů

Dědičnost

• ISA vztah• jen chování objektu – předek může být jen

rozhraní• vícenásobná• polymorfismus

• interface Prijimac {…};interface Vysilac {…};class Vysilacka : Prijimac, Vysilac {…};

EXTEND

• dědění stavu i chování objektu• jednoduchá dědičnost mezi dvěma třídami

• class Osoba {…};class Zamestnanec : Osoba {…};

Extent typu

• množina všech instancí daného typu v rámci jednoho ODMS

• je udržována volitelně• reflektuje dědičnost typů

(Extent podtypu je podmnožina extentu typu)

Klíče

• vlastnost jednoznačně určující instanci• analogie z relačního modelu

• jednoduché (single) - jedna vlastnost• složené (compound) – množina více

vlastností

Hierarchie typů

Literal_type

Object_type

Atomic_literal (short, long long, boolean, char…)

Collection_literal (set<>, bag<>, list<>, array<>, dictionary<>)

Structured_literal (date, time, timestamp, interval, structure<>)

Atomic_object – definovány uživatelem

Collection_object (Set<>, Bag<>, List<>, Array<>, Dictionary<>)

Structured_object (date, time, timestamp, interval)

Objekty

• vytváření pomocí factory interface - new (součást mapování jazyka)

• základní rozhraní:interface Object {

enum Lock_Type(read, write, upgrade);void lock(in Loct>Type mode raises(LockNotGtranted);boolean try_lock(in Lock_Type mode);boolean same_as(in Object anObject);Object copy();void delete();

}

Objekty - identifikace

• každý objekt má svůj identifikátor, jedinečný v rámci ODMS

• stálý – během života objektu se nezmění• generován ODMS• Používán v operaci Object::same_as()

• objekt může mít i jméno – označení pro programátora/uživatele

Životnost objektů

• Přechodná– pouze v paměti, zajišťuje runtime

programovacího jazyka

• Trvalá– v paměti a trvalém úložišti, zajišťuje ODMS

• nezávisí na typu objektu

Atomic_object

• uživatelem definovaný typ• ODMG nemá žádný vestavěný

Collection_object

• kolekce prvků (atomický typ, jiná kolekce či literálový typ)

• prvky musí být stejného typu• vytváření new, new_of_size• procházení iterátorem• metody insert_element, remove_element apod.• metody query, select apod. pro výběr prvků

pomocí OQL

Collection_object (2.)

• set<> - množina• bag<> - umožňuje duplicity• list<> - setříděná posloupnost• array<> - dynamické pole• dictionary<> - množina párů klíč-hodnota

Structured_object

• implementuje základní rozhraní - Object

• Date• Time• Timestamp• Interval

• Mnoho konstruktorů a formátovacích metod

Literály

• nemají jednoznačný identifikátor – vždy předávány hodnotou

• operace equal – obdoba same_as u objektů– oba atomické a mají stejnou hodnotu– oba stejná kolekce a stejné (equal/same_as)

prvky se smyslu dané kolekce– oba struktura stejného typu, shodná

(equal/same_as) ve všech prvcích

Atomic_literal

• long• long long• short• unsigned long• unsigned short• float• double• boolean• octet• char• string• enum

• jsou součástí OMG IDL• jsou mapovány do

programovacího jazyka jako typ či zvláštní třída

• enum:attribute enum gender {male,female}

Collection_literal

• obdoba Collection_object ale nemá identifikátor objektu (object idetinfier)

• prvky mohou být objekty i literály• set<>, bag<>, list<>, array<>,

dictionary<>

Structured_literal

• struktura, položkou může být objekt i literál

• vestavěné:– date– time– timestamp– interval

• struct Address {stringstreet_name;short house_no;

};

Stav objektu - atributy

• objekty nebo literály

• class Person {attribute short age;attribute enum gender {male,

female};attribute Address home_address;attribute set<Phone_no> phones;

};

Stav objektu - vztahy

• pouze binární – mezi dvěma objekty• definovány pomocí traversal path

– vždy v páru– pojmenované

• class Teacher {relationship set<Course> teaches inverse

Course::is_taught_by;}; class Course {

relationship Teacher is_taught_by inverse Teacher::teaches;};

Stav objektu – vztahy (2.)

• kardinalitu určuje typ (… set<Course> … )• atribut objektového typu není vztah

(není zaručena integrita)• integritu zajišťuje ODMS• travesal path není ukazatel• jejich implementace je schována do

operací:– form/drop– add/remove

Stav objektu – vztahy (3.)

• relationship X Y inverse Zattribute X Y;void form_Y(in X target) raises (IntegrityError);void drop_Y(in X target) raises (IntegrityError);

• relationship set<X> Y inverse Zattribute set<X> Y;void form_Y(in X target) raises (IntegrityError);void drop_Y(in X target) raises (IntegrityError);void add_Y(in X target) raises (IntegrityError);void remove_Y(in X target) raises (IntegrityError);

Chování objektu - operace

• množina operací– jméno– jména a typy argumentů (a modifikátory

in/out)– jméno a typ návratové hodnoty– jména výjimek, které může vyhodit

• operace je definována pro právě jeden typ– žádné globální operace– žádné operace nad dvěma a více typy

Chování objektu – operace (2.)

• jméno operace musí být jedinečné v rámci typu

• různé typy mohou mít stejně pojmenované operace – přetížení jmen

• výběr použité operace se řídí pouze typem prvního argumentu (single dispatch model)

• ODMG nedefinuje paralelní běh operací

Výjimky

• operace mohou vyhodit výjimku• zpracuje ji exception handler

– jako argument dostane objekt exception s podrobnějšími informacemi

– funguje polymorfismus

• Runtime uvolní paměť a zruší započaté transakce

Metadata

• informace o trvalých objektech• popisují schéma ODMS

– struktura úložiště objektů– zpřístupňuje trvalé objekty

• uložena v ODL Schema Repository(obdoba IDL Interface Repository)

Metadata (2.)

• Součástí ODMG je popis rozhraní definujících vnitřní strukturu ODL Schema Repository– Scope– Visitor– MetaObject

• Module• Operation• Exception• Constant• Property (Attribute, Relationship)• Type (Interface, Class, Collection, ScopedType, Enumeration, ...)

– Specifier, Member, UnionCase, Direction– Operand

Metadata (3.)

• interface Class : Interface {attribute list<string> extents;attribute list<string> keys;relationship Class extender

inverse Class::extensions;relationship set<Class> extenions

inverse Class::extender;};

• interface Operation : MetaObject, Scope{relationship list<Parameter> signature

inverse Parameter::operation;relationship Type result

inverse Type::operations;relationship list<Exception> exceptions

inverse Exception::operations;};

Obsah druhé části

• transakce a zámykání• jazyky pro specifikace objektů• mapování standardu do programovacích

jazyků– C++ a Java

• ODMG a JDO• objektově-relační mapování• příklad

Konkurenční přístup

• řešeno pomocí zamykání– implicitní

• datábázový stroj se sám stará o zamykání čtených a zapisovaných objektů

• netýká se zámků pro změny

– explicitní• zamknutí lze vynutit pomocí konstrukcí lock a

try_lock

Druhy zámků

• sdílený zámek (shared)• exkluzivní zámek (exclusive)• zámek pro změny (upgrade)

– zaveden kvůli prevenci uváznutí

Konflikty zámků

nastavený zámek na objektu

žádný shared exclusive upgrade

shared ok ok X ok

exclusive ok X X X

upgrade ok ok X Xpoža

dova

ný z

ámek

Uvolňování zámků

• všechny zámky jsou standardně automaticky uvolněny po ukončení transakce (commit nebo abort)

• tato strategie je v souladu s definicí izolace úroveň 3 podle standardu SQL-92– nemůže dojít k těmto jevům

• dirty reads• nonrepeatable reads • phantoms

Transakce

• používají právě zámky• jakákoli operace nad perzistentními daty

musí být spojena s aktivní transakcí• zaručení ACID

– mezi transakcemi (ne nutně mezi procesy a vlákny)

• distribuované transakce– převzato ze standardu ISO XA– používáno pouze transakčními monitory– implementace nemusí podporovat

distribuované transakce

Rozhraní pro transakce

interface TransactionFactory {Transaction new();Transaction current();

}

interface Transaction {void begin() raises(TransactionInProgress, DatabaseClosed);void commit() raises(TransactionNotInProgress);void abort() raises(TransactionNotInProgress);void checkpoint () raises(TransactionNotInProgress); void join() raises(TransactionNotInProgress); void leave() raises(TransactionNotInProgress); boolean isOpen();

}

Práce s transakcemi

• begin = nová transakce není otevřená, je ji nutno explicitně otevřít

• checkpoint = jsou uloženy změny, ale transakce zůstává otevřená– zámky nejsou uvolněny

• join = umožňuje připojit proces k cizí aktivní transakci jiného procesu nebo vlákna– taková transakce potom nezajišťuje izolaci

mezi těmito procesy (vlákny)

Jazyky pro specifikace objektů

• Object Definition Language (ODL)– jazyk pro definice objektů v databázi

• Object Interchange Format (OIL)– specifikace formátu pro výměnu objektů mezi

různými databázemi

ODL

• úplně popisuje objektový model ODMG• není to programovací jazyk, jen jazyk pro

definice• nezávislý na programovacím jazyce• vychází z IDL (Interface Definition Lang.)• byl navržen jako jednoduše a rychle

implementovatelný

ODL jako rozšíření IDL

• IDL– syntaxe vychází z C++– vytvořen pro potřeby projektu CORBA– popisuje objektový model OMG

• ODL– rozšíření konstruktů, aby pokryl celý objektový

model ODMG (viz. dále srovnání objektového modelu ODMG a OMG)

Mapování ODL

• ve standardu je navrženo mapování– z jiných jazyků do ODL

• například z SQL99

– z ODL do jiných jazyků• Java, C++, SQL99, Smalltalk

ODL

Příklad ODLmodule Example1 {

class Person( extent persons){

exception NoSuchPerson{};attribute string name;attribute struct Address {

string street;unsigned short number;string city_name} address;

attribute set<string> degrees;relationship Person spouse

inverse Person::spouse;relationship set<Person> children

inverse Person::parents;relationship list<Person> parents

inverse Person::children;boolean marriage(in string person_name)

raises (NoSuchPerson); };};

Příklad ODL

• extent– je to množina všech objektů daného typu v

databázi (často následně použito v OQL)

• ODL definuje celé rozhraní objektu– třídy, atributy, metody, výjimky

• definice není závislá na programovacím jazyce

OIL

• byl to pokus, popsat objektová data nezávisle na platformě

• vytvořen pro standardní export a import dat databáze

• dnes asi nejméně používaná věc z celého standardu

Příklad OIL

Sarah Person{Name “Sarah”,PersonAddress{Street “Willow Road”,

City “New York”,Phone {CountryCode 1,

AreaCode 415,PersonCode 1234}}}

OIL

• jméno objektu musí být unikátní v celém objektu OIF

• cyklické použití jména není dovoleno• relace mezi objekty jsou popsány pomocí

jmen• umožňuje fyzicky seskupovat objekty

– tzn. aby byly fyzicky uloženy blízko sebe v DB (clustering)

– nemusí být implementací podporováno

Mapování ODMG

• popisuje použití standardu v různých programovací jazycích– C++– Java– Smalltalk

ODMG a C++

Deklarace v ODL

ODL preprocesor

Vygenerované hlavičkové

soubory

C++ kompilátor

Soubory zdrojového kódu implementace

LinkerODMSruntime

Spustitelná aplikace

Databáze

Metadata

ODMG a C++ (2.)

• příklady– definuje třídy pro kolekce– definuje třídu string– definuje třídy pro přístup k metadatům (jak

zjistit popis o jednotlivých třídách definovaných v DB)

• nejpropracovanější mapování v celém standardu

ODMG a Java

„Programátor musí věřit, že existuje pouze jeden jazyk pro programování

i pro vyjádření operací nad databází.“

ODMG a Java (2.)

• je použit objektový model z Javy• je plně zahrnuta syntaxe jazyka Java• automatické uložení objektu do databáze,

pokud se na něj odkazuje jiný perzistentní objekt (perzistence řízená dosahem)

ODMG API

• definováno v balíku org.odmg• každá implementace definuje vlastní

objekt Implementation– lze používat zároveň více implementací– získání implementace by měl být jediný

implementačně závislý kód v aplikaci

Rozhraní ODMG v Javě

• Implementation• Transaction• Database

Objektový model ODMG v Javě

ODMG Java

objekt objekt

atomický literál primitivy (string, int, …)

strukturovaný literál nejsou

struktura třída se stejnými atributy

Příklad relace v Javě (1:m)

public class Department{

Dcollection employees;}

public class Employee{

Department dept;}

Poznámky

• rozhraní a abstraktní třídy nelze uložit (nemohou být perzistentní)

• standard jinak pojmenovává kolekce– v podstatě se jedná o kolekce z Javy– přidány některé dílčí metody, nebo

přejmenovány, aby vyhovovaly standardu

• objekt extent a klíče nejsou v Javě zatím podporovány– nelze se na ně v kódu odkazovat

Výjimky

• standardní mechanismus jazyka Java– výjimky jsou potomky ODMGException

Souhrnně

• Java OML– 100% použit jazyk Java

• Java ODL– standardní definice tříd v jazyce Java (mohou

být generovány z ODL souboru jako v C++)

Java ODL

• definuje mapování ODL typů na typový systém Javy

• operace v ODL jsou metody v Javě

Java OML a perzistence objektů

• pro svázání objektů s databází používá property file (soubor vlastností)– persistent=capable– transient=[true|false]

• i jednotlivé atributy mohou být transientní

• objekt je vymazán z databáze automaticky pokud není pojmenován, nebo se na něj neodkazuje jiný perzistentní objekt

Perzistence objektů

• kořenové objekty– jsou to pojmenované objekty explicitně

ukládané do databáze– od nich začíná perzistence přidružených

objektů– jméno musí být unikátní v celé databázi

Transakce

• ukládání a mazání objektů z databáze probíhá uvnitř asociované transakce

Java OQL

• OQL je z Javy plně dostupné– rozhraní OQLQuery

Další vývoj ODMG

• poslední verze 3.0 z roku 2000• dnes zastaven vývoj tohoto standardu• vychází z něj JDO (Java) a mnoho dalších

prací na téma „perzistentní objekty“• byl použit jako základ pro objektově-

relační mapování (např. OJB)

Rozdíly v JDO

• je těsně spojeno s platformou Java• plně podporuje distribuované transakce• plně podporuje EJB• nemá OQL

– obsahuje pouze značně zjednodušený dotazovací jazyk JDOQL, který nepodporuje komplexní dotazy jako OQL

• jednoduše a rychle implementovatelné!

Příklad

• ObjectRelational Bridge (OJB)– opensource projekt komunity Apache– vytváří mezivrstvu, která ukládá objektová

data do relační databáze– vlastně vytváří dojem objektové databáze– kromě JDO plně implementuje ODMG 93

(i s OQL)– viz. http://db.apache.org/ojb/

Příklad uložení objektu

• namapujeme třídu Product do tabulky v Oraclu

Mapování třídy do tabulky

Připojení do databáze

Manipulace s objektem

Výsledek

Generování deskriptorů

Generování deskriptorů (2.)

• AndroMDA = ucelené integrované řešení s plnou podporou pro OJB

Objektově-relační mapování

• lze jednoduše využít relační platformy• lze v aplikaci použít jak relační přístup

(SQL), tak objektový přístup (OQL)• nutno generovat mapování (lze

automatizovat například z UML)– je explicitně vidět, kde jsou objekty uloženy

Object Query Language in O2

Vlastimil Menčík

Je to další X-SQL?

• podobná syntax, ve standardu dokonce nadmnožina SQL

• dotazy nad jiným typem entit• objektově orientovaný, ne objektově

relační• není to extender obohacující SQL o objekty• založen na objektovém modelu ODMG

Select … from … where

select e from e in Globe.employees

where e.salary > 10000

select: definuje strukturu výsledku dotazu

from: seznam kolekcí, na kterých se dotaz vyhodnocuje

where: boolský výraz filtrující výsledek

from

... from e in Globe.employees …

• Globe.employees je kolekce, ne tabulka

• proměnná e reprezentuje elementy kolekce a umožňuje přístup k atributům

… where e.salary > 10000

Spojení

select e frome in Globe.employees,c in Globe.clients

where e.name = c.name

select ord.what fromcl in Globe.clients, ord in cl.order

where cl.name = “Smith”

Struktura výsledku (1)

Výraz za select určuje strukturu a typ výsledku.select e.name, e.position, e.salary

from e in Globe.employees

je vlastněselect struct( name: e.name,

position: e.postition

salary: e.salary)

from e in Globe.employees

Struktura výsledku (2)

Záznamy lze i vnořovat:

select struct (employee: struct (name: e.name,

age: e.age),

salary: e.salary)

from e in Globe.employees

where e.position = “Reporter” and

e.age > 22

Distinct

select distinct e.salary

from e in Globe.employees

where e.position = “Reporter”

• typ výsledku je set• bez distinct je typ výsledku bag, tedy

multimnožina

Group by (1)

select * from e in Globe.employees

group by e.salary

• sémantika stejná jako v SQL• výsledek je typu:

bag (struct (salary: real,

partition: bag (struct (e:Employee))))

• partition je kolekce odpovídající příslušné třídě rozkladu

Group by (2)

Na třídy rozkladu lze aplikovat agregační funkce a filtrovat je pomocí klauzule having.

select e.salary,number: count (partition)

from e in Globe.employeesgroup by e.salaryhaving count (partition) > 1

Order by

select e from e in Globe.employees

order by e.name, e.age

Výsledek je typu list, tedy je to uspořádaná kolekce.

Množinové operátory

• na typech bag a set jsou definovány operátory union, intersect a except

• sémantika stejná jako v SQL

• dále je definován operátor pick, který z kolekce vybere jeden její prvek (Axiom výběru)

Kvantifikace

• existenční:select c.name

from c in TheCompanies

where exists e in c.employees : e.age < 23

• univerzálníselect c.name

from c in TheCompanies

where forall e in c.employees : e.age < 23

Define

• výsledek dotazu lze pojmenovat

define MyEmployees as

select e

from e in Global.employees

where e.name like “Sp*”

• lze použít v dotazech na místě kolekce• vzdálená podobnost s view

Volání metod

• lze všude, kde typově odpovídá návratová hodnota metody

• volání bezparametrické metody:select e from e in Globe.employees

where e.salary > 10000

• a metody s parametry:select e from e in Globe.employees

where e.salary_by_hours(40) > 2000

Shrnutí

• výsledek každého dotazu je typu, který náleží do modelu ODMG a tedy lze nad ním také pokládat dotazy

• operátory lze libovolně skládat, pokud jsou dodrženy typy operandů

• OQL je funkcinonální jazyk• OQL není, na rozdíl od dnešního standardu

SQL, turingovsky úplný