Tartalom
Kezdjünk egy egyszerűnek tűnő kérdéssel:
Adatbázis-e egy XML dokumentum önmagában?
Ahogy az előző fejezetekből már korábban kiderülhetett, az XML dokumentum egyaránt tartalmaz adatot és metaadatot. Egy adatbázis legalapvetőbb definíciója az adatok gyűjteménye. Ez a gyűjtemény információt, pontosabban adatot tartalmaz, mint például egy cég könyvelése, vagy netán világméretű demográfiai adatok. Ezen túlmenően az alapvető adatbázis-struktúra leírja,hogy milyen adat található az adatbázisban.
Mi egy struktúra-leíró adat az adatbázisban? A válasz természetesen: az adatbázis metaadata. Az adatbázis metaadat az adatbázis azon adata, ami leírja az adatbázisban tárolt információt. Ezek a metaadatok lehetővé teszi az adatok értelmes visszanyerését, mint amikor a vásárlói vagy demográfiai adatok olvasásakor tudjuk, hogy épp vásárlók neveit olvassuk, vagy éppen a világ egy részének az összes országának a lakossági adatait. A metaadatok nélkül az adatbázisban tárolt információ teljesen értelmetlen.
Az adatok szemantikája nyilvánvalóan beleírható a programokba. Ezeket a programokat lehet utasítani, hogy konkrét tételeket olvasson be a lemezről, mint például az ügyfél nevét. Ezzel szemben lényegesen egyszerűbb, ha ezeket az információkat is magában az adatbázisban tároljuk. Az így kapott struktúra általában lényegesen egyszerűbb mind a programozók, mind az alkalmazások számára, ezáltal hatékonyabb is.
Összességében a fentiekből egyértelműen kiderül, hogy az XML dokumentumaink önmagukban is egy adatbázist alkotnak!
Jogosan merülhet fel a kérdés:
„Ez nem olyan információ, amit például az XSD (XML Schema Definition) tartalmaz, nem pedig maga az XML dokumentum?” A válasz természetesen: Nem.
Egy XML dokumentum önmaga egy adatbázis is – pontosan az, ami. Egy XSD vagy egy DTD csak akkor szükséges, ha XML dokumentumok szerkezetére vonatkozóan ellenőriznünk kell a fejlesztő által kialakított struktúrának történő megfelelőséget.
Az XML egy önleíró nyelv, mivel tartalmazza az adatokat és a hozzájuk tartozó metaadatokat, amelyek meghatározzák az adatok struktúráját, is egy helyen. Ez a metaadat megtalálható az elemek nevében és attribútumaiban valamint magában az XML dokumentum hierarchiájában is. A metaadat leíró mind skalár, mind strukturális értelemben is. Az XML metaadatok kettős természetűek:
Az XML elemek és attribútumok leírják az adatok tulajdonságait. Ez ekvivalens a relációs adatbázisok tábláival és mezőivel.
Egy megfelelően strukturált hierarchikus XML dokumentum leírja a különféle adattípusok közötti kapcsolatokat egy adatbázisban. Ez többé-kevésbé ekvivalens egy relációs adatbázis táblák közötti kapcsolatával, de sokkal jobban hasonlít az objektum-orientált adatok esetén az osztályok között kiépített struktúrára.
Ha most megint sikerült egy kicsit összekeverni az XSD és DTD iránnyal és a relációs szemlélettel az érthető, de fontos kiemelni, hogy egy XML dokumentum metaadatai az elemek (táblák), attribútumok (mezők), és a hierarchia (táblák közötti kapcsolatok) velejárói egy XML dokumentumban – ezek a metaadatok. Egy XML dokumentumnak nincs szüksége relációs táblastruktúrára, hogy definiálja magát – mivel már ő maga egy adatbázis.
Összességében az XML használatának nagy előnye, hogy egy XML dokumentum már rendelkezik egy beépített adatbázis struktúrával. Az XML önleíró abban az értelemben, hogy egyaránt tartalmaz adatot és metaadatot is. A metaadat szintén leíró skaláris (ahogy a mezők és értékek) és strukturális értelemben (mint hierarchia). Az XML hordozható, mivel egyértelműen értelmezhető.
Viszont az XML használatának, mint adatbázisnak számos hátulütője is van. Az XML dokumentumban lehetnek átfedések, és így elég bőbeszédűvé válhat. A valóságban egy XML dokumentum rengeteg információt tartalmaz egyetlen helyen és elég gyakran egyetlen fájlban. Ez a jellemző óriási feldolgozási időket eredményezhet nagy mennyiségű adatok, sok felhasználó, vagy bármilyen háttérfeldolgozás tekintetében. Lényegében egy XML dokumentumokhoz való hozzáférés – a legalapvetőbb formájában – is teljes beolvasást és értelmezést igényel, és bizony potenciálisan hatalmas szövegfájlokról beszélve ez óriási erőforrásokat igényel.
Természetesen életszerűtlen lenne összevetni ezt a méretet a kereskedelmi (tipikusan Oracle és SQL Server) adatbázisok erejével, ahol az adatmennyiség terrabájtos méretekben mérhető. Jelenleg a piacon nincs olyan rendszer ami a gigabájtos méret fölé tudna menni, de ha lenne is, akkor a feldolgozási ideje valószínűleg nem esne az ésszerű kereteken belül.
Definíció szerint egy NXD (natív XML adatbázis) egyaránt lehet egy XML dokumentum vagy egy XML adattípus. Egy XML adattípus a relációs adatbázisok egy speciális tárolási képessége. Ebből az következik, hogy egy natív XML adatbázis gyakorlatilag bármi lehet, ami képes XML adatot XML dokumentumként tárolni. Így egy böngészőben megjelenített XML dokumentum is egy natív XML adatbázis. Ezenkívül az XML adattípusok használata relációs adatbázisokban, például Oracle vagy SQL Server esetén lehetővé teszi a natív XML adatbázis-képességeket is. Lényegében minden, amire szükségünk van egy adatbázis leírásához úgy, hogy az NXD legyen, vagy legalábbis NXD-képes, hogy egy XML dokumentumot XML dokumentumként tudjunk tárolni. Így a relációs, objektum(-relációs) vagy hierarchikus adatbázisokat is használhatjuk.
A natív XML kifejezés tulajdonképpen azt jelenti, hogy az adatbázis az XML része. Más szavakkal, ahogy korábban is leírtuk és ismételtük a jegyzetbe, az XML dokumentumok egyaránt tartalmaznak adatokat és metaadatokat. Az adat az adat, a metaadat pedig megtalálható a struktúrában, vagy legalábbis valamilyen jelentést rendel az adathoz. A metaadatok kiemelése látható a következő példában:
<?xml version="1.0" encoding="utf-8"?> <account:persons xmlns:information="http://example.org/information" xmlns:account="http://example.org/schema/person"> <account:person name="Teszt Elek" age="23"> <account:favourite number="4" dish="Sultkrumpli"/> <account:favouriteWebPage> <account:address>http://www.w3.org</account:address> </account:favouriteWebPage> <information:address> <information:city>Debrecen</information:city> <information:street>Kis utca</information:street> </information:address> </account:person> </account:persons>
Natív XML adatbázisok gyakran tárolnak és tartalmaznak több XML dokumentumot, mint XML darabok gyűjteménye. Egy natív XML adatbázis több, különböző típusú XML dokumentum gyűjteményét tartalmazhatja, ahol a különféle XML dokumentumok más-más témaköröket fednek le, és ezek független adatok gyűjteményei. Például az egyik kollekció tartalmazhatja egy cég vásárlóinak adatait, míg egy másik a föld országainak demográfiai adatait. Ezen felül minden egyes kollekcióban eltérhet az XML töredékek struktúrája is. Ténylegesen, minden egyes egyszerű töredék résznek egy kollekcióban különböző struktúrája lehet az összes többi töredéktől az adott kollekcióban. Ennek az eredménye a strukturális és séma független XML adat.
A kollekciók természetesen összefüggésbe hozhatóak a sémákkal, amennyiben az XML adatok validációja szükséges. A sémafüggetlen XML különösen rugalmas, sokkal gyorsabb és könnyebb fejlesztést tesz lehetővé. Viszont a rugalmasság alacsony adatintegritással jár és azzal a kockázattal, hogy hibák jelenhetnek meg az adatbázis adatai között. A valóságban megszámlálhatatlan indoka van annak, hogy miért alakítsuk az XML dokumentumok gyűjteményeit natív XML adatbázissá, lehetővé téve ezzel egy jó tárolási módot és teljesítményt.
Mindenesetre ennek a rugalmasságnak a félreértése és félreértelmezése problémákat okozhat. Szemlátomást, rengeteg hibához vezethet például túl sok adat többszöri előfordulása, túlzott vagy kevés strukturális komplexitás. A potenciális buktatók listája olyan hosszú, mint az összes lehetséges különböző variációja egy témának amit egy XML-hez hasonlóan rugalmas eszköz segítségével létre lehet hozni. Ezt egy egyszerű példán keresztül szemléltetni is tudjuk, ahol kiindulásként egy régiót írunk le:
<?xml version="1.0"?> <database name="Africa"> <collections> <collection name="Countries"> </collection> </collections> </database>
Az előbbi példa semmilyen adatot nem tartalmaz, de több kollekciót is magába foglal, ahol minden egyes gyűjtemény egy-egy államot jelöl. Ebben a példában az államok az afrikai régióhoz tartoznak. Bővíthetjük további régiókkal is, így eljuthatunk a többszintű adatbázisig.
<?xml version="1.0"?> <databases> <database name="Africa"> <collections> <collection name="Countries"> </collection> </collections> </database> <database name="Europe"> <collections> <collection name="Countries"> </collection> </collections> </database> </databases>
Ellenben visszatérhetünk az egy adatbázis több kollekció útjára is:
<?xml version="1.0"?> <database> <collections> <collection name="Regions"> <region name="Africa"> <population>789548670</population> </region> <region name="Europe"> <population>488674441</population> </region> </collection> <collection name="Countries"> <country name="Finland" region="Europe"> <population>5231372</population> </country> <country name="Germany" region="Europe"> <population>82422299</population> </country> </collection> </collections> </database>
A kollekción belüli kollekciók szintén valós hierarchiába rendezhetőek, ahogy az országok a megfelelő régiókba:
<?xml version="1.0"?> <database> <collections> <collection name="Regions"> <region name="Africa"> <population>789548670</population> </region> <region name="Europe"> <population>488674441</population> <country name="Finland" region="Europe"> <population>5231372</population> </country> <country name="Germany" region="Europe"> <population>82422299</population> </country> </region> </collection> </collections> </database>
A példát tovább folytatva láthatjuk, hogy a sémamentes XML adatbázisoknál a bővítési lehetősége korlátlanok, viszont a korábban vázolt veszélyeket magukban hordozzák és nagyon könnyen problémába és hibába fordulhatnak. Természetesen ha egy sémát is rendelünk az XML dokumentum mellé, akkor - bár ezt a fajta rugalmasságot elveszítjük - az adatbáziskezelő rendszer képes lesz a szerkezetre vonatkozó megszorítások betartatására.
Az indexelés technikáját mindenki jól ismerheti a relációs adatbáziskezelő rendszerek esetén, ahol a célok egyike az adatok hatékony elérése minél kevesebb I/O művelet árán. Relációs táblák esetén a leggyakrabban használt indexelési módszerek a bináris fák, hash algoritmusok és néha bitmapek. Az indexre vonatkozóan még egy nagyon fontos dolgot kell kiemelni: rendezett sorrend vonatkozik rá. Tehát ha egy indexet olvasunk, az adatokat is az index által létrehozott sorrendben olvassuk, függetlenül a táblában vagy az XML dokumentumban található adatsorrendtől. Azonban az XML dokumentumok már eleve tartalmaznak egy belső rendezést, ami az XML struktúráján alapszik, így a rendezett index nem feltétlenül előny natív XML adatbázisok esetén.
Az XML adatbázisoknak különböző indexelési metódusai léteznek. Valószínűleg minden natív XML adatbázis különféle indexelő eljárásokat alkalmaz az aktuális implementációjában. Az indexelése struktúra viszont nem biztos, hogy eltér az alábbi módszerektől.
A leginkább használt indexelési eljárás XML dokumentumok esetén relációs adatbázisokban, még XML adattípus esetén is, az indexelést igénylő XML elemek szétválasztása. Tehát az index egy egyszerű mezőt fog tartalmazni a táblában található minden rekordról. Ez az egy mező minden régióról tartalmaz egy-egy nevet. Továbbá az index egy további mutatót is tartalmazni fog, ami lehetővé teszi az index és a tábla (vagy XML dokumentum) összekapcsolását; ez egy fizikai cím I/O szinten. Más szavakkal, az adatbázisnak rendelkeznie kell egy fizikai címmel minden (indexelt) elemről az XML dokumentumban. Ekkor az index tartalmazza ennek a mutatónak a címét. Az eredmény pedig a következő, mikor megtalál egy régiót az indexben, az adott régióhoz tartozó mutató átadódik egy függvénynek, ami megtalálja a rekordot egy táblában vagy XML dokumentumban a belépési rekord merevlemez címe alapján. A merevlemez címek a teljes adathalmaz vagy talán az index létrehozásakor rendelődnek a tábla vagy az XML dokumentum elemeihez. A folyamat és a folyamat lépéseinek sorrendje teljes egészében a natív XML adatbázis eléréséhez használt szoftvertől függ, vagy attól, ami egy egyszerű XML dokumentumot, vagy XML dokumentumok halmazát egy kollekciók halmazának tartja fent. (Ezek a kollekciók XML-ként vannak tárolva természetesen.)
Itt felmerülhet néhány kérdés bennünk. Például:
Miért tároljunk XML dokumentumokat XML adattípusban, ha az XML adattípus indexelése gyanús,
és talán alá van rendelve a relációs adatbázis indexelésének?vagy:
Miért nem tároljuk az adatokat egyszerűen csak relációs táblákban és konvertáljuk az XML-lé, ha szükséges?
Először talán a második kérdést kellene megvizsgálni: XML-ként tárolva nem szükséges a konvertálás. Ezen felül így lesz hozzáférésünk olyan hasznos XML eszközökhöz, mint az XPath és az XQuery. Az első kérdésre válaszolva: az index az index. Egyes adatbázisoknak barátságosabb indexelési technikai vannak, mint másoknak. Nincs indok arra, miért lenne az XML indexelés kevésbé hatékony mint más indexelés, legyen szó bármely relációs adatbázisról. Természetesen XML adatokat lehet tárolni relációs táblában. Ez egy választási lehetőség. Mindkét módszernek vannak előnyei és hátrányai. Általánosságban minél nagyobb az adatbázis, annál inkább válik megfontolandóvá a relációs táblában való tárolás esélye – és nem az XML adattípusban tárolt XML. Hacsak persze nem használunk XML adattípus kollekciókat. Ezek figyelembevételével 4 féle indexelési mód ismert:
Strukturális index
Elemek és attribútumok indexe, és ezek relatív helyzete a többi elemhez és attribútumhoz képest egy egyszerű XML dokumentumban. Ez az elemeken való keresést segíti.
Érték index
Ha a szövegek és attribútumok gyakran keresett elemek egy XML dokumentumban, a legjobb megoldás ezeket vagy a szöveges és attribútum értékek kombinációját indexeljük.
Teljes szöveges index
Ez egy specifikus érték keresésére vonatkozik az XML dokumentumok gyűjteményében és ezen gyűjtemény egy részletét adja vissza. Az index értéke elég nagy, számos XML dokumentumot vagy töredéket foglal magában egy kollekcióból.
Kontextus index
Ez egy általánosabb formája az indexelésnek, talán egy kicsit elavult, ahol sok dokumentum úgy van indexelve, hogy az index tartalmaz valamilyen értéket, ami egyértelműen beazonosítja az XML dokumentumot. Az indexek egy úgy nevezett „side” táblában vannak tárolva, majd pedig erre a táblára és kerül egy index. A végeredmény egy gyors indexelt elérés XML dokumentumok kollekciójába. Ez a megközelítés elég fárasztó. Jobb ha az XML dokumentum tartalmára kerül index. Ez olyan mintha nagy és rendezetlen XML fájlokat használnánk, kisebb könnyen kategorizálható töredék részek helyett. Bármilyen manuális kategorizálás nagyon idő és erőforrás igényes a modern adatbázisokban, az információ tiszta fizikai méretének köszönhetően.
Az XML dokumentumok tartalmaznak adatot, meta adatot, és némi szemantikát a benne rejlő hierarchikus struktúrában. A dokumentum központú dokumentumok, emberi felhasználásra alkalmasabbak. De lehetnek adat központúak is. Ezek általában számítógépek között megosztott adatok. Ezek generikusabbak, és főként szkript nyelvek általi feldolgozásra használható.
Dokumentum-centrikus XML
Egy dokumentum-centrikus XML, ami már emberi fogyasztásra is alkalmas, elég nehezen értelmezhető számítógéppel, már ha ez egyáltalán lehetséges. A dokumentum-centrikus XML lényegében egy olyan dokumentum, amit normális esetben kézzel írnak – mint egy Word dokumentum, PDF fájl vagy valami hasonló, mint ez a jegyzet. Az ilyen típusú XML dokumentumokat általában teljes egészükben tárolják és általában nem elérhetőek programozási módszerekkel, vagy XML elemtartalommal. Néha ezek a dokumentumok indexelve vannak indexkereséshez, akár a technikai iratok könyvtára. Ezzel szemben létezik néhány technikai iratot tartalmazó adatbázis, ami keveri az adat- és dokumentum-centrikusságot. Például, évekre visszamenőlegesen tárolt technikai iratokat tartalmazó könyvtár adatbázisában értelmes lenne a dokumentumokat egy bizonyos szempont szerint kategorizálni, mint szerző, témakör, szerzés ideje, vagy egyéb leíró információk alapján. Ezen dokumentumok tartalmát lehetne indexelni, hogy az adott anyag tartalmáról általános információval szolgáljon.
A dokumentum-centrikus natív XML egy speciális típusát tartalomkezelő rendszernek (CMS, Content Management System) nevezik. A tartalomkezelő adatbázisok engedélyeznek némi irányítást és kezelést emberek írta XML adatokon keresztül, amelyek egy natív XML adatbázisban XML típusként vannak tárolva.
Adat-centrikus XML
Egy adat-centrikus XML dokumentum legegyszerűbb formájában XML adatokat használ számítógépek közötti adatátvitelhez. A valóságban az XML gyakran keverve tartalmaz adat-centrikus és dokumentum-centrikus jellemzőket. A dokumentum-centrikus jellemzők közé tartozik az ember által alkotott és ember által olvasható rész. Az adat-centrikus részhez az tartozik, hogy generikus és program által elérhető, mivel ismételhető.
Az adat-centrikus dokumentumok talán legjobb példái weboldalakon találhatóak, mint az Amazon vagy eBay. Ezek az oldalak információk tömegét tartalmazzák – a változatosság legkülönfélébb szintjeivel és tartalmával. Például egy könyv az Amazon oldalán, pontosabban annak minden elsődleges jellemzője, például cím, ISBN szám, szerző vagy más adatok adat-centrikusak. Másrészt számos könyv az Amazonon PDF formátumban is letölthető. A PDF fájlok dokumentum-centrikusak, specifikusak az adott könyvre nézve, és csak a PDF dokumentumhoz viszonyítva programozhatóak, ellentétben a PDF tartalmával.
A natív XML adatbázisok használatának különféle vonatkozásait fontos röviden bemutatni:
Tárolás natív XML dokumentumokban: XML dokumentumok tárolhatóak adatbázisban nagy karakteradatként, bináris objektumként vagy valamilyen XML adattípusként. Néhány relációs adatbázis lehetővé teszi több mint 4000 karakter tárolását sztringként. Mivel az XML dokumentumok hossza előre nem jósolható meg ez többnyire nem elegendő. A bináris objektumok egyaránt lehetnek egyszerű binárisan tárolt elemek (BLOB), vagy speciális bináris elemek, nagy szöveges objektumok (CLOB-ok). A CLOB-ok mérete általában fizikailag korlátozott (többnyire 4GB) szemben a sztringek hosszával. Ezen túlmenően a hosszú sztringekkel vagy BLOB-okkal ellentétben, a CLOB-ok többnyire lehetővé tesznek valamilyen szöveges keresést vagy mintaillesztést. Bár egyetlen CLOB alapú mintaillesztés sem ér fel az XML adattípus XML-lehetőségeivel. Néhány relációs adatbázis lehetővé teszi az XML dokumentumok tárolását saját formátumukban, XML adattípusként, teljes XML képességekkel. Az ilyen célra épített natív XML adatbázisoknak nyilvánvalóan rendelkezniük kell az XML funkcionalitásával annak tárolása mellett.
Konkurencia-kezelés, zárolás, tranzakció-kezelés: natív XML adatbázisok relációs adatbázisban, mint XML adattípusok formájában csak az XML dokumentum szintjén szeretik támogatni a zárolást. Vagyis minél nagyobb az XML fájl, annál rosszabb lesz a konkurenciakezelés és a többfelhasználós kapacitás. A csomópont-szint az XML dokumentumokban szintén egy lehetőség, de képzeljük csak el annak az implementációját. A csomópont-szintű zárolás egész biztosan validációt és erőltetett sémát igényel - az XML flexibilitást pedig itt ki is dobtuk az ablakon. Ezt pedig már csak azzal tudjuk fokozni, hogy az XML dokumentumok természetükből fakadóan hierarchikus szerkezetűek, így bármely csomópont zárolása magával vonja az összes szülő csomópont egyidejű zárolását is. A csomópont szintű zárolás nem jó lehetőség a ma létező technológiával. Az, hogy hogyan strukturálunk egy XML fájlt, nagyban függ az alkalmazás igényeitől. Minél nagyobb XML dokumentumokat tárolunk, annál kevésbé lesz alkalmas az adatbázis többfelhasználós környezetben. Egy egyszerű XML dokumentum, mint natív XML adatbázis egy egyfelhasználós környezet.
Natív XML adatbázisok olvasása: natív XML adatbázisok, vagy XML adattípusok adatainak olvasása speciális eszközöket igényel. Ezeket az eszközök az XPath és XQuery.
Natív XML adatbázis tartalmának a megváltoztatása: számos eszköz és funkció érhető el XML dokumentum tartalmának a megváltoztatására. Ami a szabványokat illeti, az XQuery egyértelműen lehetővé teszi a frissítést ( annak ellenére, hogy Query a neve, hasonlóan az SQL-hez).