Lors de la planification des collections XML, vous devez prendre en compte certains points pour la composition de documents à partir de données DB2 et pour la décomposition de documents XML en données DB2. Les sections suivantes traitent de la planification de collections XML et contiennent des remarques sur les opérations de composition et de décomposition.
Une fois la méthode d'accès et de stockage choisie, vous pouvez valider vos données XML à l'aide d'une DTD. La DTD permet de vérifier la validité d'un document XML et de lancer des recherches structurées sur les données XML. Elle est stockée dans le référentiel des DTD.
Recommandation : Validez les données XML à l'aide d'une DTD. Pour cette validation, vous avez besoin d'une DTD dans le référentiel de l'Extension XML. Pour apprendre à insérer une DTD dans le référentiel, reportez-vous à la section Insertion d'une DTD dans le référentiel des DTD. Les exigences liées à la DTD diffèrent selon que vous composez ou décomposez des documents XML.
Important : Prenez votre décision en matière de validation avant d'insérer des données XML dans DB2. L'Extension XML n'accepte pas la validation de données déjà insérées dans DB2.
Remarques :
Pour les collections XML, le fichier DAD mappe la structure du document XML vers les tables DB2 utilisées pour les opérations de composition ou de décomposition.
Par exemple, si un élément <Tax> est présent dans votre document XML, vous devez peut-être le mapper vers la colonne TAX. Vous définissez dans le fichier DAD la relation entre les données XML et les données relationnelles.
Le fichier DAD est indiqué lors de l'activation d'une collection, ou de l'utilisation du fichier DAD avec des procédures mémorisées de collection XML. Le fichier DAD est un document au format XML résidant sur le client. Si vous validez des documents XML avec une DTD, vous pouvez relier le fichier DAD à celle-ci. Utilisé comme paramètre d'entrée dans les procédures mémorisées de l'Extension XML, le fichier DAD est associé au type de données CLOB.
Pour indiquer la méthode d'accès et de stockage de collection XML, vous insérez la balise ci-après dans le fichier DAD :
Une collection XML correspond à un nom virtuel attribué à un ensemble de tables relationnelles contenant des données XML. Les applications peuvent activer une collection XML de tables utilisateur. Ces tables utilisateur peuvent être des tables contenant des données de gestion existantes ou des tables récemment créées par l'Extension XML. Les données de collection XML sont accessibles principalement à l'aide des procédures mémorisées de l'Extension XML.
Le fichier DAD définit l'arborescence du document XML à l'aide des types de noeuds suivants :
La Figure 10 représente un fragment du mappage utilisé dans un fichier DAD. Les noeuds mappent le contenu du document XML vers les colonnes d'une table relationnelle.
Figure 10. Définitions de noeuds
<?xml version="1.0"?> <!DOCTYPE DAD SYSTEM "c:\dtd\dad.dtd"> <DAD> ... <Xcollection> <SQL_stmt> ... </SQL_stmt> <prolog>?xml version="1.0"?</prolog> <doctype>!DOCTYPE DAD SYSTEM "c:\dxx\sample\dtd\getstart.dtd"</doctype> <root_node> <element_node name="Order"> --> Identifies the element <Order> <attribute_node name="key"> --> Identifies the attribute "key" <column name="order_key"/> --> Defines the name of the column, "order_key", to which the element and attribute are mapped </attribute_node> <element_node name="Customer"> --> Identifies a child element of <Order> as <Customer> <text_node> --> Specifies the CDATA text for the element <Customer> <column name="customer"> --> Defines the name of the column, "customer", to which the child element is mapped </text_node> </element_node> ... </element_node> ... <root_node> </Xcollection> </DAD> |
Dans cet exemple, les deux premières colonnes de l'instruction SQL contiennent des éléments et des attributs mappés vers ces dernières.
Vous pouvez créer et mettre à jour le fichier DAD à l'aide de l'assistant d'administration de l'Extension XML ou d'un éditeur.
Si vous utilisez une collection XML, vous devez sélectionner un schéma de mappage qui définit le mode de représentation des données XML dans une base de données relationnelle. Les collections XML devant correspondre à une structure hiérarchique utilisée dans les documents XML à structure relationnelle, vous devez comprendre le mode de comparaison de ces deux structures. La Figure 11 indique comment la structure hiérarchique peut être mappée vers des colonnes de table relationnelle.
Figure 11. Structure de document XML mappée vers des colonnes de table relationnelle
L'Extension XML utilise le schéma de mappage lorsqu'il compose ou décompose des documents XML stockés dans plusieurs tables relationnelles. Il comporte un assistant qui vous aide à créer le fichier DAD. Cependant, vous devez au préalable choisir le schéma de mappage des données XML vers la collection XML.
Le schéma de mappage choisi est précisé dans l'élément <Xcollection> du fichier DAD. L'Extension XML comporte deux types de schémas de mappage : le mappage SQL et le mappage de noeud de base de données relationnelle (RDB_node). Les deux méthodes définissent la hiérarchie du document XML à partir du modèle XSLT.
Le mappage SQL permet aux utilisateurs DB2 de mapper les données à l'aide de SQL. Dans ce mode, vous pouvez réaliser la jointure de toutes les tables en une seule instruction SELECT pour constituer une requête. Si une seule instruction SQL ne vous suffit pas, servez-vous du mappage de noeud RDB. Pour lier toutes les tables entre elles, nous vous recommandons de leur appliquer une relation de type clé primaire - clé associée.
Le noeud de base de données relationnelle (RDB_node) contient une ou plusieurs définitions de noeud applicables aux tables, aux colonnes et aux conditions facultatives. Les tables et les colonnes permettent de définir le mode de stockage des données XML dans la base de données. La condition indique soit les critères de sélection des données XML, soit le mode de jointure des tables d'une collection XML.
Pour définir un schéma de mappage, vous créez un élément <Xcollection>. La Figure 12, représente un fragment d'exemple de fichier DAD avec mappage SQL de collection XML, permettant de composer un ensemble de documents XML à partir de trois tables relationnelles.
Figure 12. Schéma de mappage SQL
<?xml version="1.0"?> <!DOCTYPE DAD SYSTEM "c:\dtd\dad.dtd"> <DAD> <dtdid>c:\dxx\samples\dad\getstart.dtd</dtdid> <validation>YES</validation> <Xcollection> <SQL_stmt> SELECT o.order_key, customer, p.part_key, quantity, price, tax, date, mode, comment FROM order_tab o, part_tab p, table(select substr(char(timestamp(generate_unique())), as ship_id, date, mode, from ship_tab) as s WHERE p.price > 2500.00 and s.date > "1996-06-01" AND p.order_key = o.order_key and s.part_key = p.part_key </SQL_stmt> <prolog>?xml version="1.0"?</prolog> <doctype>!DOCTYPE DAD SYSTEM "c:\dxx\samples\dtd\getstart.dtd"</doctype> <root_node> <element_node name="Order"> <attribute_node name="key"> <column_name="order_key"/> </attribute_node> <element_node name="Customer"> <text_node> <column name="customer"/> </text_node> <element_node> ... </element_node><!-end Part-> </element_node><!-end Order-> </root_node> </Xcollection> </DAD> |
L'Extension XML comporte plusieurs procédures mémorisées pour la gestion des données dans une collection XML. Ces procédures mémorisées supportent les deux types de mappage, mais exigent que le fichier DAD respecte les règles décrites à la section Exigences liées aux schémas de mappage .
Les sections ci-après décrivent les exigences liées à chaque schéma de mappage pour collections XML.
Pour le schéma de mappage SQL, vous devez indiquer l'élément SQL_stmt dans l'élément <Xcollection> du fichier DAD. L'élément SQL_stmt doit contenir une seule instruction SQL pouvant réaliser la jointure de plusieurs tables relationnelles à l'aide du prédicat de requête. En outre, les clauses suivantes sont obligatoires :
SELECT o.order_key, customer, p.part_key, quantity, price, tax, ship_id, date, mode
Dans cet exemple, les éléments order_key et customer de la table ORDER_TAB ont le niveau hiérarchique le plus élevé car ils se situent à un niveau supérieur dans l'arborescence du document XML. Les éléments ship_id, date et mode de la table SHIP_TAB se trouvent au niveau hiérarchique inférieur.
FROM order_tab as o, part_tab as p, table(select substr(char(timestamp(generate_unique())),16) as ship_id, date, mode from ship_tab) as s
Dans cet exemple, la fonction generate_unique() est transtypée en type de données CHAR TIMESTAMP et reçoit l'alias ship_id.
WHERE p.price > 2500.00 AND s.date > "1996-06-01" AND p.order_key = o.order_key AND s.part_key = p.part_key
Même si SQL_stmt doit respecter les exigences précédentes, il constitue un élément puissant car il permet d'indiquer n'importe quel prédicat dans la clause WHERE, dans la mesure où l'expression figurant dans ce prédicat utilise les colonnes des tables.
Pour ce schéma de mappage, n'utilisez pas l'élément SQL_stmt dans l'élément <Xcollection> du fichier DAD. Employez plutôt l'élément RDB_node dans chaque noeud d'élément (element_node) supérieur, ainsi que pour chaque noeud d'attribut (attribute_node) et noeud de texte (text_node).
Le noeud d'élément (element_node) supérieur indiqué dans le fichier DAD représente l'élément racine du document XML. Pour indiquer un noeud RDB pour le noeud d'élément supérieur, procédez comme suit :
<element_node name="Order"> <RDB_node> <table name="order_tab"/> <table name="part_tab"/> <table name="ship_tab"/> <condition> order_tab.order_key = part_tab.order_key AND part_tab.part_key = ship_tab.part_key </condition> </RDB_node>
<table name="part_tab" key="part_key, price"/>
Les informations de décomposition sont ignorées lors de la composition d'un document.
Vous devez explicitement indiquer le nom de table et le nom de colonne.
Dans ce schéma de mappage, les données résident sur le noeud d'attribut (attribute_node) et sur le noeud de texte (text_node) pour chaque noeud d'élément (element_node). Par conséquent, l'Extension XML doit connaître l'emplacement de base de données dans lequel il doit rechercher les données. Vous devez indiquer un noeud RDB pour chaque noeud d'attribut et noeud de texte, en communiquant à la procédure mémorisée la table, la colonne et la condition de requête à utiliser pour l'extraction de données. Les valeurs de table et de colonne sont obligatoires, alors que la valeur de condition est facultative.
<element_node name="Price"> <text_node> <RDB_node> <table name="part_tab"/> <column name="price"/> <condition> price > 2500.00 </condition> </RDB_node> </text_node> </element_node>
<column name="order_key" type="integer"/>
Les informations de décomposition sont ignorées lors de la composition d'un document.
Dans le cadre du mappage du noeud RDB, vous n'avez pas besoin d'entrer des instructions SQL. Cependant, l'insertion de conditions de requête complexes dans l'élément RDB_node peut s'avérer plus difficile. Par exemple, l'expression ou l'opération union est peut-être moins puissante que l'approche SQL-XML.
A partir du mappage du noeud RDB, l'opération de décomposition indique comment un document XML est décomposé dans des tables DB2 par l'extraction de valeurs d'éléments et d'attributs qui sont ensuite insérées dans des lignes de la table. Les valeurs de chaque document XML sont stockées dans une ou plusieurs tables DB2. Chaque table peut comporter jusqu'à 1024 lignes par document décomposé.
Par exemple, si un document XML est décomposé en cinq tables, chacune de ces cinq tables peut comporter jusqu'à 1024 lignes pour ce document. Si la table concerne plusieurs documents, elle peut contenir jusqu'à 1024 lignes pour chacun d'eux. Par exemple, si la table contient 20 documents, elle peut comporter 20480 lignes, soit 1024 lignes x 20 documents.
L'utilisation d'éléments à occurrences multiples (c'est-à-dire d'éléments dont les chemins d'emplacement peuvent apparaître plusieurs fois dans la structure XML) a une incidence sur le nombre de lignes. Par exemple, un document contenant un élément <Part> qui apparaît 20 fois, peut être décomposé en 20 lignes dans une table. Tenez compte de cette restriction relative à la taille des tables lorsque vous utilisez des éléments à occurrences multiples.