720 likes | 832 Vues
Objektumorientált adatbázisnyelvek. Objektumleíró nyelv Objektumlekérdező nyelv. Objektumelvű adatbáziskezelők. Szabványosító csoport: ODMG = Object Data Management Group. ODL = Object Description Language, mint az SQL CREATE TABLE része .
E N D
Objektumorientált adatbázisnyelvek Objektumleíró nyelv Objektumlekérdező nyelv
Objektumelvű adatbáziskezelők • Szabványosító csoport: ODMG = Object Data Management Group. • ODL = Object Description Language, mint az SQL CREATE TABLE része. • OQL = Object Query Language, az SQL-t próbálja utánozni OO keretrendszerben.
Keretrendszer --- 1 • Az ODMG elképurlése szerint az OO-DBMS gyártok megvalósítanak egy OO nyelvet, mint a C++, olyan kiterjesztésekkel (OQL), amelyekkel a programozó zökkenőmentesen átviheti az adatokat az adatbázis és a „gazdanyelv” között.
Keretrendszer --- 2 • Az ODL-t tartós osztályok definiálására használjuk, amelyek objektumai maradandóan tárolhatók az adatbázisban. • Az ODL osztályok olyanok, mint az egyedhalmazok bináris kapcsolatokkal és metódusokkal. • Az ODL osztálydefiníciók a kibővített OO gazdanyelv részei.
ODL áttekintés • Egy osztálydeklaráció tartalmazza: • Az osztály nevét. • Választhatóan kulcsdeklaráció(ka)t. • Extens deklaráció = az osztály létező objektumait tartalmazó halmaz neve. • Elemdeklarációkat. Egy elem lehet attribútum, kapcsolat vagy metódus.
Osztálydefiníciók class <név> { <elemdeklarációk pontosvesszővel tagolt listája> }
Attribútum- és kapcsolatdeklarációk • Az attribútumok (általában) osztályhoz nem kapcsolódó típusú elemek. attribute <típus> <név>; • A kapcsolatok egy objektumot egy vagy több, azonos osztálybeli objektumhoz kapcsolják. relationship <típus> <név> inverse <kapcsolat>;
Inverz kapcsolatok • Tegyük fel, hogy a C osztály R kapcsolatban áll a D osztállyal. • Ekkor a D osztálynak valamilyen S kapcsolatban kell állnia a C osztállyal. • R-nek és S-nek egymás inverzének kell lennie. • Ha a dR kapcsolatban van c-vel, akkor c-nek S kapcsolatban kell lennie d-vel
Az árul kapcsolat típusaSör objektumok halmaza. A :: operátor összekapcsoljaa jobb oldalon álló nevet azazt tartalmazó környezettel,amely a bal oldalon áll. Példa: Attribútumok és kapcsolatok class Kocsma { attribute string név; attribute string cím; relationship Set<Sör> árul inverse Sör::kapható; } class Sör { attribute string név; attribute string gyártó; relationship Set<Kocsma> kapható inverse Kocsma::árul; }
Kapcsolatok típusai • Egy kapcsolat típusa lehet: • Osztály, pl. Kocsma. Ebben az esetben egy objektum csak egy Kocsma objektummal állhat kapcsolatban. • Set<Kocsma>: az objektum Kocsma objektumok halmazával van kapcsolatban. • Bag<Kocsma>, List<Kocsma>, Array<Kocsma>: az objektum Kocsma objektumokból álló zsákkal, listával vagy tömbbel van kapcsolatban.
Kapcsolatok multiplicitása • Minden ODL kapcsolat bináris. • A sok-sok kapcsolatok típusa Set<…> a kapcsolat és inverz oldalon is. • A sok-egy kapcsolatok típusa Set<…> az „egy” oldalon és csak osztály a „sok” oldalon. • Az egy-egy kapcsolatok típusa mindkét irányban az osztály.
Sok-sok: Set<…> mindkét irányban. Sok-egy: Set<…> csak az „egy” oldalon. Példa: Multiplicitások class Ivó { … relationship Set<Sör> szeret inverse Sör::rajongók; relationship SörkedvencSör inverse Sör::nagyRajongók; } class Sör { … relationship Set<Ivó> rajongók inverse Ivó::szeret; relationship Set<Ivó> nagyRajongók inverse Ivó::kedvencSör; }
férj és feleség:egy-egy kapcsolatokés egymás inverzei haverok: sok-sok kapcsolat és a sajátinverze. Nem kell a ::, ha az inverzugyanabban az osztályban van. Másik példa multiplicitásra class Ivó { attribute … ; relationship Ivóférj inverse feleség; relationship Ivófeleség inverse férj; relationship Set<Ivó> haverok inverse haverok; }
Többirányú kapcsolat kezelése • Az ODL nem támogatja a 3- vagy többirányú kapcsolatokat. • Szimulálhatjuk a többirányú kapcsolatokat egy „kapcsoló” osztállyal, amelynek objektumai reprezentálják az összekapcsolandó objektum n-eseket.
Kapcsoló osztályok • Tegyük fel, hogy az X, Y és Z osztályokat akarjuk összekapcsolni R kapcsolattal. • Vegyünk fel egy C osztályt, amelynek objektumai az (x, y, z) hármasokat reprezentálják az X, Y, Z osztályokból. • Három sok-egy kapcsolatra lesz szükségünk (x, y, z)-ből x, y és z mindegyikéhez.
Példa: Kapcsoló osztály • Tegyük fel, hogy van Kocsma és Sör osztályunk és szeretnénk reprezentálni, hogy melyik kocsma milyen áron adja a söröket. • A Kocsma és Sör közti sok-sok kapcsolatnak nem lehet ár attribútuma, szemben az E/K modellel. • Egy megoldás: készítsünk egy Ár osztályt és egy összekapcsoló BBP osztályt, amely az egymáshoz kapcsolódó kocsmákat, söröket és árakat reprezentálja.
Példa, folytatás • Mivel az Ár objektumok csak számok, egy jobb megoldás: • Adjunk a BBP objektumokhoz egy ár attribútumot. • Használjunk két sok-egy kapcsolatot a BBP objektum és az általa reprezentált Kocsma és Sör objektumok között.
Példa, befejezés • Itt a BBP definíciója: class BBP { attribute ár:real; relationship KocsmaaKocsma inverse Kocsma::toBBP; relationship SöraSör inverse Beer::toBBP; } • A Kocsma és Sör osztályokat módosítsuk, hogy mindkettőnek legyen toBBP tulajdonsága, amelyek típusa Set<BBP>.
Struktúrák és felsorolások • Az attribútumok lehetnek struktúrák (mint a C-ben) vagy felsorolások. • Így deklaráljuk: attribute [Struct vagy Enum] <struct vagy enum neve> { <részletek> } <attribútum neve>; • A részletek mezőnevek és -típusok Struct-nál, konstansok listája Enum-nál.
A struktura ésfelsorolás neve attribútumok neve Példa: Struct és Enum class Kocsma { attribute string név; attribute Struct CímT {int irsz, string város, string utca} cím; attribute Enum Eng { MINDEN, SÖR, SEMMI } engedély; relationship … }
Ugyanazt azirsz-város-utcacímtípust használjuk Struct és Enum újrahasznosítása • Hivatkozhatunk egy Struct vagy Enum nevére másik osztálydefinícióban. • Használjuk a :: operátort a forrásosztály jelölésére. • Példa: class Ivó { attribute string név; attribute Struct Kocsma::CímTcím; …
Metódusdeklarációk • Egy osztálydefiníció tartalmazhatja az osztályban levő metódusok deklarációit. • Az információ tartalma: • Visszatérésí érték típusa, ha van. • Metódus neve. • Argumentumok módja és típusa (nincs név). • A mód lehet in, out és inout. • Kivételek, amelyeket a metódus kiválthat.
Példa: Metódusok real átlag(in string)raises(nincsJegy); • Az átlag függvény egy valós számot ad vissza (feltehetőleg egy hallgató átlagát). • Az átlagnak egy argumentuma van, egy string (feltehetőleg a hallgató neve) és nem módosítja az argumentumát. • Az átlag kiválthatja a nincsJegy kivételt.
Az ODL típusrendszer • Alaptípusok: int, real/float, string, felsorolás típusok és osztályok. • Típuskonstruktorok: • Struct a struktúrákhoz. • Kollekció típusok : Set, Bag, List, Array és Dictionary ( = leképezés egy értelmezési tartományból egy képhalmazba). • A kapcsolatok típusa csak osztály vagy egy osztályra alkalmazott kollekció lehet.
ODL alosztályok • A szokásos objektumorientált alosztályok. • A szülőosztályt kettősponttal és névvel jelöljük. • Az alosztályban csak az egyedi tulajdonságait soroljuk fel. • Megörökli a szülőosztály tulajdonságait is.
Példa: Alosztályok • Az ale a sör alosztálya: class Ale:Sör { attribute string szín; }
ODL kulcsok • Deklarálhat akárhány kulcsot egy osztályhoz. • Az osztály neve után adjuk meg: (key <kulcslista>) • Egynél több attribútumot tartalmazó kulcsot az attribútumok köré tett külön zárójellel jelöljük.
Példa: Kulcsok class Sör (key név) { … • a név a sör kulcsa. class Kurzus (key (tanszék,szám),(hely, idő)){ • a tanszék és szám az egyik kulcs, a hely és idő a másik.
Extensek • Minden osztályhoz tartozik egy extens, amely az osztályhoz tartozó létező objektumokat tartalmazó halmaz. • Az extens hasonló egy relációhoz, amelynek az osztály a sémája. • Az extenst az osztály neve után tüntetjük fel a kulcsokkal együtt, így: (extent <extens neve> … )
Példa: Extensek class Sör (extent Sörök key név) { … } • Konvenció szerint egyes számot használunk az osztály nevének, többes számot a hozzá tartozó extensnek.
OQL • Az OQL az objektumorientált lekérdezés szabványa. • Az ODL-t használja sémadefiníciós nyelvként. • Az OQL típusai olyanok, mint az ODL-ben. • A relációk szerepét a Set(Struct) és a Bag(Struct) játssza.
Útvonal-kifejezések • LegyenxaCosztály egy objektuma. • Ha aegy attribútuma C-nek, akkorx.aaz attribútum értéke. • Haregy kapcsolataC-nek, akkorx.raz az érték, amelyhezxkapcsolódikr által. • Lehet egy objektum vagy objektumok halmaza, r típusától függően. • Hamegy metódusaC-nek, akkorx.m(…) az mx-re való alkalmazásának eredménye.
Futó példa class Eladás (extent Eladások) { attribute real ár; relationship Kocsmakocsma inverse Kocsma::eladottSörök; relationship Sörsör inverse Sör::eladói; } class Kocsma (extent Kocsmák) { attribute string név; attribute string cím; relationship Set<Eladás> eladottSörök inverse Eladás::kocsma; }
Futó példa, befejezés class Sör (extent Sörök) { attribute string név; attribute string gyártó; relationship Set<Eladás> eladói inverse Eladás::sör; }
Példa: Útvonal-kifejezések • Legyen segy Eladás típusú változó, azaz kocsma-sör-ár objektum. • s.ár = az árazsobjektumban. • s.kocsma.cím = s-ből a kocsma kapcsolat mentén elért kocsma címe • Itt a pontok egymásba ágyazása helyes, mert s.bar egy objektum, nem objektumok kollekciója.
Ez a kifejezés Eladás típusú objektumokhalmaza. Nincs neki ára. Példa: A pont helytelen használata • Nem használhatjuk a pontot, ha a bal oldalon egy kollekció áll, hanem csak akkor, ha egyetlen objektum. • Példa (helytelen), aholbegyKocsma: b.eladottSörök.ár
OQL Select-From-Where • Relációjellegű kollekciókat számolhatunk ki OQL utasítással: SELECT <értéklista> FROM <kollekciók és típusjellemzők listája> WHERE <feltétel>
FROM részmondat • Minden tagja az alábbi formájú: <kollekció> <tag neve> • Kollekció lehet: • Valamelyik osztály extense. • Egy kifejezés, amelynek értéke kollekció, pl. b.eladottSörök .
Az Eladások az összesEladás objektumot tartalmazó extens. s sorra felveszimindegyik objektumértékét. Helyes kifejezések.s.sör egy sörobjektum, s.kocsmaegy Kocsmaobjektum. Az OQL idézőjeleket használ. Példa • Kérdezzük le Józsi kocsmájában az itallapot. SELECT s.sör.név, s.ár FROM Eladások s WHERE s.kocsma.név = "Józsi kocsmája"
b.eladottSörök egy Eladás objektumokból álló halmaz, most pedig egy tipikus eladás objektum, amely Józsi kocsmájával kapcsolatos. Másik példa • Ez is megszerzi Józsi itallapját: SELECT s.sör.név, s.ár FROM Kocsmák b, b.eladottSörök s WHERE b.név = "Józsi kocsmája"
Trükkök útvonal-kifejezésekkel • Ha egy útvonal-kifejezés egy objektumot jelöl, akkor kiterjesztheti egy ponttal és az objektum egy tulajdonságával. • Példa: s, s.kocsma, s.kocsma.név • H a egy útkifejezése kollekciót jelöl, akkor nem terjesztheti ki, de felhasználhatja a FROM részmondatban. • Példa: b.eladottSörök
Az eredmény típusa • Alapértelmezésben a select-from-where eredményének típusa egy struktúrákból álló zsák. • A struktúrának egy-egy mezője van a SELECT részmondat minden tagjához. A neve és típusa megegyezik az útvonal-kifejezés utolsó elemével. • Ha a SELECT csak egytagú, akkor technikailag az eredmény egy egymezős struktúra. • Viszont az egyelemű struktúra azonosítható az egy elemmel.
Példa: Eredménytípus SELECT s.sör.név, s.ár FROM Kocsmák b, b.eladottSörök s WHERE b.név = "Józsi kocsmája" • Típusa: Bag(Struct(név: string, ár: real))
Mezők átnevezése • Mezők átnevezéséhez tegyük elé az új nevet és egy kettőspontot. • Példa: SELECT sör: s.sör.név, s.ár FROM Kocsmák b, b.eladottSörök s WHERE b.név = "Józsi kocsmája" • Az eredmény típusa: Bag(Struct(sör: string, ár: real)).
Struktúrák halmazának előállítása • Adjuk hozzá a DISTINCT kulcsszót a SELECT után, így az eredmény egy halmaz lesz és a duplikált elemek törlődnek. • Példa: SELECT DISTINCT s.sör.név, s.ár FROM Kocsmák b, b.eladottSörök s WHERE b.név = "Józsi kocsmája" • Az eredmény típusa: Set(Struct(név: string, ár: string))
Struktúrák listájának előállítása • Használjuk az ORDER BY részmondatot, mint az SQL-ben, így az eredmény egy lista lesz, amelyben a struktúrák az ORDER BY-ban felsorolt mezők szerinti sorrendben lesznek. • Növekvő (ASC) az alapértelmezett; csökkenő (DESC) is lehetséges. • A lista elemeit indexekkel érhetjük el: [1], [2],… • Az SQL kurzorokhoz hasonló lehetőségeket ad.
Példa: Listák • Legyen joeMenu egy gazdanyelvi változó ezzel a típussal: List(Struct(név:string, ár:real)) joeMenu = SELECT s.sör.név, s.ár FROM Kocsmák b, b.eladottSörök s WHERE b.név = "Józsi kocsmája" ORDER BY s.ár;
Példa, folytatás • Most a joeMenu értéke egy lista, amelynek elemei a Józsi által eladott sörök név-ár párjai. • Elérhetjük az első (legolcsóbb) elemet joeMenu[1], a következőt joeMenu[2] alakban stb. • Példa: Józsi legolcsóbb sörének neve: legolcsóbb = joeMenu[1].név;
COUNT megadja akollekció elemszámát. Példa, befejezés • Miután kiértékeltük a joeMenu-t, kiírhatjuk Józsi itallapját efféle kóddal: cout << "Sör\tÁr\n\n"; for (i=1; i<=COUNT(joeMenu); i++) cout << joeMenu[i].name << “\t” << joeMenu[i].price << “\n”;
Alkérdések • Egy select-from-where kifejezés körülvehető zárójelekkel és felhasználható alkérdésként többféle módon, pl. • FROM részmondatban kollekcióként. • EXISTS és FOR ALL kifejezésben.