10. előadás Alapfogalmak Adatbázisrendszerek előadás 2016. november 28. OO, és Debreceni Egyetem Informatikai Kar Az előadások Elmasry & Navathe: Database Systems alapján készültek. 10.1
Hagyományos adatmodellek: Hierarchikus Hálózati (a 60 s évek közepe óta) Relációs (1970 óta illetve 1982 óta) (OO) adatmodellek 90 s évek közepétől. Az objektumorientált létrehozásának okai: Tradicionális adatmodellek (relációs, hálózatos, hierarchikus) sikere a tradicionális alkalmazásoknál Növekvő igény a komplex adatbázis alkalmazások iránt, pl. CAD/CAM, CIM, tudományos, telekom, GIS, multimédia Komplexebb struktúrájú objektumok megjelenése, hosszabb futamidejű tranzakciók, új adattípusok (képek, filmek, nagy szöveges állományok), nem-standard alkalmazás-generált műveletek Igény arra, hogy kezelni tudjunk tetszőleges adattípust a hagyományos lekérdező nyelvek megtartásával OO programozási nyelvek elterjedése, a hagyományos adatbázis rendszerek nehézkesen működnek együtt OO nyelvekkel (C++, Java, Smalltalk) OO 10.2
Objektum-orientált (OO) adatbázis rendszerek Object Databases (O(O)DB): Objektum-orientált Object Database Management Systems (OD(B)MS): Objektum-orientált adatbázis-kezelő rendszerek Fő jellemző és előny: a tervező specifikálni tudja mind a sokszorosan összetett objektumok szerkezetét, mind az ezeken az objektumokon alkalmazható műveleteket Objektum-relációs rendszerek (ORDBMS): a tradicionális RDBMS-ek OO szemlélettel való bővítései (Oracle), SQL 2008 szabvány (először mint SQL/Object majd az SQL/Foundation része) Tisztán OO rendszerek kísérleti prototípusai: ORION (MCC), OpenOODB (Texas Instruments), IRIS (HP), ODE (AT&T Bell Labs) Üzleti tisztán OO rendszerek: GEMSTONE/S Object server (GemStone Systems), ONTOS DB, Objectivity/DB, Versant Object Database, ObjectStore, Ardent Szabványosítás az ODMG (Object Database Management Group) konzorcium keretében: ODMG 3.0 szabvány OO 10.3
OO fogalmak áttekintése Objektum-orientált (OO) szó eredete az OO programozási nyelvekre vezethető vissza Objektum azonosító (OID) fogalma SIMULA nyelv (60 s évek vége): az osztály fogalmának bevezetése, egy objektum belső adatstruktúrájának leírása egy osztály deklarációban Absztrakt adattípus (absztrakt adatobjektum) fogalmának bevezetése: objektum szerkezete és típus konstruktorok A műveletek egységbezárása (encapsulation), a belső adatstruktúra elrejtése, az alkalmazható külső műveletek, metódusok meghatározása Perzisztencia (állandóság) és tranziencia (ideiglenesség) Típus és osztály hierarchia és Első tiszta OO nyelvek egyike: Smalltalk (Xerox PARC), üzenetküldés és Hibrid OO programozási nyelvek: C++ OO 10.4
Objektum Két komponense van: állapot (érték) és tulajdonság (művelet) (korai definíció) Hasonló a program változójához kivéve, hogy összetett adatstruktúra is lehet és a programozó speciális műveleteket definiálhat rajta Az objektumok az OO programozási nyelvekben tranziensek (átmenetiek), a futás befejeztével törlődnek Az objektumok az ODMS-ekben perzisztensek (állandóak), eltárolódnak, később kinyerhetőek és megoszthatóak más programokkal Egy ODMS általában több OO programnyelvhez kapcsolódik állandó és osztott objektumokat szolgáltatva számukra OO 10.5
jellemzői Direkt kapcsolat a valós világ és az adatbázis objektumai között az objektum azonosító (OID) révén Tetszőlegesen összetett szerkezetű objektum megengedett (minden az objektummal kapcsolatos információ tárolható, míg a relációs ban az információ sok relációban szóródik szét) Egyedváltozók (instance variables): azon értékeket hordozzák, melyek az objektum belső állapotát írják le. Hasonló a relációs modell attribútumához kivéve, hogy a külső felhasználók számára nem láthatóak. Teljes egységbezárás: minden a felhasználók által használható műveletnek előre definiáltnak kell lenni. (Túl szigorú, pl. a lekérdezésekhez tudni kell az attribútum neveket, az ad-hoc lekérdezéseket nehéz specifikálni.) Az egységbezárás támogatására a műveletek két részből állnak: interfész (felület) és metódus (törzs). Az első a művelet nevét és paramétereit írja le, a második a művelet implementációját specifikálja. OO 10.6
jellemzői Típusok és osztályok hierarchiája és e: típusok és osztályok inkrementális létrehozása, újrahasznosítás Reláció-kezelés: az egységbezárás miatt ez elrejtésre került a külső felhasználók számára (korai rendszerek problémája), az ODMG szabvány ezt megoldotta a bináris kapcsolatok explicit megjelenítésével, inverz hivatkozási párral Verzió-kezelés: egy objektumnak időbeni története van, ennek a nyomonkövetése. Sémaevolúció (ld. ALTER TABLE) Művelet túlterhelés (operator overloading): ugyanaz a művelet többféle típusú objektumon is végrehajtható, a művelet nevéhez több különböző implementáció tartozik attól függően, hogy milyen objektumra kívánjuk alkalmazni. (operátor polimorfizmus polymorphism) Késői kötés: a futás során kapcsolódik össze a művelet neve és a megfelelő implementáció. OO 10.7
Objektum azonosító Az adatbázisban tárolt minden különböző objektum kap egy azonosítót: objektum azonosító (OID - object identifier). Feladata: az adatbázis objektumainak egyértelmű azonosítása, segítségével objektumok közötti hivatkozásokat tudunk létrehozni és kezelni. Egy program alkalmas típusú változójához is hozzárendelhetjük ha szükséges. Tulajdonságok: megváltozhatatlanság, egyértelműség, láthatatlanság (külső felhasználó szempontjából), ábrázolás hosszú egész Az OID nem függhet az objektum egyes értékeitől sem, szemben az elsődleges kulccsal a relációs modellben és értékek (literálok): a legtöbb rendszer külön kezeli, az objektumok megváltozhatatlan OID-vel rendelkeznek, míg az értékeknek nincs OID-jük (így más objektumok nem hivatkozhatnak rájuk) és csak magukban állnak. Egyes rendszerek megengednek OID nélküli komplex struktúrákat mint literálokat. OO 10.8
Az ODMS-ekben az objektumok és a literálok tetszőleges összetettségű típus szerkezettel bírhatnak, amely az összes szükséges információt tartalmazza. A hagyományos adatbázis rendszerekben az összetett objektumokkal kapcsolatos információk sok relációra illetve rekordra szóródnak szét elvesztve így sokszor a direkt kapcsolatot a valós világ objektumai és azok adatbázisbeli reprezentációi között. OO databázisokban egy összetett objektum állapota más objektumok alapján határozódik meg ún. típus konstruktorok segítségével. formális leírása egy hármassal történik: (i, c, v), ahol i az objektum azonosítója, c a típus konstruktor és v az objektum állapota (jelenlegi értéke) Alapvető típus konstruktorok: atom, rekord (struct, tuple), kollekció (több-értékű) További konstruktorok a kollekción belül: halmaz (set), lista (list), zsák (bag), tömb (array), szótár (dictionary) OO 10.9
A konstruktorok értelmezése Atom konstruktor, (i, atom, v): az i azonosítójú objektum állapota a v atomi értéket veszi fel. Lényegében az alapvető beépített adattípusokat tartalmazza, már nem használjuk a legutóbbi objektum szabványokban. Rekord konstruktor, (i, rekord, a 1 : i 1, a 2 : i 2,..., a n : i n ): az i azonosítójú objektum egy n hosszú rekord, melyben a j a j-edik attribútum neve, i j pedig annak az objektumnak az azonosítója melyet értéknek felvesz. Összetett típusnak is nevezik, bár inkább típus-generátorként gondolhatunk rá. Halmaz konstruktor, (i, halmaz, i 1, i 2,..., i n ): az i azonosítójú objektum egy halmaz, amely az i 1, i 2,..., i n (általában azonos típusú) különböző objektumokból áll. Lista konstruktor, (i, lista, [i 1, i 2,..., i n ]): az i azonosítójú objektum egy rendezett lista (azonos típusú) a felsorolásbeli azonosítójú objektumokból. Zsák konstruktor, (i, halmaz, i 1, i 2,..., i n ): az i azonosítójú objektum egy zsák, amely az i 1, i 2,..., i n (általában azonos típusú) objektumokból áll, melyek között azonosak (azaz az OID-jük megegyezik) is lehetnek. OO 10.10
A konstruktorok értelmezése Tömb konstruktor, (i, tömb, [i 1, i 2,..., i n ]): az i azonosítójú objektum egy egy-dimenziós tömb a listabeli azonosítójú objektumokból. Szótár konstruktor, két rekord egy (K, V ) párja, ahol K a kulcs, melyre a V értéket kapjuk vissza. A lista abban különbözik a halmaztól, hogy rendezett. A tömb abban különbözik a listától, hogy a dimenzója véges (ismert). A zsák (multihalmaz) abban különbözik a halmaztól, hogy ugyanaz az objektum többször is szerepelhet. A kollekció típus fő jellemzője, hogy azonos típusú objektumok vagy értékek (ha literálról van szó) összessége. Ezzel szemben a rekord általában különböző típusú objektunok együttese. OO 10.11
Konstruktorok alkalmazása és osztályozása Ez az objektum modell megengedi a korábban definiált és más konstruktorok tetszőleges mélységű egymásba ágyazását. Mivel az összetett (nem-atomi) objektumok más, egyszerűbb objektumokra hivatkoznak az objektum azonosítók révén, az aktuális állapot csak az atomi típusú objektumok állapotaiban jelenik meg. Gyűjtemény (kollekció collection) konstruktor típusok: halmaz, lista, tömb, zsák, szótár. Strukturált konstruktor típusok: rekord (hasonló a struct konstruktorához a C(++) nyelvnek) OO 10.12
Példák objektumokra Egy vállalathoz kapcsolódó objektumok, használt konstruktorok: atom, halmaz, rekord. Az i 1, i 2,... a rendszer által generált objektum azonosítók o 1 = (i 1, atom, Budapest ) o 2 = (i 2, atom, Kecskemét ) o 3 = (i 3, atom, Vác ) o 4 = (i 4, atom, 5) o 5 = (i 5, atom, Kutatás ) o 6 = (i 6, atom, 1988. május 22. ) o 7 = (i 7, halmaz, {i 1, i 2, i 3 }) o 8 = (i 8, rekord, Rnév:i 5, Rszám:i 4, Vezető:i 9, Telephely:i 7, Alkalmazottak:i 10, Projektek:i 11 ) o 9 = (i 9, rekord, Vezető:i 12, Kezdő_dátum:i 6 ) o 10 = (i 10, halmaz, {i 12, i 13, i 14 }) o 11 = (i 11, halmaz, {i 15, i 16, i 17 }) o 12 = (i 12, rekord, Vnév:i 18, Knév:i 19, Szsz:i 20, Fizetés:i 21, Részleg:i 8 ) OO 10.13
Erős egyenlőség: két objektum azonos állapotban van ha a gráfjaik minden lehetséges szempontból (pl. az OID-k minden szinten) megegyeznek. Gyenge egyenlőség: Két objektum egyenlő állapotban van ha a gráfjaik szerkezete megegyezik és a gráfban lévő atomi értékek is megegyeznek (de pl. a gráf közbenső szintjein az OID-k már nem feltétlen) OO 10.14
Példa objektumok összehasonlítására o 1 =(i 1, rekord, a 1 : i 4, a 2 : i 6 o 2 =(i 2, rekord, a 1 : i 5, a 2 : i 6 o 3 =(i 3, rekord, a 1 : i 4, a 2 : i 6 o 4 =(i 4, atom, 10) o 5 =(i 5, atom, 10) o 6 =(i 6, atom, 20) OO O1 és O3 között erős egyenlőség van hiszen gráfjaik teljesen megegyeznek O1 és O2 között gyenge egyenlőség van hiszen gráfjaik szerkezete és az atomi értékek benne megegyeznek, de két különböző OID (O4 ill. O5) szerepel benne ezért nincs erős egyenlőség 10.15
Típus konstruktorok Az Object Definition Language (ODL) foglalja magukba a korábban definiált és más típusokat létrehozó konstruktorokat. Arra használjuk, hogy az OO adatbázis séma adatszerkezetét hozzuk létre velük. OO 10.16
Műveletek egységbezárása Cél: absztrakt adattípusok kezelése, információ-elrejtés (szemben a tradicionális relációs modellel, ahol minden reláció összes attribútumával együtt látható a felhasználók és külső programok számára). Egy objektumtípust viselkedésének leírásával definiálunk, melyet az objektumtípushoz külső hozzáférést biztosító műveleteken alapulnak. Műveletek: objektumok létrehozása, törlése, állapotának módosítása, egyes részeihez való hozzáférés biztosítása ill. ezek kombinációi. Műveletek felépítése: interfész (szignatúra) mely a műveletek nevét és paramétereit definiálja (látható), implementáció (metódus) az objektum belső adatszerkezetét és az eléréséhez szükséges műveletek leírását tartalmazza (rejtett). Egy metódus hívása egy üzenetküldéssel történik az objektum felé, hogy hajtsa végre azt. Teljes egységbezárás: túl erős követelmény, általában az objektumok szerkezetét két részre, látható és rejtett attribútumokra osztjuk. OO 10.17
Műveletek egységbezárása A class kulcsszó: a típus definiálása a műveleteivel együtt. Tipikus műveletek: objektum létrehozása (create, new), objektum törlése (destroy), illetve az objektum állapotának módosítása (modify, update). A módosítás (update) műveletek egységbezárása: előnye hogy kevés integritási megszorítást kell előredefiniálni, ezeket a metódusokba lehet beleprogramozni. Így ezek a megszorítások automatikusan kikényszeríthetőek. Pontozott minősítés: objektum_név.művelet OO 10.18
állandóságának biztosítása Tranziens és perzisztens objektumok Általában nem minden objektumtípus lesz állandó (perzisztens) egy adatbázisban, ezt külön biztosítani kell Az állandóság biztosítása: elnevezési mechanizmussal vagy elérhetőséggel Elnevezési mechanizmus: egyértelmű és állandó nevet ad egy objektumnak, mellyel hivatkozhatunk rá külső programokból (belépési pont) Elérhetőségi mechanizmus: segitségével perzisztens objektumokból érhetünk el további objektumokat (így elég kevés számú perzisztens objektumot definiálnunk) Egy B objektum elérhető az A objektumból ha az objektum gráfban hivatkozások (élek) egy sorozata vezet A-ból B-be A MINDEN_IRODA objektum az IRODA osztály extentje, amely minden IRODA típusú objektumot perzisztenssé tesz. OO 10.19
Típus (osztály) hierarchia és Számos objektumot szeretnénk kezelni lehetőleg minél egyszerűbben. Ennek módja új típusok létrehozása korábbiakból. Típus: (név, attribútumok, műveletek) Függvények: attribútumok (egyedváltozók), műveletek. Attribútum: argumentum nélküli függvény TYPE_NAME: function,..., function Példa: SZEMÉLY: Név, Cím, Szül_dátum, Kor, Szsz ahol a Kor művelet, amellyel az életkort számolhatjuk ki, a többi pedig attribútum. Szubtípus (altípus): egy olyan új típus, amely egy már definiált típus összes függvényét tartamazza. Szupertípus (szülőtípus): az a típus, amelyből a szubtípust származtattuk. OO 10.20
Példa re Tegyük fel, hogy az alábbi új típusokat szeretnénk definiálni: DOLGOZÓ: Név, Cím, Szül_dátum, Kor, Szsz, Fizetés, Alk_kezdete, Beosztás HALLGATÓ: Név, Cím, Szül_dátum, Kor, Szsz, Szak, Tan_átlag Mivel mindkettő tartalmazza a SZEMÉLY típus összes függvényét, így annak altípusaként definiálhatóak: DOLGOZÓ subtype-of SZEMÉLY: Fizetés, Alk_kezdete, Beosztás HALLGATÓ subtype-of SZEMÉLY: Szak, Tan_átlag A DOLGOZÓ altípus tárolt attributumokként tartalmazza a Fizetés, Alk_kezdete és Beosztás attribútumokat. A HALLGATÓ altípus tárolt attribútuma a Szak, míg a Tan_átlag műveletként implementálhatjuk. Áltatában egy altípus szupertípusának összes függvényét tartalmazza azokkal a speciális függvényekkel együtt, amelyek csak erre az altípusra jellemzőek. Ez által egy típus hierarchiát generálhatunk a rendszerben definiált típusok között. OO 10.21
Típus (osztály) hierarchia Típus hierarchia: az összes szuper/szub típus kapcsolat rendszere Átnevezés: hierarchia révén származtatott függvények átnevezése Permanens és tranziens kollekciók Példa geometriai objektumok típus hierarchiájára GEOMETRIAI_OBJEKTUM: Alak, Terület, Ref_pont Az Alak az objektum alakját írja le (háromszög, kör stb.), a Ref_pont a síkon elfoglalt helyét, míg a Terület metódus az objektum területét számolja ki más-más módon. TÉGLALAP subtype-of GEOMETRIAI_OBJEKTUM: Szélesség, Hosszúság HÁROMSZÖG subtype-of GEOMETRIAI_OBJEKTUM: Oldal1, Oldal2, Szög KÖR subtype-of GEOMETRIAI_OBJEKTUM: Sugár OO 10.22
ek Ugyanolyan típusú objektumok egy kollekciója A cél az, hogy az objektumainkat állandóvá tegyük Általában az összes azonos típusú objektum szerepel a típushoz tartozó extentben Object: minden objektumot tartalmazó extent Megszorítás az extenteken, hogy legyenek kompatibilisek a típus hierarchiával, azaz az altípus extentje legyen része a szubtípus extentjének. define class IRODA_SET; type set (IRODA); operations add_iroda(d: IRODA): boolean; (új iroda hozzáadása) remove_iroda(d: IRODA): boolean; (iroda törlése) create_iroda_set: IRODA_SET; (új iroda-halmaz létrehozása) destroy_iroda_set: boolean; (iroda-halmaz megszüntetése) end IRODA_SET; persistent name MINDEN_IRODA: IRODA_SET; d:=create_iroda; (új iroda létrehozása a d változóban) b:=minden_iroda.add_iroda(d); (d perzisztenssé tétele) OO 10.23
Műveletek polimorfizmusa Más névvel művelet túlterhelés: ugyanaz az operátor név vagy szimbólum attól függően jelöl más és más műveletet, hogy milyen objektumra alkalmazzuk. Korai (statikus) kötés vagy késői (dinamikus) kötés Többszörös, szelektív Többszörös : akkor beszélünk róla ha egy altípus kettő vagy több típus altípusa és így értelemszerűen örökli mindkettő vagy az összes függvényét (attribútumait és metódusait). Szelektív : amikor egy altípus csak egy típus bizonyos függvényeit örökli, amelyeket nem azokat az EXPECT klózzal jelezzük OO 10.24