|
![]() | Podmíněný výstup údajů do XML | ![]() | Formát XML a jeho podpora | Programové rozhraní pro práci s XML | ![]() |
Pro popis třídy XML dokumentů se často používají XML schémata (XSD). XML schéma může specifikovat, s jakými XML dokumenty pracuje určitý systém, a obsah XML dokumentů lze vůči tomuto XML schématu verifikovat. XML schéma může být také vhodným základem pro vytvoření databázových struktur pro uložení obsahu XML dokumentů v SQL databázi.
XSL-FO formuláře používané v technologii 602XML obsahují XML datovou strukturu, která lze pomocí transformace převézt na XSD schéma. Proto následný popis může být společný.
Obecně je velice obtížné a zdlouhavé analyzovat XSD struktury a podle nich vytvářet odpovídající databázové tabulky, tento proces lze však zautomatizovat. Klientské vývojové prostředí 602SQL obsahuje proto jako součást interaktivního návrháře přenosů dat i tyto operace. Při vytváření nového přenosu se nabídne průvodce, který pro zadané XML schéma (volba Vytvořit tabulky a návrh zobrazení podle XML schématu) nebo formulář (volba Vytvořit tabulky a návrh zobrazení podle XML formuláře) vytvoří jednu nebo více databázových tabulek, dále analytický DAD propojující XML dokumenty odpovídající tomuto schématu s daty ve vytvořených databázových tabulkách a další pomocné objekty pro import a export XML dat. Níže popíšeme pravidla, podle kterých tabulky a DAD vzniknou.
V současné verzi průvodce využívá rozhraní SOM z produktu Xerces. Tento nástroj je součástí instalace 602SQL a je společný pro Windows i Linux.
XML schéma je univerzální nástroj pro popis tříd XML dokumentů. Ne každá třída XML dokumentů se však hodí pro reprezentaci v relační databázi. Dokumenty s volně strukturovaným obsahem, například dokumenty podobné HTML stránkám, obvykle nemá smysl konvertovat do podoby dat v relační databázi. Z dalších odstavců bude patrné, jaké struktury se adekvátně přenášejí do databáze.
Data jednoduchých typů se v XML souboru vyskytují jako hodnoty atributů nebo jako textový obsah elementů. Pro jejich uložení v databázi se v databázových tabulkách vytvoří sloupce. Vztah mezi typy dat v popsanými v XSD a typy sloupců ukazuje tato tabulka:
Typ v XSD (FO) | Typ v databázi |
Boolean | BOOLEAN |
date | DATE |
time | TIME |
dateTime | TIMESTAMP |
gYear, gMonth, gYearMonth, gDay, gMonthDay | CHAR(13) |
duration | CHAR(14) |
base64Binary | BLOB |
hexBinary | BLOB |
anyType (pokud se vnitřní struktura neanalýzuje) | NCLOB |
integer, int, long, short, byte, unsignedInt, unsignedLong, unsignedShort, unsignedByte, nonPositiveInteger, nonNegativeInteger, positiveInteger, negativeInteger, decimal s fractionDigits=0 | INT, BIGINT, SMALLINT, TINYINT (zvoleno podle typu a totalDigits) |
decimal s fractionDigits>0 | NUMERIC(n,d), kde n, d je zvoleno podle totalDigits a fractionDigits |
double, float, decimal bez fractionDigits | REAL |
string, normalizedString, anyUri, token (a odvozené) | CHAR(n) nebo NCHAR(n), kde n je zvoleno podle length, maxLength, enumeration nebo pattern |
Pro číselné XML typy se volí takový databázový typ, aby mohl obsáhnout všechny hodnoty pokud možno bez ztráty přesnosti. Pro znakové řetězce se délka volí podle omezení zadaných v XSD.
Složeným typům sequence, choice nebo all odpovídají v databázové tabulce sloupce pro všechny prvky (particles) tohoto typu. Při importu dat do databáze budou naplněny pouze ty sloupce, pro které byl v XML souboru zadán obsah. Při exportu vystoupí do XML ty atributy a elementy, jimž v databázi odpovídá hodnota různá od NULL.
Pokud element nemá obsah ani atributy, pak mu v databázi nedopovídá žádný sloupec. Výjimkou je případ, kdy výskyt takového elementu je nepovinný (minOccurs=0). Aby databáze reflektovala informaci, zda se tento element v XML souboru vyskytl, obsahuje databázová tabulka sloupec typu BOOLEAN propojený s elementem pomocí dvou konverzních SQL funkcí.
Pokud element má nespecifikovaný obsah (typ any), pak mu v databázi odpovídá sloupec typu NCLOB. Při importu a exportu se element s celým obsahem kopíruje beze změny do databáze nebo z ní, včetně zanořených elementů.
Prefix jmen tabulek | Začátek jména všech vytvářených tabulek. Zbytek jména tabulky je dále tvořen jménem elementu, jehož výskyt v XML dokumentu odpovídá záznamu v tabulce. Může být i prázdný. |
Implicitní délka řetězce | Délka řetězce odpovídajícího znakovému údaji, jehož délku nelze odvodit ze XSD specifikace length, maxLength, enumeration nebo pattern. |
Používat Unicode řetězce | Volba databázového typu CHAR(n) nebo NCHAR(n) pro znaková data. |
Typ ID sloupce | Typ sloupců, které se použijí pro relační propojení databázových tabulek. |
Jméno DAD | Při generování DAD z datové struktury FO formuláře se zde zadává jméno vzniklého DAD. |
Rozsah pravidel referenční integrity | Pokud se pro data vytváří více než jedna tabulka, pak relační vazby mezi tabulkami mohu být zachyceny v pravidlech referenční integrity. Zapsání těchto pravidel do návrhu tabulek lze ovlivnit nastavením jedné ze tří voleb: buď se pravidla nevytvářejí, nebo se vytvářejí všude tam, kde to dovoluje optimalizovaná struktura tabulek, anebo se struktura tabulek pro data podřídí tomu, aby bylo možno definovat maximum pravidel referenční integrity. V posledním případě může vzniknout více tabulek, protože výskyty stejných struktur na různých místech schématu se nebudou ukládat do společné tabulky. |
XML dokumentu importovanému do databáze vždy odpovídá jeden záznam v tabulce nejvyšší úrovně. K tomuto záznamu mohou být relačně připojeny záznamy v dalších tabulkách.
Pokud se některý element může vyskytovat v XML dokumentu opakovaně (v XSD má příznak maxOccurs vyšší než 1 nebo unbounded), pak hodnoty obsažené v tomto elementu a jeho atributech tvoří jeden záznam v podřízené tabulce pro každý výskyt tohoto elementu.
Záznamy v nadřízených a podřízených tabulkách jsou propojeny hodnotami klíčů ve sloupcích nazvaných ID a UPPER_ID. Hodnoty sloupce ID jsou při importu XML dokumentu generovány objektem sekvence. Průvodce vytvoří tuto sekvenci automaticky a dá ji jméno <prefix>id_generator, kde <prefix> je zvolený prefix jmen vytvářených tabulek.
XSD může specifikovat totožné opakovatelné substruktury na více místech v XML dokumentu. Obsah těchto substruktur se ukládá do stejné databázové tabulky. Pokud by se na stejnou nadřazenou tabulku napojovalo více těchto substruktur uložených ve stejné podřízené tabulce, v nadřazené tabulce se objeví kromě sloupce ID také sloupce ID2, ID3 atd.
O rekurzi ve schématu hovoříme tehdy, pokud některý element může v sobě obsahovat subelement stejného jména a typu.
DAD podporuje rekurzi. V parametrech rekurzivního výskytu elementu se zatrhne čtverec Rekurzivní výskyt se stejným modelem obsahu. Pro rekurzivní element se nepopisují jeho atributy ani obsah, protože se považují za stejné, jako v nadřazeném výskytu tohoto elementu.
Obsah XML souboru může být do značné míry variabilní. Atribut svázaný s databázovým sloupcem může mít v XSD příznak (use=), že jeho uvedení není povinné. Element, jehož obsah je svázán s databázovým sloupcem, může mít minimální počet výskytů (minOccurs) roven nule, nebo se může nacházet v nepovinné větvi skupiny choice nebo all.
V takovém případě při importu dat do databáze zůstane v databázovém sloupci implicitní hodnota určená v definici tabulky, typicky hodnota NULL.
Při zpětném exportu dat do XML by se příslušný atribut nebo element neměl objevit. Průvodce vytvářející DAD to zajišťuje definováním podmínek pro výstup atributu nebo elementu. Postupuje podle těchto pravidel:
Průvodce vytvoří iniciální DAD a tabulky podle zadaného schématu. Tyto objekty lze následně upravit. Typické úpravy mohou být například tyto:
Tabulky vytvořené průvodcem používají společnou sekvenci pro generování klíčů (ve sloupcích ID, případně ID2 atd.). V některých případech lze použít různé sekvence pro různé tabulky. Společná sekvence je však nebytná, pokud se používá rekurze nebo pokud byly stejné substruktury opakující se na více místech ve schématu umístěný do stejné tabulky.
![]() | Podmíněný výstup údajů do XML | ![]() | Formát XML a jeho podpora | Programové rozhraní pro práci s XML | ![]() |