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ý