Využití XML v DB aplikacích Michal Kopecký Výběr ze slajdů k 7. přednášce předmětu Databázové Aplikace (DBI026) na MFF UK
Komunikace aplikace s okolím Databázová aplikace potřebuje často komunikovat s dalšími informačními systémy Export podkladů z IS pro externí účetnictví B2G (business-to-government) Export výkazů pro státní správu B2B (business-to-business) Import údajů z IS jiných firem Elektronické objednávky SOA service-oriented architecture Komunikace mezi jednotlivými komponentami 2
Komunikace aplikace s okolím Pro komunikaci se ve stále větší míře používá XML formát dat Čitelný i pro lidskou obsluhu aplikací Strukturovaný Snadno parsovatelný Velký objem dat Přímé dotazování nad XML daty vyžaduje zcela odlišné nástroje a datové struktury, než relační databází 3
XML a relační databáze Pro komunikaci databázové aplikace s okolím je proto často potřebné Exportovat uložená relační data do XML Získat informace uložené v uzlech XML stromu a uložit je do relačních tabulek Ukládat původní XML dokumenty, získané od obchodních partnerů Vyhledávat XML dokumenty obsahující dané informace 4
Adresování dat v XML - XPath XPath je jedním z často používaných dotazovacích jazyků nad XML Výsledkem dotazu je množina uzlů či atributů, které vyhovují zadané podmínce Dokument je chápán jako strom, obsahující Kořenový uzel (není součástí dokumentu) Elementy Atributy Textové uzly (listy, odpovídají volnému textu mezi uzly) (komentáře, jmenné prostory, instrukce pro zpracování) 5
Adresování dat v XML - XPath Cesta je základním prostředkem pro adresaci uzlu či uzlů ve stromě Absolutní začínají znakem / Relativní Zapisuje se jako seznam kroků, oddělených lomítky. 6
Adresování dat v XML - XPath Příklady Xpath dotazů /knihy/kniha/nazev seznam všech elementů nazev, které jsou přímým potomkem elementu kniha, který je přímým potomkem kořenového elementu knihy. //nazev seznam všech elementů nazev v XML stromu, nacházejících se na libovolných cestách 7
Adresování dat v XML - XPath Příklady Xpath dotazů /knihy/*/nazev na druhém kroku cesty může být libovolný element /knihy/kniha[1]/autor[2] druhý autor první knihy v seznamu /knihy/kniha[autor= Pokorný J. ]/titul tituly všech knih od J. Pokorného 8
Adresování dat v XML - XPath Osy v XPath self:: - aktuální uzel parent::, child:: - přímý rodič/potomci aktuálního uzlu ancestor::, descendand:: - všichni předci/potomci, včetně nepřímých descendand-or-self::, ancestor -or-self:: following::, preceding:: - uzly před/za aktuálním uzlem a všemi jeho předky following-sibling::, preceding-sibling:: - sourozenci attribute:: - atributy aktuálního uzlu child:: tvoří defaultní osu, nemusí se uvádět 9
Adresování dat v XML - XPath preceding:: following:: 10
Adresování dat v XML - XPath Obvykle se využívají zkrácené notace jméno_uzlu místo child::jméno_uzlu @jméno_atributu místo attribute:: jméno_atributu. pro aktuální uzel.. pro rodičovský uzel 11
Adresování dat v XML - XPath Příklady dotazů Názvy všech knih /knihy/kniha/nazev/text() První kniha v seznamu /knihy/kniha[1] <kniha><nazev> </nazev><autor> </autor></kniha> 12
Indexování dat v XML Problémem je efektivita vyhodnocování XPath dotazů, případně dotazů v jiných dotazovacích jazycích nad XML Data mohou být v relační databázi uložena po částech, a využity standardní nástroje (spojení, indexy) Použitelné v libovolné relační databázi Nutná znalost struktury ukládaných dokumentů (DTD, XMLSchema) Data mohou být uložena nativně v podobě textu Nutná podpora speciálních typů indexů 13
Ukládání XML do relačních databází Pokud je potřeba ukládat XML dokumenty, platné vzhledem ke konkrétnímu DTD, je možné použít několik variant uložení Nástin jednoho z možných řešení: Předpokládá dostatečně jednoduché DTD, nebo vytvoření jednoduššího DTD, které je méně striktní, než DTD původní, tj.: platnost v DTD platnost v DTD Elementy jmenují jiné elementy ve svém obsahu nejvýše jednou Obsažený element může být nepovinný (?) nebo opakující se (*) Obsažené elementy jsou oddělené pouze čárkou, ne Na pořadí elementů nezáleží 14
Ukládání XML do relačních databází Pro takto zjednodušené DTD je možné vytvořit Seznam možných cest v XML stromu Pro každý element je E vytvořena tabulka, obsahující sloupce pro jednotlivé atributy E(DocID,ElemID,ParID,PathID,atributy) Id dokumentu, Id elementu,sloupce pro uchování atributů, Id rodičovského elementu, Id cesty na které element leží 15
Ukládání XML do relačních databází <!ELEMENT kniha (titul, autor)> <!ATTLIST kniha isbn CDATA)> <!ELEMENT titul (#PCDATA)> <!ELEMENT autor (#PCDATA)> Kniha(DocID,ElemID,ParID,PathID,ISBN) Titul(DocID,ElemID,ParID,PathID,PCDataId) Autor(DocID,ElemID,ParID,PathID,PCDataId) PCData(DocID,ElemID,Data) 16
Ukládání XML do relačních databází Dotazy v XPath jsou přeformulovány na SQL Často je nutné spojovat velké množství tabulek. Jejich počet je možné snížit např. tím, že pro podstromy, ve kterých se nemůže vyskytovat opakující se element, se vytvoří jediná tabulka obsahující element a všechny podelementy 17
Ukládání XML do relačních databází <!ELEMENT kniha (titul, autor)> <!ATTLIST kniha isbn CDATA)> <!ELEMENT titul (#PCDATA)> <!ELEMENT autor (#PCDATA)> Kniha( DocID,ElemID, ISBN, TitulPCDataId, AutorPCDataId, ParID,PathID) PCData(DocID,ElemID,Data) 18
Ukládání XML do relačních databází <!ELEMENT kniha (titul, autor*)> <!ATTLIST kniha isbn CDATA)> <!ELEMENT titul (#PCDATA)> <!ELEMENT autor (#PCDATA)> Pokud se autor může vícekrát opakovat, je nutné jej uložit do samostatné tabulky, titul ale může být sloučen Kniha( DocID,ElemID,ISBN,TitulPCDataId,ParID,PathID) Autor(DocID,ElemID,ParID,PathID,PCDataId) PCData(DocID,ElemID,Data) 19
Indexace XML dat DataGuide index obsahuje strom cest, vyskytujících se v XML dokumentu Každá cesta je vněm uložena právě jednou Uzly obsahují metainformace o uzlech, které dané cestě odpovídají Je možné jej uložit v XML formátu 20
Indexace XML dat Index cest v XML Obdoba DataGuide indexu V uzlech obsahuje přímo množiny odkazů na jednotlivé elementy, které cestě odpovídají Výrazně urychluje odpovědi na dotazy ve formě cest bez použití // Přispívá pro vyhodnocení dotazů, které alespoň začínají absolutní cestou, a // obsahují ve větší hloubce 21
Indexace XML dat Lore Index VIndex (Value index) - indexuje textové hodnoty uzlů a atributů TIndex (Term index) - indexuje slova v hodnotách elementů LIndex - index pro nalezení otců pro jednotlivé uzly PIndex (Path index) - indexuje cesty a udržuje pro ně množiny odpovídajících uzlů 22
Indexace XML dat Lore Index /knihy//autor[@stat= CZ ] pomocí VIndexu se naleznou atributy stat s hodnotou CZ, pro ně se bottom-up postupem přes LIndex ověří cesta 23
Uložení XML dat MS SQL Nativní datový typ XML CREATE TABLE XmlTab( ID NUMERIC CONSTRAINT XmlTabPk PRIMARY KEY, Dok XML ); INSERT INTO XmlTab VALUES( 1, <a><b>b1</b></a> ); 24
Export tabulky do XML MS SQL MS SQL pro export dat z tabulek do XML podoby používá konstrukci SELECT FOR XML {RAW AUTO EXPLICIT PATH} [,XMLDATA][,ELEMENTS][BINARY BASE64] [ROOT( korenovy_element )] RAW generuje pro každou řádku jeden element row, hodnoty jsou obsažené v atributech elementu, názvy atributů odpovídají názvům sloupců (aliasů) v dotazu 25
Export tabulky do XML MS SQL MS SQL pro export dat z tabulek do XML podoby používá konstrukci SELECT FOR XML {RAW AUTO EXPLICIT PATH} [,XMLDATA][,ELEMENTS][BINARY BASE64] RAW generuje pro každou řádku jeden element row, hodnoty jsou obsažené v atributech elementu, názvy atributů odpovídají názvům sloupců (aliasů) v dotaz <row empno= 1230 ename= King deptno= 10 /> <row empno= 4560 ename= Scott deptno= 10 /> <row empno= 7800 ename= King deptno= 20 /> 26
Export tabulky do XML MS SQL AUTO generuje pro každou tabulku v použitém dotazu jeden element. Struktura odpovídá spojení. Názvy elementů odpovídají názvům tabulek <dept deptno= 10 > <emp empno= 1230 ename= King /> <emp empno= 4560 ename= Scott /> </dept> <dept deptno= 20 > <emp empno= 7800 ename= King deptno= 20 /> </dept> 27
Export tabulky do XML MS SQL Modifikátor ELEMENTS zajistí, že hodnoty atributů jsou uloženy jako podelementy, nikoli jako atributy <dept> <deptno>10</deptno> <emp> <empno>1230</empno><ename>king</ename> <empno>4560</empno><ename>scott</ename> </emp> </dept> <dept deptno= 20 >... </dept> 28
Indexování XML dat MS SQL MS SQL dovoluje nad sloupcem typu XML vytvořit tři typy indexů Nejprve je nutné vytvořit primární XML index CREATE PRIMARY XML INDEX XmlIdx ON XmlTab(Dok) Následně lze vytvořit hodnotový index, index cest a index vlastností CREATE XML INDEX jm ON XmlTab(Dok) USING XML INDEX XmlIdx FOR {VALUE PATH PROPERTY} 29
Získání dat z XML Pokud je k dispozici XML dokument s požadavkem na databázovou aplikaci, je potřebné získat z něj potřebné údaje a požadavek vyřídit, nebo data uložit do relační databáze 30
Získání dat z XML MS SQL Využívá XPath pro adresaci jednotlivých elementů a jejich množin, případně Xquery pro konstrukci výsledného XML z XML zdrojového xml.query(dotaz) Vrací fragment, obsahující elementy, vyhovující dotazu Dok.Query( /kniha/autor ) xml.exist(dotaz) Vrací 1, pokud ex. alespoň jeden uzel, odpovídající dotazu. Jinak vrací 0 xml.value(dotaz,typ) Vrací hodnotu odpovídajícího uzlu 31
Získání dat z XML MS SQL SELECT dok.query( /kniha/autor ) FROM knihy; <autor>pokorný J.</autor> <autor>král J.</autor> SELECT dok.value( /kniha/autor, varchar(30) ) FROM knihy; Pokorný J. Král J. 32
Aktualizace XML - MS SQL Metoda xml.modify( XQuery ) UPDATE Knihy SET seznam=seznam.modify( delete /knihy/kniha[autor= Kopecký M. ] ) WHERE UPDATE Knihy SET seznam=seznam.modify( insert <kniha><autor> </autor> </kniha> into /knihy ) WHERE... 33
Zpřístupnění XML dat MS SQL Pomocí nástroje IIS Virtual Directory Management for SQL Server lze definovat v IIS 5 a vyšším adresář, pomocí kterého lze XML data publikovat na webu //http://localhost/xml?select * FROM KNIHY FOR XML AUTO&root=knihy 34