OBJECT DEFINITION LANGUAGE Jonáš Klimeš NDBI001 Dotazovací Jazyky I 2013
ODL a OQL ODL Objektové Object Definition Language popis objektového schéma SQL DDL Relační Data Definition Language příkazy CREATE, DROP, ALTER OQL Object Query Language dotazovací jazyk SQL DML Data Manipulation Language příkazy SELECT, INSERT, UPDATE, DELETE
Obsah Úvod Definice schématu v jazyce ODL Vytváření instancí Shrnutí
Object Definition Language 1991 založena skupina Object Database Management Group konsorcium vůdčích osobností OOSŘDB 1993 návrh standardu ODMG 1.0 2001 skupina rozpuštěna standard ODMG 3.0 obsahuje ODL a OQL
DEFINICE SCHÉMATU
UML schéma používaného příkladu
Definice třídy a atributů class <název třídy> { attribute <datový typ> <jméno atributu>; // komenář class Student { attribute string name; attribute Date dateofbirth; attribute string address; attribute string phone;
Datové typy Objekt instance třídy má jednoznačný identifikátor obsah se může měnit Literál neměnný typy: atomický literál kolekce složený literál
Atomický literál Konstanta, kterou nelze rozdělit na menší části string (řetězec) char (znak) boolean (true nebo false) float (reálné číslo) short (krátké celé číslo) long (dlouhé celé číslo) enum (výčet) class CourseOffering { attribute string term; attribute enum section {1, 2, 3, 4, 5, 6, 7, 8
Složené literály Složeny z pevného počtu pojmenovaných literálů nebo objektů Předdefinované složené literály: Date, Interval, Time, Timestamp Definice: struct <jméno>{ <datový typ> <jméno elementu>;... struct Address { string street_address; string city; string state; string zip; class Student { attribute string name; attribute Date dateofbirth; // uživatelem definovane atributy attribute Address address; attribute Phone phone;
Kolekce Kolekce literálů nebo objektů stejného typu set: Neuspořádaná kolekce bez duplicit bag: Neuspořádaná kolekce s duplicitami list: Uspořádaný seznam elementů array: Uspořádaná kolekce elementů s danou pozicí (velikost pole se dynamicky přizpůsobuje) dictionary: Neuspořádaná kolekce dvojic klíč-hodnota bez duplicit Definice: list <long> set <Date>
Operace Třída může mít definované operace <návratový typ> <název> (); <návratový typ> <název> (<typ parametru> <název parametru>,...); Ve striktní verzi ODL jsou parametry označeny jako vstupní, výstupní nebo vstupně-výstupní klíčová slova in, out, inout před datovým typem parametru class Student { attribute string name; attribute Date dateofbirth; // uživatelem definované složené atributy attribute Address address; attribute Phone phone; // operace short age( ); float gpa( ); boolean register_for(string crse, short sec, string term);
Relace Vztahy mezi objekty Unární nebo binární Jsou vždy obousměrné - pro každou relaci je nutné definovat i inverzní relaci Relace se vztahem více ku více (n:n) se definují pomocí kolekcí set, list, bag, array OSŘBD zajišťuje referenční integritu mazání neplatných odkazů vytváření inverzních vztahů
Relace - syntaxe class CourseOffering { attribute string term; attribute enum section {1, 2, 3, 4, 5, 6, 7, 8 // vztah více ku více mezi CourseOffering a Student relationship set <Student> taken_by inverse Student::takes; // vztah jeden ku více mezi CourseOffering and Course relationship Course belongs_to inverse Course::offers;
Klíčové slovo extent Určuje množinu všech instancí dané třídy v databázi Využití: dotazování unikátní klíče class Student { ( extent students) // atributy, relace, operace
Klíče Každý objekt v databázi je unikátní -> není potřeba definovat primární klíč Klíč v ODL = klíčový atribut je unikátní Klíč musí mít definovaný rozsah Klíčové slovo key class Student { ( extent students key stu_number) attribute long stu_number; class Employee{ ( extent employees key{name, address}) attribute string name; attribute string address;
Jednosměrná relace Atributu objektového typu Není udržována referenční integrita class Course { // hodnota atributu dept je identifikátor objektu attribute Department dept;... class Department { attribute short dept_number; attribute string dept_name; attribute string office_address;
Generalizace Třída může dědit od jedné jiné třídy Klíčové slovo extends class SalariedEmployee extends Employee{ ( extent salariedemployees) attribute long annualsalary; attribute string stockoption;
VYTVÁŘENÍ INSTANCÍ
Vytváření instancí I. Při vytvoření instance je vždy přiřazen unikátní identifikátor Uživatel může identifikátor specifikovat Vytvoření instance: MBA669 course ( ); Atributy: Cheryl student (name: Cheryl Davis, dateofbirth: 4/5/77); Složené atributy: Jack student ( name: Jack Warner, dateofbirth: 2/12/74, address: {street_address 310 College Rd, city Dayton, state Ohio, zip 45468}, phone: {area_code 937, personal_number 228 2252} );
Vytváření instancí II. Kolekce: Dan employee ( emp_id: 3678, ); name: Dan Bellon, skills: { Database design, OO Modeling } Vztahy: Cheryl student (takes: {OOAD99F, Telecom99F, Java99F });
SHRNUTÍ
Shrnutí class Osoba{ attribute string jmeno; attribute Date datumnarozeni; attribute Adresa adresa; short vek(); class Zamestnanec extends Osoba{ (extent zamestnanci key zamestanecid) // atributy attribute long zamestanecid; attribute enum typ {Manazer, Odborar attribute RidicskyPrukaz ridicskyprukaz; struct Adresa{ string ulice; string mesto; short PSC; class RidicskyPrukaz{ attribute long cislo; attribute set<char> skupiny; // relace relationship set<schopnost> umi inverse Schopnost::muze_byt_vykonavana; relationship Zamestnanec ma_sefa inverse Zamestnanec::je_sefem; relationship set<zamestnanec> je_sefem inverse Zamestnanec::ma_sefa;
Shrnutí class Osoba{ attribute string jmeno; attribute Date datumnarozeni; attribute Adresa adresa; short vek(); class Zamestnanec extends Osoba{ (extent zamestnanci key zamestanecid) // atributy attribute long zamestanecid; attribute enum typ {Manazer, Odborar attribute RidicskyPrukaz ridicskyprukaz; struct Adresa{ string ulice; string mesto; short PSC; class RidicskyPrukaz{ attribute long cislo; attribute set<char> skupiny; // relace relationship set<schopnost> umi inverse Schopnost::muze_byt_vykonavana; relationship Zamestnanec ma_sefa inverse Zamestnanec::je_sefem; relationship set<zamestnanec> je_sefem inverse Zamestnanec::ma_sefa;
Shrnutí class Osoba{ attribute string jmeno; attribute Date datumnarozeni; attribute Adresa adresa; short vek(); class Zamestnanec extends Osoba{ (extent zamestnanci key zamestanecid) // atributy attribute long zamestanecid; attribute enum typ {Manazer, Odborar attribute RidicskyPrukaz ridicskyprukaz; struct Adresa{ string ulice; string mesto; short PSC; class RidicskyPrukaz{ attribute long cislo; attribute set<char> skupiny; // relace relationship set<schopnost> umi inverse Schopnost::muze_byt_vykonavana; relationship Zamestnanec ma_sefa inverse Zamestnanec::je_sefem; relationship set<zamestnanec> je_sefem inverse Zamestnanec::ma_sefa;
Shrnutí class Osoba{ attribute string jmeno; attribute Date datumnarozeni; attribute Adresa adresa; short vek(); class Zamestnanec extends Osoba{ (extent zamestnanci key zamestanecid) // atributy attribute long zamestanecid; attribute enum typ {Manazer, Odborar attribute RidicskyPrukaz ridicskyprukaz; struct Adresa{ string ulice; string mesto; short PSC; class RidicskyPrukaz{ attribute long cislo; attribute set<char> skupiny; // relace relationship set<schopnost> umi inverse Schopnost::muze_byt_vykonavana; relationship Zamestnanec ma_sefa inverse Zamestnanec::je_sefem; relationship set<zamestnanec> je_sefem inverse Zamestnanec::ma_sefa;
Dotazy?
Děkuji za pozornost