Adatbázis modellek 5. téma XML DB Az adatkezelés és XML kapcsolata Miért fontos az XML használata az adatbázis kezelésben? Adattárolás alapformái: - strukturált - szabad-szöveges - szemi struktúrált - XML a web-es adatcsere szabványa - XML széles körben elterjedt - XML rugalmas szerkezetű - XML szemi-struktúrált - XML az adatok mellett a jelentést is hordozza - XML-hez széles szabvány feldolgozó felületek állnak rendelkezésre - XML egyszerűen feldolgozható 1
Az adatkezelés és XML kapcsolata XML XSLT XQuery SQL XPath XML-DB XMLSchema dokumentum orientáltság adat orientáltság rugalmasság hatékonyság integritás Az adatkezelés és XML kapcsolata 2
Az adatkezelés és XML kapcsolata Adatbázis kezelés és XML kapcsolata - XML is alkalmas hosszúidejű adattárolásra - adatdok egyik megjelenítési, közvetítő formátuma - új piaci szegmens - DBMS-ek tartalmaznak XML adattípust - DBMS-ek tartalmaznak XML kezelő függvényeket - DBMS-ek támogatják az xquery-t - DBMS-ek támogatják az XmlSchema-t - DBMS-ek tartalmaznak XML-t generáló,vagy beolvasó funkciókat XML tárolási formátumai Logikai alternatívák: - külső állomány (karakterlánc) : + : egész dokumentum egyben - : lekérdezés, módosítás - belső nem ellenőrzött XML típus táblamezőben +: lekérdezés, érték módosítás -: bővítés, törlés, teljes dokumentum átfésülés - belső sémával ellenőrzött XML típus táblamezőben +: lekérdezés, érték módosítás -: bővítés, törlés, teljes dokumentum átfésülés - objektumokban (objektum táblákban) - lokális változókban 3
XML tárolási formátumai Tárolási alternatívák: - CLOB (karakterlánc) : + : egész dokumentum egyben - : lekérdezés, módosítás - shredded (elemekre bontott, objektum-relációs táblákba átvitt): +: lekérdezés, érték módosítás -: bővítés, törlés, teljes dokumentum átfésülés - binary (az struktúra elemek tokenekkel kódoltak) +: tömörség -: teljes dokumentum átfésülés - hibrid (egyes részek más és más módon tárolódnak) XML tárolási formátumai XML dokumentumok tárolásának fő elemei: XMLType/XML XML DB Repository XML XMLSchema XML-DB XMLType mezők, táblák Táblák XML tárolási formátumok (CLOB, binary, OR) XML-DB Repository séma ellenőrzés XSLT indexelés adatkezelés ACL védelem verzió követés katalógusok 4
XML tárolási formátumai A XML adatkezelés fő problémája: - hatékony keresés, szelekció - tömörítés - védelem XML indexelési alternatívák tárolási típus shredded CLOB CLOB index típus B-fa, bitmap XMLIndex FreeText XMLIndex: (dokumentum ID, position of the node, xpath, value) XML tárolási formátumai XML-DB Repository Az XML-DB Repository célja, hogy egy virtuális file-rendszert tegyen az XMLType mezőkben tárolt XML dokumentumok fölé. XML-DB Repository ACL verziókezelés relációs struktúra FTP HTTP virtuális file-rendszer 5
XML kezelő felülete XML adatok kezelésének alternatívái: - hagyományos szövegkezelő funkciókkal (korlátozott funkciók) - XML szabványok (xquery,..) (általános) - SQL-beli XML szabványok (SQL/XML) (lekérdezésre korlátozott) - DBMS specifikus elemek (XMLDB) (kiterjedt) XML adatok letárolása XML mezőtípus használata Tábla létrehozása: CREATE TABLE XT (KOD INT PRIMARY KEY, SZOVEG XML); Index létrehozása, törlése: CREATE PRIMARY XML INDEX XTI ON XT(SZOVEG); DROP INDEX XTI ON XT; Konstans XML szöveg felvitele: INSERT INTO XT VALUES (1,'<A><B><C>1</C><D>A</D></B><B><C>2</C><D>A</D> </A>'); 6
XML adatok lekérdezése SELECT parancs használata Teljes tartalom lekérdezése: SELECT kod, szoveg FROM XT; Eredmény: 1 <A><B><C>1</C><D>uj</D></B><B><C>2</C> </A> 2 <A><B><C>4</C><D>UU</D></B></A> 3 <autok><auto><tipus> Fiat </tipus></auto><auto> </autok> Egy csomópont szövegtartalmának lekérdezése: SELECT szoveg.value('/b[1]/c[1]','char(2)') from xt; Nem érvényes, nem egyértelmű az alábbi alak: SELECT szoveg.value('/b[1]/c','char(2)') from xt; XML adatok lekérdezése xquery parancs használata Lekérdezés: SELECT szoveg.query('for $i in //B return $i/d ') FROM XT Eredmény: <D>uj</D><D>A</D> <D>UU</D> Létezés vizsgálat: SELECT KOD FROM XT WHERE SZOVEG.exist('//C')=1; 7
XML adatok módosítása xquery parancs használata Csomópont felvitele: UPDATE xt SET szoveg.modify(' insert <E/> into /A[1]/B[1] ') WHERE kod = 1; UPDATE xt SET szoveg.modify(' insert <E/> after /A[1]/B[1] ') WHERE kod = 1; Csomópont törlése: UPDATE xt SET szoveg.modify(' delete //B/E ') WHERE kod = 1 Csomópont módosítása: UPDATE xt SET szoveg.modify(' replace value of (//B[1]/D[1]/text())[1] with xs:string("uj") ') WHERE kod = 1 Relációs tábla XML adatokból Létező XML objektum használata OPENXML(doc_id, r_node, mode) WITH séma: egy létező XML dokumentumból rowset, rekordhalmaz előállítása; táblával egyenértékű halmazt ad doc_id: dokumentum azonosító, előállítása sp_xml_preparedocument-n keresztül r_node: gyökér csomópont mode: megjelenítési minta séma: mezők neve, típusa és képzési típusa az eredmény táblában név típus forrás 8
Relációs tábla XML adatokból Parancssor: declare @did int; exec sp_xml_preparedocument @did output, '<a><b>2</b><b>4</b><b>8</b></a>'; select * from openxml(@did,'/a/b/text()',1) ; exec sp_xml_removedocument @did; Eredmény: id parentid ntype lname text 5 2 3 #text NULL NULL NULL NULL 2 6 3 3 #text NULL NULL NULL NULL 4 7 4 3 #text NULL NULL NULL NULL 8 Relációs tábla XML adatokból Parancssor: declare @did int; exec sp_xml_preparedocument @did output, '<a><b>2</b><b>4</b><b>8</b></a>'; select * from openxml(@did,'/a/b',1) with (AA varchar(8) 'text()') ; exec sp_xml_removedocument @did; Eredmény: AA 2 4 8 9
Relációs tábla XML adatokból Parancssor: declare @did int; declare @stxt varchar(2000); set @stxt = (select convert(varchar(2000), szoveg) from xt where kod = 3); exec sp_xml_preparedocument @did output, @stxt; select * from openxml(@did,'//auto/tipus/text()',2) ; exec sp_xml_removedocument @did; Eredmény: id parentid ntype lname text 6 3 3 #text NULL NULL NULL NULL Fiat 7 5 3 #text NULL NULL NULL NULL Opel XML állomány relációs táblából SELECT FOR XML tipus tipus: RAW AUTO EXPLICIT Minden rekord egy elem, a mezők attributumok lesznek: SELECT * FROM AUTOK FOR XML AUTO; Eredmény: <row rsz="r1 " tipus="fiat " ar="233" /> <row rsz="r2 " tipus="fiat " ar="333" /> Explicit mezőnév kell: SELECT tipus, count(*) as db FROM AUTOK group by tipus for xml AUTO 10
XML állomány relációs táblából Minden rekord egy elem, a mezők gyerekelemek lesznek: SELECT * FROM AUTOK FOR XML AUTO, ELEMENTS; <AUTOK> <tipus>fiat <db>2</db> </AUTOK> <AUTOK> <tipus>opel <db>2</db> </AUTOK> </tipus> </tipus> XML adatok külső állományból OPENROWSET( forrásállomány, eredménytípus) Al-SELECT- ben használhatjuk insert into xt select 3, xx from (Select * FROM openrowset(bulk 'C:\users\kovacs_l\ab_msc\xmldb\X1.XML', SINGLE_BLOB) as xx) as R(xx); 11
XML adatok sémakezeléssel Séma létrehozása: CREATE XML SCHEMA COLLECTION mysc AS ' <schema xmlns="http://www.w3.org/2001/xmlschema"> <element name="a" > <complextype> <sequence> <element name="b" type="string"/> <element name="c" type="string"/> </sequence> </complextype> </element> </schema>' GO XML adatok sémakezeléssel Séma kötése mezőhöz CREATE TABLE T (Col1 xml (mysc)) GO Adatfelvitel: INSERT INTO T VALUES ('<G>3</G>'); Eredmény: XML Validation: Declaration not found for element 'G'. Location: /*:G[1] INSERT INTO T VALUES ('<A><B>aa</B><C>hh</C></A>'); Eredmény: OK 12
Oracle XML kezelő felülete XML adatok letárolása Tábla létrehozása: CREATE TABLE XT (KOD INT PRIMARY KEY, SZOVEG XMLType); Konstans XML szöveg felvitele: INSERT INTO XT VALUES (1, XMLType ('<A><B><C>1</C><D>A</D></B><B><C>2</C> </A> ) ); UDT típusként kezeli az XMLType típust XML kezelő felülete Oracle XML-DB tábla XML/SQL SQL PL/SQL Oracle XML/SQL XML SQL/XML elemei: - XMLElement() - XMLForest() - XMLAggreg() - XMLQuery() - XMLValidate() Oracle XML/DB elemei: - UpdateXML() - DeleteXML() - InsertXMLBefore() Az XML/DB csomag segítségével XML View definálható a relációs adattáblák fölé 13
XPath szabvány XPath : szabvány az XML dokumentumrészletek kijelölésére 1999-ben jött létre Követelmények: -tetszõleges elem vagy elemhalmaz kijelölhetõ legyen -rugalmas elemkijelölés biztosítása, melyben az elem kiválasztása történhet - név alapján - pozíció alapján - érték alapján - öszetett feltételek támogatása - származtatott kifejezések támogatása - tömör jelölési - adattípusok kezelése Add vissza azon áruk nevét, amiből legalább 7 darab van <nev>bab</nev> <nev>ásó</nev> XPath kifejezés Elemi XPath kifejezés általános alakja: tengely::csomópont-szûrés[szelekció] Összetett XPath kifejezés: elem_kif/elemi_kif/ XPath kifejezés értéke: - csomópont-halmaz - logikai értékû érték - numerikus érték - szöveges érték - (navigációs) tengely: megadja a keresés fõ irányát (lehet például a gyererek felé vagy a szülõ felé mozogni) - csomópont-szûrés: az érintett csomópontok halmazát szûkíteni lehet a csomópont neve vagy típusa alapján - szelekció : az elõzõ lépésekben kiválasztott csomópontoknál további, rendszerint a tartalmukra vonatkozó szûkítés 14
XPath kifejezés Tengelytípusok - self: maga a kontextus csomópont - child: gyerek csomópontok (nem elemjellemzõ nem névtér) - descendant: befoglalt csomópontok,tetszõleges mélységben - descendant-or-self: a befoglalt csomópontok + kontextus - parent: a szülőt tartalmazó csomópont - ancestor: befoglaló csomópontotok - ancestor-or-self: a befoglaló csomópontok és a kontextus - preceding: megelõző csomópontotok (nem elemjellemzõ nem névtér) - preceding-sibling: megelőző és testvér - following: követő csomópontotok (nem elemjellemzõ nem névtér) - following-sibling: követő és testvér - attribute: elemjellemzõ - namespace: névtér leíró csomópontok Child::* XPath kifejezés Csomópont szűrés A megadott tengely mentén elhelyezkedő csomópont halmazra történő elemi szűrés Név alapján név névtér:név * Tipus alapján névtér:* node() text() processing instruction() comment() 15
XPath kifejezés Fontosabb rövidítések child:: attribute:: descendant-or-self::node() self::node() parent::node() [position()=2] @ //... 2 child::/adatbazis/ descendant::jatekos[csapat[attribute::p=3]/tipus/text() = 3]/child::nev /adatbazis//jatekos[csapat[@p=3]/tipus/text() = 3]/nev XPath kifejezés Az XPath kifejezés nemcsak útvonal kifejezéseket tartalmazhat + : összeadás - : kivonás * : szorzás div : osztás mod : moduló : csomópont-halmaz egyesítés and : logikai és or : logikai vagy not() : logikai tagadás = : egyenlő!= : nem egyenlő < : kisebb > : nagyobb 16
XQuery minta for $x in doc('xx9.xml')/adatbazis/autok/auto where $x/ar < 222 order by $x/tipus descending return <car> {$x/@rsz} {$x/tipus/text()} {$x/ar} {ll:felez($x/ar)}</car> <adatbazis> <autok> <auto rsz= > <tipus> opel</tipus> <ar>214 </ar> </auto> </autok> <emberek> </emberek> </adatbazis> <car rsz=> opel 214 107 </car> XQuery lekérdezés struktúrája (FLOWER) FOR elem : ciklus LET elem : értékadás ORDER BY elem : rendezés WHERE elem : szelekció RETURN elem : projekció for $x in doc('xx9.xml')/adatbazis/autok/auto where $x/ar < 222 order by $x/tipus descending return <car> {$x/@rsz} {$x/tipus/text()} {$x/ar} {ll:felez($x/ar)}</car> 17
XQuery lekérdezés struktúrája XML dokumentum kijelölés Részfa kijelölés (XPath) fn:doc(file-specifikáció) fn:doc(file-specifikáció)/p1/p2/ for $x in fn:doc("xx9.xml")/adatbazis/autok/auto return <a> {$x} </a> for $x in doc('xx9.xml')/adatbazis/autok/auto for $y in doc('xx9.xml')/adatbazis/emberek/ember return <a> {$x} {$y} </a> XQuery lekérdezés struktúrája Szelekcio FOR $v IN lista LET $w := kifejezes WHERE feltetel RETURN kifejezes for $x in doc('xx9.xml')/adatbazis/autok/auto where $x/ar > 222 return <a> <car>{$x/@rsz}{$x/tipus/text()}</car> </a> 18
XQuery lekérdezés struktúrája a 200-nál drágább autok rendszáma for $v in fn:doc('xx9.xml')//auto where $v/ar>200 return element eredmeny {$v/@rsz} Auto rendszama es a tulaj neve for $a in fn:doc('xx9.xml')//auto for $e in fn:doc('xx9.xml')//ember where $a/@tulaj eq $e/@kod return element eredmeny { element auto {$a}, element tulaj {$e} } XQuery lekérdezés struktúrája Tipusok es darabszamuk <adatok> { for $t in fn:distinct-values( fn:doc('xx9.xml')//auto/tipus ) return element tipus {attribute tip {$t}, attribute db {count( for $a in fn:doc('xx9.xml')//auto where $a/tipus eq $t return element auto {$a/@rsz} ) } } } </adatok> 19