Objektum-orientált adatbázisok Alapfogalmak Ispány Márton 2009. November 30.
Változó kihívások az adatbázis rendszerekkel szemben 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, telekom, GIS, multimédia Komplex objektum-struktúrák megjelenése, hosszabb futamidejű tranzakciók, új adattípusok (képek, filmek, nagy szöveges állományok) 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)
Objektum-orientált (OO) adatbázis rendszerek Object Databases: Objektum-orientált adatbázisok Object Database Management Systems (ODBMS): Objektum-orientált adatbázis-kezelő Fő jellemző: a tervező specifikálni tudja mind a sokszorosan összetett objektumok szerkezetét, mind az ezeken az objektumokon alkalmazható műveleteket
Példák ODBMS-re Objektum-relációs rendszerek: a tradicionális DBMS-ek OO szemlélettel való bővítései (Oracle) Tisztán OO rendszerek kísérleti prototípusai: ORION (MCC), OpenOODB (Texas Instruments), IRIS (HP), ODE (AT T Bell Labs) Kommerciális 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 (ld. később)
OO fogalmak áttekintése Objektum-orientált (OO) szó eredete az OO programozási nyelvekre vezethető vissza 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 fogalmának bevezetése: a belső adatstruktúra elrejtése, az alkalmazható külső műveletek meghatározása (encapsulation – egységbezárás, tokosodás) Első tiszta OO nyelvek egyike: Smalltalk (Xerox PARC), üzenet átadás és öröklődés Hibrid OO nyelvek: C++
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 nyelvekben tranziensek (átmenetiek), a futás befejeztével törlődnek Az objektumok az ODBMS-ekben perzisztensek (állandóak), eltárolódnak, később kinyerhetőek és megoszthatóak más programokkal Egy ODBMS általában több OO programnyelvhez kapcsolódik állandó és osztott objektumokat szolgáltatva számukra
További jellemzők Direkt kapcsolat a valós világ és az adatbázis objektumai között az OID révén Tetszőlegesen összetett szerkezetű objektum megengedett (minden az objektummal kapcsolatos információ tárolható, míg a relációs adatbázisokban az információ sok relációban szóródik szét) Instance változók: 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.)
További jellemzők 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. Típusok és osztályok hierarchiája és öröklődése 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)
További jellemzők 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ó.
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 Objektumok és értékek: 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.
Objektumok OO databázisokban egy összetett objektum állapota más objektumok alapján határozódik meg ún. típus konstruktorok segítségével. Objektumok 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ő konstruktorok: atom, rekord, halmaz További konstruktorok: lista, zsák (bag), tömb
A konstruktorok értelmezése (i, atom, érték): az i azonosítójú objektum állapota a v atomi értéket veszi fel (i, halmaz, {i1, i2, …, in}): az i azonosítójú objektum egy halmaz, amely az i1, i2, …, in (általában azonos típusú) objektumokból áll (i, rekord, <a1:i1, a2:i2, …, an:in>): az i azonosítójú objektum egy n hosszú rekord, melyben aj a j-edik attribútum neve, ij pedig annak az objektumnak az azonosítója melyet értéknek felvesz (i, lista, [i1, i2, …, in]): az i azonosítójú objektum egy rendezett lista (azonos típusú) a felsorolásbeli azonosítójú objektumokból (i, tömb, [i1, i2, …, in]): az i azonosítójú objektum egy egy-dimenziós tömb a listabeli azonosítójú objektumokból
Konstruktorok összehasonlítása 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 abban különbözik a halmaztól, hogy ugyanaz az objektum többször is szerepelhet.
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. Strukturált konstruktor típusok: rekord (hasonló a struct konstruktorához a C(++) nyelvnek)
Példák objektumokra Egy vállalathoz kapcsolódó objektumok, használt konstruktorok: atom, halmaz, rekord, i1, i2, … a rendszer által generált objektum azonosítók. O1=(i1, atom, `Debrecen’) O2 =(i2, atom, `Miskolc’) O3 =(i3, atom, `Budapest’) O4=(i4, atom, 5) O5=(i5, atom, `Kutatás’) O6=(i6, atom, `1988-05-22’) O7=(i7, set, {i1, i2, i3}) O8=(i8, rekord, <Rnév:i5, Rszám:i4, Vezető:i9, Telephely:i7, Alkalmazottak:i10, Projektek:i11>) O9=(i9, rekord, <Vezető:i12, Kezdő_dátum:i6>) O10=(i10, halmaz, {i12,i13,14}) O11=(i11, halmaz, {i15,i16,17}) O17=(i17, rekord, <Vnév:i18, Knév:i19, Szsz:i20, Fizetés:i21, Részleg:i8>)
Objektumok összehasonlítása 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)
Példa objektumok összehasonlítására O1=(i1, rekord, <a1:i4, a2:i6> O2=(i2, rekord, <a1:i5, a2:i6> O3=(i3, rekord, <a1:i4, a2:i6> O4=(i4, atom, 10) O5=(i5, atom, 10) O6=(i6, atom, 20) 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
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.
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 egységbezárása 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
Műveletek egységbezárása 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 Objektumtípusok definiálása a class kifejezéssel történik Jellemző műveletek: objektum konstruktor illetve destruktor Pontozott minősítés: objektum_név.művelet
Objektumok á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)
Objektumok állandóságának biztosítása 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 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) A MINDEN_IRODA objektum az IRODA osztály extentje, amely minden IRODA típusú objektumot perzisztenssé tesz.
Típus (osztály) hierarchia Számos objektumot szeretnénk kezelni Új típusok létrehozása korábbiakból Típus: (név, attribútumok, műveletek) Függvények: attribútumok (instance vá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.
Típus (osztály) hierarchia 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 Példa: 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 DOLGOZÓ subtype-of SZEMÉLY: Fizetés, Alk_kezdete, Beosztás
Típus (osztály) hierarchia HALLGATÓ subtype-of SZEMÉLY: Szak, Tan_átlag Típus hierarchia: az összes szuper/szub típus kapcsolat rendszere Átnevezés: hierarchia révén származtatott függvények átnevezése
Extentek 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