Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

1 Objektumorientált adatbázisnyelvek Objektumleíró nyelv Objektumlekérdező nyelv.

Hasonló előadás


Az előadások a következő témára: "1 Objektumorientált adatbázisnyelvek Objektumleíró nyelv Objektumlekérdező nyelv."— Előadás másolata:

1 1 Objektumorientált adatbázisnyelvek Objektumleíró nyelv Objektumlekérdező nyelv

2 2 Objektumelvű adatbáziskezelők uSzabványosító csoport: ODMG = Object Data Management Group. uODL = Object Description Language, mint az SQL CREATE TABLE része. uOQL = Object Query Language, az SQL-t próbálja utánozni OO keretrendszerben.

3 3 Keretrendszer uAz 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.

4 4 Keretrendszer uAz ODL-t tartós osztályok definiálására használjuk, amelyek objektumai maradandóan tárolhatók az adatbázisban. wAz ODL osztályok olyanok, mint az egyedhalmazok bináris kapcsolatokkal és metódusokkal. wAz ODL osztálydefiníciók a kibővített OO gazdanyelv részei.

5 5 ODL áttekintés uEgy osztálydeklaráció tartalmazza: 1.Az osztály nevét. 2.Választhatóan kulcsdeklaráció(ka)t. 3.Extens deklaráció = az osztály létező objektumait tartalmazó halmaz neve. 4.Elemdeklarációkat. Egy elem lehet attribútum, kapcsolat vagy metódus.

6 6 Osztálydefiníciók class { }

7 7 Attribútum- és kapcsolatdeklarációk uAz attribútumok (általában) osztályhoz nem kapcsolódó típusú elemek. attribute ; uA kapcsolatok egy objektumot egy vagy több, azonos osztálybeli objektumhoz kapcsolják. relationship inverse ;

8 8 Inverz kapcsolatok uTegyük fel, hogy a C osztály R kapcsolatban áll a D osztállyal. uEkkor a D osztálynak valamilyen S kapcsolatban kell állnia a C osztállyal. uR-nek és S-nek egymás inverzének kell lennie. wHa a d R kapcsolatban van c-vel, akkor c- nek S kapcsolatban kell lennie d-vel

9 9 Példa: Attribútumok és kapcsolatok class Kocsma { attribute string név; attribute string cím; relationship Set árul inverse Sör::kapható; } class Sör { attribute string név; attribute string gyártó; relationship Set kapható inverse Kocsma::árul; } Az árul kapcsolat típusa Sör objektumok halmaza. A :: operátor összekapcsolja a jobb oldalon álló nevet az azt tartalmazó környezettel, amely a bal oldalon áll.

10 10 Kapcsolatok típusai uEgy kapcsolat típusa lehet: 1.Osztály, pl. Kocsma. Ebben az esetben egy objektum csak egy Kocsma objektummal állhat kapcsolatban. 2.Set : az objektum Kocsma objektumok halmazával van kapcsolatban. 3.Bag, List, Array : az objektum Kocsma objektumokból álló zsákkal, listával vagy tömbbel van kapcsolatban.

11 11 Kapcsolatok multiplicitása uMinden ODL kapcsolat bináris. uA sok-sok kapcsolatok típusa Set a kapcsolat és inverz oldalon is. uA sok-egy kapcsolatok típusa Set az „egy” oldalon és csak osztály a „sok” oldalon. uAz egy-egy kapcsolatok típusa mindkét irányban az osztály.

12 12 Példa: Multiplicitások class Ivó { … relationship Set szeret inverse Sör::rajongók; relationship Sör kedvencSör inverse Sör::nagyRajongók; } class Sör { … relationship Set rajongók inverse Ivó::szeret; relationship Set nagyRajongók inverse Ivó::kedvencSör; } Sok-sok: Set mindkét irányban. Sok-egy: Set csak az „egy” oldalon.

13 13 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 haverok inverse haverok; } férj és feleség: egy-egy kapcsolatok és egymás inverzei haverok: sok-sok kapcsolat és a saját inverze. Nem kell a ::, ha az inverz ugyanabban az osztályban van.

14 14 Többirányú kapcsolat kezelése uAz ODL nem támogatja a 3- vagy többirányú kapcsolatokat. uSzimulálhatjuk a többirányú kapcsolatokat egy „kapcsoló” osztállyal, amelynek objektumai reprezentálják az összekapcsolandó objektum n-eseket.

15 15 Kapcsoló osztályok uTegyük fel, hogy az X, Y és Z osztályokat akarjuk összekapcsolni R kapcsolattal. uVegyünk fel egy C osztályt, amelynek objektumai az (x, y, z) hármasokat reprezentálják az X, Y, Z osztályokból. uHárom sok-egy kapcsolatra lesz szükségünk (x, y, z)-ből x, y és z mindegyikéhez.

16 16 Példa: Kapcsoló osztály uTegyü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. wA Kocsma és Sör közti sok-sok kapcsolatnak nem lehet ár attribútuma, szemben az E/K modellel. uEgy 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.

17 17 Példa, folytatás uMivel az Ár objektumok csak számok, egy jobb megoldás: 1.Adjunk a BBP objektumokhoz egy ár attribútumot. 2.Használjunk két sok-egy kapcsolatot a BBP objektum és az általa reprezentált Kocsma és Sör objektumok között.

18 18 Példa, befejezés uItt a BBP definíciója: class BBP { attribute ár:real; relationship Kocsma aKocsma inverse Kocsma::toBBP; relationship Sör aSör inverse Beer::toBBP; } uA Kocsma és Sör osztályokat módosítsuk, hogy mindkettőnek legyen toBBP tulajdonsága, amelyek típusa Set.

19 19 Struktúrák és felsorolások uAz attribútumok lehetnek struktúrák (mint a C-ben) vagy felsorolások. uÍgy deklaráljuk: attribute [Struct vagy Enum] { } ; uA részletek mezőnevek és -típusok Struct-nál, konstansok listája Enum-nál.

20 20 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 … } A struktura és felsorolás neve attribútumok neve

21 21 Struct és Enum újrahasznosítása uHivatkozhatunk egy Struct vagy Enum nevére másik osztálydefinícióban. wHasználjuk a :: operátort a forrásosztály jelölésére. uPélda: class Ivó { attribute string név; attribute Struct Kocsma::CímT cím; … Ugyanazt az irsz-város-utca címtípust használjuk

22 22 Metódusdeklarációk uEgy osztálydefiníció tartalmazhatja az osztályban levő metódusok deklarációit. uAz információ tartalma: 1.Visszatérésí érték típusa, ha van. 2.Metódus neve. 3.Argumentumok módja és típusa (nincs név). wA mód lehet in, out és inout. 4.Kivételek, amelyeket a metódus kiválthat.

23 23 Példa: Metódusok real átlag(in string)raises(nincsJegy); 1.Az átlag függvény egy valós számot ad vissza (feltehetőleg egy hallgató átlagát). 2.Az átlagnak egy argumentuma van, egy string (feltehetőleg a hallgató neve) és nem módosítja az argumentumát. 3.Az átlag kiválthatja a nincsJegy kivételt.

24 24 Az ODL típusrendszer uAlaptípusok: int, real/float, string, felsorolás típusok és osztályok. uTípuskonstruktorok: wStruct a struktúrákhoz. wKollekció típusok : Set, Bag, List, Array és Dictionary ( = leképezés egy értelmezési tartományból egy képhalmazba). uA kapcsolatok típusa csak osztály vagy egy osztályra alkalmazott kollekció lehet.

25 25 ODL alosztályok uA szokásos objektumorientált alosztályok. uA szülőosztályt kettősponttal és névvel jelöljük. uAz alosztályban csak az egyedi tulajdonságait soroljuk fel. wMegörökli a szülőosztály tulajdonságait is.

26 26 Példa: Alosztályok uAz ale a sör alosztálya: class Ale:Sör { attribute string szín; }

27 27 ODL kulcsok uDeklarálhat akárhány kulcsot egy osztályhoz. uAz osztály neve után adjuk meg: (key ) uEgynél több attribútumot tartalmazó kulcsot az attribútumok köré tett külön zárójellel jelöljük.

28 28 Példa: Kulcsok class Sör (key név) { … ua név a sör kulcsa. class Kurzus (key (tanszék,szám),(hely, idő)){ ua tanszék és szám az egyik kulcs, a hely és idő a másik.

29 29 Extensek uMinden osztályhoz tartozik egy extens, amely az osztályhoz tartozó létező objektumokat tartalmazó halmaz. wAz extens hasonló egy relációhoz, amelynek az osztály a sémája. uAz extenst az osztály neve után tüntetjük fel a kulcsokkal együtt, így: (extent … )

30 30 Példa: Extensek class Sör (extent Sörök key név) { … } uKonvenció szerint egyes számot használunk az osztály nevének, többes számot a hozzá tartozó extensnek.

31 31 OQL uAz OQL az objektumorientált lekérdezés szabványa. uAz ODL-t használja sémadefiníciós nyelvként. uAz OQL típusai olyanok, mint az ODL-ben. uA relációk szerepét a Set(Struct) és a Bag(Struct) játssza.

32 32 Útvonal-kifejezések uLegyen x a C osztály egy objektuma. 1.Ha a egy attribútuma C-nek, akkor x.a az attribútum értéke. 2.Ha r egy kapcsolata C-nek, akkor x.r az az érték, amelyhez x kapcsolódik r által. wLehet egy objektum vagy objektumok halmaza, r típusától függően. 3.Ha m egy metódusa C-nek, akkor x.m(…) az m x-re való alkalmazásának eredménye.

33 33 Futó példa class Eladás (extent Eladások) { attribute real ár; relationship Kocsma kocsma inverse Kocsma::eladottSörök; relationship Sör sör inverse Sör::eladói; } class Kocsma (extent Kocsmák) { attribute string név; attribute string cím; relationship Set eladottSörök inverse Eladás::kocsma; }

34 34 Futó példa, befejezés class Sör (extent Sörök) { attribute string név; attribute string gyártó; relationship Set eladói inverse Eladás::sör; }

35 35 Példa: Útvonal-kifejezések uLegyen s egy Eladás típusú változó, azaz kocsma-sör-ár objektum. 1.s.ár = az ár az s objektumban. 2.s.kocsma.cím = s-ből a kocsma kapcsolat mentén elért kocsma címe wItt a pontok egymásba ágyazása helyes, mert s.bar egy objektum, nem objektumok kollekciója.

36 36 Példa: A pont helytelen használata uNem használhatjuk a pontot, ha a bal oldalon egy kollekció áll, hanem csak akkor, ha egyetlen objektum. uPélda (helytelen), ahol b egy Kocsma: b.eladottSörök.ár Ez a kifejezés Eladás típusú objektumok halmaza. Nincs neki ára.

37 37 OQL Select-From-Where uRelációjellegű kollekciókat számolhatunk ki OQL utasítással: SELECT FROM WHERE

38 38 FROM részmondat uMinden tagja az alábbi formájú: uKollekció lehet: 1.Valamelyik osztály extense. 2.Egy kifejezés, amelynek értéke kollekció, pl. b.eladottSörök.

39 39 Példa uKé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" Az Eladások az összes Eladás objektumot tartalmazó extens. s sorra felveszi mindegyik objektum értékét. Helyes kifejezések. s.sör egy sör objektum, s.kocsma egy Kocsma objektum. Az OQL idézőjeleket használ.

40 40 Másik példa uEz 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" 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.

41 41 Trükkök útvonal-kifejezésekkel uHa egy útvonal-kifejezés egy objektumot jelöl, akkor kiterjesztheti egy ponttal és az objektum egy tulajdonságával. wPélda: s, s.kocsma, s.kocsma.név uH a egy útkifejezése kollekciót jelöl, akkor nem terjesztheti ki, de felhasználhatja a FROM részmondatban. wPélda: b.eladottSörök

42 42 Az eredmény típusa uAlapértelmezésben a select-from-where eredményének típusa egy struktúrákból álló zsák. wA 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. uHa a SELECT csak egytagú, akkor technikailag az eredmény egy egymezős struktúra. wViszont az egyelemű struktúra azonosítható az egy elemmel.

43 43 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" uTípusa: Bag(Struct(név: string, ár: real))

44 44 Mezők átnevezése uMezők átnevezéséhez tegyük elé az új nevet és egy kettőspontot. uPé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" uAz eredmény típusa: Bag(Struct(sör: string, ár: real)).

45 45 Struktúrák halmazának előállítása uAdjuk hozzá a DISTINCT kulcsszót a SELECT után, így az eredmény egy halmaz lesz és a duplikált elemek törlődnek. uPé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" uAz eredmény típusa: Set(Struct(név: string, ár: string))

46 46 Struktúrák listájának előállítása uHaszná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. wNövekvő (ASC) az alapértelmezett; csökkenő (DESC) is lehetséges. uA lista elemeit indexekkel érhetjük el: [1], [2],… uAz SQL kurzorokhoz hasonló lehetőségeket ad.

47 47 Példa: Listák uLegyen 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;

48 48 Példa, folytatás uMost a joeMenu értéke egy lista, amelynek elemei a Józsi által eladott sörök név-ár párjai. uElérhetjük az első (legolcsóbb) elemet joeMenu[1], a következőt joeMenu[2] alakban stb. uPélda: Józsi legolcsóbb sörének neve: legolcsóbb = joeMenu[1].név;

49 49 Példa, befejezés uMiutá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”; COUNT megadja a kollekció elemszámát.

50 50 Alkérdések uEgy select-from-where kifejezés körülvehető zárójelekkel és felhasználható alkérdésként többféle módon, pl. 1.FROM részmondatban kollekcióként. 2.EXISTS és FOR ALL kifejezésben.

51 51 Példa: Alkérdés FROM-ban uKeressük meg a Józsi által kínált sörök gyártóit: SELECT DISTINCT b.gyártó FROM ( SELECT s.sör FROM Eladások s WHERE s.kocsma.név = "Józsi kocsmája" ) b Sör objektumok zsákja, a Józsi által eladott sörökkel Technikailag egytagú struktúra Sör objektummal, de azonosítható magával az objektummal

52 52 Kvantorok uKét logikai értékű kifejezés, amely a WHERE részmondatban használható: FOR ALL x IN : EXISTS x IN : uIgaz akkor és csak akkor, ha minden (ill. legalább egy) eleme a kollekciónak kielégíti a feltételt.

53 53 Példa: EXISTS uKeressük meg azoknak a kocsmáknak a nevét, amelyeknél kapható legalább egy 1000 Ft-nál drágább sör. SELECT b.név FROM Kocsmák b WHERE EXISTS s IN b.eladottSörök : s.ár > 1000 Legalább egy b-hez tartozó Eladás objektum ára nagyobb, mint 1000

54 54 Másik kvantoros példa uKeressük meg azoknak a kocsmáknak a nevét, amelyek összes 1000 Ft-nál drágább sörét a Pete’s gyártja. SELECT b.név FROM Kocsmák b WHERE FOR ALL be IN ( SELECT s.sör FROM b.eladottSörök s WHERE s.ár > 1000 ) : be.gyártó = "Pete’s" Sör objektumok zsákja (struktúrákon belül), b bár 1000 Ft-nál drágább söreivel. Az egytagú struktúrák automatikusan kibontásra kerülnek, így be tekinthető Sör objektumnak.

55 55 Egyszerű kényszerítések uAhogy már láttuk, az egytagú struktúra automatikusan konvertálódik az egy tag értékévé. wStruct(f : x) kényszerül x-szé. uAz egyetlen elemet tartalmazó kollekció kényszeríthető az elemmé, de ehhez szükséges az ELEMENT operátor. wPl. ELEMENT(Bag(x )) = x.

56 56 Példa: ELEMENT uAdjuk értékül a valós típusú p-nek, hogy mennyiért adja Józsi a Bud-ot. p = ELEMENT( SELECT s.ár FROM Eladások s WHERE s.kocsma.név = "Józsi kocsmája" AND s.sör.név = "Bud" ); Egyelemű zsák egy struktúrával, amelynek egyetlen tagja a Bud ára Józsinál

57 57 Aggregációk uAVG, SUM, MIN, MAX és COUNT használható minden kollekcióra, ha van értelme. uPélda: Számítsuk ki a Józsi által eladott sörök átlagárát. x = AVG( SELECT s.ár FROM Eladások s WHERE s.kocsma.név = "Józsi kocsmája" ); Zsák olyan struktúrákkal, amelyek a Józsi által eladott sörök árait tartalmazzák

58 58 Csoportosítás uEmlékezzünk az SQL csoportosításra: 1.Rekordok csoportjai bizonyos (csoportosító) attribútumok alapján 2.A SELECT részmondat csak olyan elemeket tud kivenni a csoportból, amelyeknek van értelme: wCsoporton belüli aggregáció. wCsoportosító attribútumok, amelyek értéke a csoporton belül konstans.

59 59 OQL csoportosítás uAz OQL többféle módon kibővíti a csoportosítás fogalmát: 1.Bármilyen kollekció csoportokra bontható. 2.A csoportok az eredeti kollekció objektumainak tetszőleges függvénye alapján létrejöhetnek. 3.A lekérdezés eredménye a csoportok bármilyen függvénye lehet.

60 60 Az OQL GROUP BY vázlata Kezdeti kollekció FROM, WHERE alapján Köztes kollekció, függvényértékekkel és partíciókkal Kimeneti kollekció Csoportosítás függvényérték szerint SELECT részmondat tagjai

61 61 Példa: GROUP BY uEzeket a fogalmakat egy példán keresztül nézzük át: „Határozzuk meg minden kocsmában a sörök átlagárát.” SELECT kocsmaNév, átlagÁr: AVG( SELECT p.s.ár FROM partition p) FROM Eladások s GROUP BY kocsmaNév: s.kocsma.név

62 62 Kezdeti kollekció uA FROM és WHERE (itt hiányzik) alapján: FROM Eladások s uA kezdeti kollekció egy zsák struktúrákkal, amelyek egyetlen mezője a FROM részmondat „tipikus eleme”. uItt egy zsák Struct(s: obj ) alakú struktúrákkal, ahol obj is egy Eladás objektum.

63 63 Köztes kollekció uÁltalában egy zsák struktúrákkal, amelyek rendelkeznek egy-egy taggal a GROUP BY részmondat minden függvényéhez, ezenkívül egy partition nevű taggal. uA partíció értéke az eredeti kollekció azon elemeinek halmaza, amelyek a vizsgált struktúrával azonos csoportba tartoznak.

64 64 Példa: Köztes kollekció SELECT kocsmaNév, átlagÁr: AVG( SELECT p.s.ár FROM partition p) FROM Eladások s GROUP BY kocsmaNév: s.kocsma.név Egy csoportosító függvény. A neve kocsmaNév, típusa string. A köztes kollekció struktúrák halmaza, ahol a mezők kocsmaNév: string és partition: Set

65 65 Példa: Tipikus tag uEgy tipikus tag a köztes kollekcióban a példánkban: Struct(kocsmaNév = "Józsi kocsmája", partition = {s 1, s 2,…,s n }) uA partíció minden eleme egy s i Eladás objektum, ahol s i.kocsma.név értéke „Józsi kocsmája”.

66 66 A kimeneti kollekció uA kimeneti kollekciót a SELECT részmondat számolja ki, szokás szerint. uGROUP BY részmondat nélkül a SELECT részmondat a kezdeti kollekcióból állítja elő a kimenetét. uGROUP BY esetén a SELECT eredménye a köztes kollekcióból számítódik ki.

67 67 Példa: Kimeneti kollekció SELECT kocsmaNév, átlagÁr: AVG( SELECT p.s.ár FROM partition p) Kiveszi a kocsmaNév mezőt a csoport struktúrájából. A csoport partíció minden p tagjából kiveszi az s mezőt (az Eladás objektumot), abból pedig az árat. Átlagolja az árakat, ezáltal létrehozza a kimeneti kollekció struktúráiban az átlagÁr mező értékeit Tipikus kimeneti struktúra: Struct(kocsmeNév = "Józsi kocsmája", átlagÁr = 2.83)

68 68 Kevésbé tipikus példa uMinden sörhöz számoljuk össze, hány kocsma kér érte „alacsony” ( 800 Ft) árat. uStratégia --- csoportosítsunk három érték szerint: 1.A sör neve. 2.Egy logikai függvény, amely igazat ad vissza akkor és csak akkor, ha az ár alacsony. 3.Egy logikai függvény, amely igazat ad vissza akkor és csak akkor, ha az ár magas.

69 69 A lekérdezés SELECT sörNév, alacsony, magas, darab: COUNT(partition) FROM Sörök b, b.eladói s GROUP BY sörNév: b.név, alacsony: s.ár 4.00 Kezdeti kollekció: struktúrák az alábbi formában: Struct(b: Sör objektum, s: Eladás objektum), ahol s.sör = b.

70 70 A köztes kollekció uEgy halmaz az alábbi szerkezetű struktúrákkal: 1.sörNév: string 2.alacsony: boolean 3.magas: boolean 4.partition: Set

71 71 Tipikus struktúra a köztes kollekcióban uS alacsony stb. Sör-Eladás párok halmazai. uAz alacsony és magas nem lehet egyszerre igaz, így az a csoport mindig üres lesz. sörNévalacsonymagaspartition BudTRUEFALSES alacsony BudFALSETRUES magas BudFALSE S közép

72 72 A kimeneti kollekció SELECT sörNév, alacsony, magas, darab: COUNT(partition) uLemásolja a köztes struktúrák első három komponensét és számoljuk meg a partícióban levő párokat, pl. sörNévalacsonymagasDarab BudTRUEFALSE27


Letölteni ppt "1 Objektumorientált adatbázisnyelvek Objektumleíró nyelv Objektumlekérdező nyelv."

Hasonló előadás


Google Hirdetések