Objektov databze a OQL Jakub Kotrla Ondej Kmoch
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 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 Chování - operace Literál 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 Atomic_literal (short, long, boolean, char…) Collection_literal (set<>, bag<>, list<>, array<>, dictionary<>) Structured_literal (date, timestamp, interval, structure<>) Object_type Atomic_object – definovány uživatelem Collection_object (Set<>, Bag<>, List<>, Array<>, Dictionary<>) Structured_object (date, 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(Lock. Not. Gtranted); boolean try_lock(in Lock_Type mode); boolean same_as(in Object an. Object); 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í 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 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 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 timestamp interval • struct Address { string street_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 Z attribute X Y; void form_Y(in X target) raises (Integrity. Error); void drop_Y(in X target) raises (Integrity. Error); • relationship set<X> Y inverse Z attribute set<X> Y; void form_Y(in X target) raises (Integrity. Error); void drop_Y(in X target) raises (Integrity. Error); void add_Y(in X target) raises (Integrity. Error); void remove_Y(in X target) raises (Integrity. Error);
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 – Meta. Object • • • Module Operation Exception Constant Property (Attribute, Relationship) Type (Interface, Class, Collection, Scoped. Type, Enumeration, . . . ) – Specifier, Member, Union. Case, 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 : Meta. Object, 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ů požadovaný zámek nastavený zámek na objektu žádný shared exclusive upgrade shared ok ok X ok exclusive ok X X X upgrade ok ok X X
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 Transaction. Factory { Transaction new(); Transaction current(); } interface Transaction { void begin() raises(Transaction. In. Progress, Database. Closed); void commit() raises(Transaction. Not. In. Progress); void abort() raises(Transaction. Not. In. Progress); void checkpoint () raises(Transaction. Not. In. Progress); void join() raises(Transaction. Not. In. Progress); void leave() raises(Transaction. Not. In. Progress); boolean is. Open(); }
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 SQL 99 – z ODL do jiných jazyků • Java, C++, SQL 99, Smalltalk ODL
Příklad ODL module Example 1 { class Person ( extent persons) { exception No. Such. Person{}; 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 (No. Such. Person); }; };
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 databáze • dnes asi nejméně používaná věc z celého standardu
Příklad OIL Sarah Person{Name “Sarah”, Person. Address{Street “Willow Road”, City “New York”, Phone {Country. Code 1, Area. Code 415, Person. Code 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 preprocesor Metadata Vygenerované hlavičkové soubory Soubory zdrojového kódu implementace C++ kompilátor Databáze Linker Spustitelná aplikace ODMS runtime
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 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 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 • Object. Relational 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. ) • Andro. MDA = 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 O 2 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 from e in Globe. employees, c in Globe. clients where e. name = c. name select ord. what from cl 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. employees group by e. salary having 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 The. Companies where exists e in c. employees : e. age < 23 • univerzální select c. name from c in The. Companies where forall e in c. employees : e. age < 23
Define • výsledek dotazu lze pojmenovat define My. Employees 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ý
- Slides: 97