|
![]() | Vytknutí stejných hodnot | ![]() | Formát XML a jeho podpora | Výběr záznamů pro výstup do XML | ![]() |
Pokud se přenosu dat účastní více databázových tabulek, jejich začlenění do DAD se liší podle toho, zda jde o syntetický nebo analytický DAD.
Syntetický DAD dovoluje exportovat do XML data z odpovědi na libovolný dotaz, který lze zapsat v jazyce SQL. Dotaz může kombinovat data pocházející z řady tabulek.
Navržený dotaz je zapsán do DAD mezi globální parametry. Při exportu se tento dotaz nejprve pošle SQL serveru a pak se čtou data z odpovědi a transformují do XML souboru.
Klientský aplikační program může parametrizovat DAD a tím vybrat pro export pouze data splňující určité podmínky.
Klientský aplikační program může také otevřít kurzor se stejnou strukturou sloupců, jako dotaz zapsaný v DAD, a předat ho funkci pro export do XML. V tomto případě se exportují data z kurzoru a dotaz zapsaný v DAD se ignoruje.
Pokud struktura vytvářeného XML souboru má odpovídat relačním vztahům v databázi (je-li záznam Z reprezentován elementem E, pak záznamy relačně připojené k Z jsou reprezentovány elementy obsaženými v E), lze použít metodu vytknutí stejných hodnot před opakující se element.
Mimo to lze do syntetického DADu relačně připojovat další tabulky stejně, jako v níže popsaném analytickém DADu.
Uvažujme trojici tabulek Customers, Orders a OrderLines. Vztah 1:N je mezi tabulkami Customers a Orders (zákazník může mít vícero objedávek) a mezi tabulkami Orders a OrderLines (objednávka může mít vícero položek).
V tabulkách jsou tyto sloupce a tato data:
Customers | Orders | OrderLines | |||||||||||||||||||||||||||||||||||
|
|
|
Dotaz přirozeně propojující obsah tabulek může vypadat takto:
SELECT * FROM Customers JOIN Orders JOIN OrderLines ON (Orders.id_ord=OrderLines.id_ordlin) ON (Customers.id_cust=Orders.id_cust)
DAD pro export vybraných sloupců může vypadat takto (v příkladech XML je pod jménem Join synth 1):
i XML TOP: SELECT * FROM Customers JOIN .... E <list> E <customer> TABLE - base cursor - E <surname> Tx surname E </surname> E <order> E <order_id> Tx id_ord E </order_id> E <item> E <item_id> Tx id_ordlin E </item_id> E <commodity> Tx item E </commodity> E </item> E </order> E </customer> E </list>
Exportem vznikce XML soubor ve tvaru:
<?xml version="1.0" encoding="UTF-8"?> <list> <customer> <surname>Smith</surname> <order> <order_id>0</order_id> <item> <item_id>0</item_id> <commodity>paper</commodity> </item> </order> </customer> <customer> <surname>Smith</surname> <order> <order_id>1</order_id> <item> <item_id>1</item_id> <commodity>pencil</commodity> </item> </order> </customer> <customer> <surname>Smith</surname> <order> <order_id>1</order_id> <item> <item_id>2</item_id> <commodity>diskette</commodity> </item> </order> </customer> <customer> <surname>White</surname> <order> <order_id>2</order_id> <item> <item_id>3</item_id> <commodity>toner</commodity> </item> </order> </customer>
V DAD souboru však můžeme umožnit vytknutí stejných hodnot (v příkladech XML je pod jménem Join synth 2):
... E <order> Multi_occurence ... E <item> Multi_occurence ...
Tím získáme lépe strukturovaný XML soubor přesněji reprezentující strukturu dat v databázi:
<?xml version="1.0" encoding="UTF-8"?> <list> <customer> <surname>Smith</surname> <order> <order_id>0</order_id> <item> <item_id>0</item_id> <commodity>paper</commodity> </item> </order> <order> <order_id>1</order_id> <item> <item_id>1</item_id> <commodity>pencil</commodity> </item> <item> <item_id>2</item_id> <commodity>diskette</commodity> </item> </order> </customer> <customer> <surname>White</surname> <order> <order_id>2</order_id> <item> <item_id>3</item_id> <commodity>toner</commodity> </item> </order> </customer> </list>
Pokud bychom z exportu do XML souboru vypustili číslo objednávky id_ord (v příkladech XML je takový DAD pod jménem Join synth 3), pak by v XML souboru splynuly položky z různých objednávek stejného zákazníka - nebylo by možno rozlišit, zda dvě položky byly objednány pomocí jedné nebo dvou objednávek.
Pokud v XML souboru nechceme mít číslo objednávky, ale přesto bychom chtěli, aby položky z různých objednávek byly v různých výskytech elementu order, bylo by nutno v parametrech elementu order nastavit Opakovat při změně sloupce id_ord.
... E <order> Multi_occurence REPEAT ON CHANGE IN id_ord ...V příkladech XML je takový DAD pod jménem Join synth 4.
Analytický DAD obsahuje odkazy na tabulky v elementech podle tohoto pravidla: Tabulka T je uvedena v elementu E jako nově připojená tabulka, pokud každý výskyt elementu E odpovídá jednomu záznamu v tabulce T.
Druhá a další tabulky v pořadí zanořování v XML jsou relačně připojeny vždy na předchozí tabulku. Připojení je nutno popsat pomocí dvojice sloupců z nadřízené a podřízené tabulky obsahujících propojující klíč. Dále je nutno předepsat setřídění záznamů podle klíče nadřazené tabulky.
DAD pro práci s výše uvedenou trojicí tabulek může vypadat takto (v příkladech XML je takový DAD pod jménem Join analyth):
i XML TOP E <list> E <customer> TABLE Customers ORDER BY id_cust E <surname> Tx Customers.surname E </surname> E <order> JOIN TABLE Orders ON Orders.id_ord=Customers.id_cust ORDER BY id_ord E <order_id> Tx Orders.id_ord E </order_id> E <item> JOIN TABLE OrderLines ON OrderLines.id_ord=Orders.id_ord ORDER BY id_ordlin E <item_id> Tx OrderLines.id_ordlin E </item_id> E <commodity> Tx OrderLines.item E </commodity> E </item> E </order> E </customer> E </list>
Tabulky Customers, Orders a OrderLines jsou připojeny po řadě v elementech customer, order a item.
Všechna jména sloupců použitá v návrhu musí být doprovázena jménem tabulky, protože různé tabulky mohou mít stejně pojmenované sloupce.
Při exportu vznikne XML soubor:
<?xml version="1.0" encoding="UTF-8"?> <list> <customer> <surname>Smith</surname> <order> <order_id>0</order_id> <item> <item_id>0</item_id> <comodity>paper</comodity> </item> </order> <order> <order_id>1</order_id> <item> <item_id>1</item_id> <comodity>pencil</comodity> </item> <item> <item_id>2</item_id> <comodity>diskette</comodity> </item> </order> </customer> <customer> <surname>White</surname> <order> <order_id>2</order_id> <item> <item_id>3</item_id> <comodity>toner</comodity> </item> </order> </customer> <customer> <surname>Black</surname> </customer> </list>
V souboru jsou uvedeni i zákazníci, kteří nemají žádnou objednávku (Black) - z toho je patrné, že při spojování tabulek se provádí OUTER JOIN.
Pomocí stejného DAD lze soubor importovat do tabulek v databázi. Předpokládejme, že pro export a import použijeme DAD obsahující všechny sloupce (v uváděném příkladu jsou kvůli stručnosti některé sloupce vynechány). Hodnoty relačně propojující záznamy (id_cust a id_ord) se při importu zapíší do všech tabulek tak, že relační vztah mezi záznamy bude obnoven.
Relační vazba mezi tabulkami bývá někdy vyjádřena rovností klíčů, které se skládají z více než jednoho sloupce. V takovém případě v popisu připojení nové tabulky uveďte:
Jména sloupců v seznamu oddělte čárkami. V obou seznamech musí být stejný počet sloupců a odpovídající si sloupce v seznamech musí být stejného typu. Pokud by jméno některé sloupce obsahovalo čárku, uveďte je v obrácených apostrofech.
Ve výjimečných případech se jedna tabulka může v návrhu DAD vyskytnout i vícekrát. Pak je nutno odlišit jednotlivé výskyty.
Pro rozlišení výskytů tabulky slouží tzv. alias. Je to identifikátor, který se přiřadí výskytu tabulky v popisu toho elementu, v němž se tabulka připojuje do návrhu.
Pro všechny odkazy na tuto tabulku se pak místo jména tabulky používá její alias. Pokud se tedy každému výskytu tabulky v DAD přiřadí jiný alias, lze odkazy na výskyty snadno rozlišit.
Seznam subsekcí:
![]() | Vytknutí stejných hodnot | ![]() | Formát XML a jeho podpora | Výběr záznamů pro výstup do XML | ![]() |