|
|
| 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 |