XML コレクションの計画を立てるとき、 DB2 データからの文書の合成と DB2 データへの XML 文書の分解の、 一方または両方に関していくつかの考慮事項があります。 以下の項では、XML コレクションを計画する上での懸案事項について述べ、 合成および分解に関する考慮事項を示します。
アクセスおよび保管の方式を選択した後、 データの妥当性検査を行うかどうかを決めることができます。 DTD を使用して XML データの妥当性検査を行います。 DTD を使用すると、XML 文書が有効であることを確認し、 XML データを構造化検索できるようになります。 DTD は DTD リポジトリーに保管されています。
推奨:XML データは DTD を使用して妥当性検査を行ってください。 妥当性検査を行うためには、DTD が XML エクステンダー・リポジトリーに存在しなければなりません。 DTD をリポジトリーに挿入する方法については、DTD リポジトリーへの DTD の保管を参照してください。 DTD の要件は、XML 文書を構成しているのか分解しているのかによって異なります。
重要: XML データを DB2 に挿入する前に、 XML データの妥当性検査を行うかどうかを決めてください。 XML エクステンダーは、すでに DB2 に挿入されているデータの妥当性検査はサポートしません。
考慮事項:
XML コレクションの場合、DAD ファイルは XML 文書の構造を、 文書の構成元または分解先である DB2 表にマップします。
たとえば、XML 文書内に <Tax> と呼ばれる要素がある場合、 <Tax> を TAX と呼ばれる列にマップしなければならないという具合です。 XML データとリレーショナル・データとの関係を DAD 内で定義します。
DAD ファイルは、コレクションを使用可能にする際に指定するか、 または DAD ファイルを XML コレクションのストアード・プロシージャー で使用する際に指定します。 DAD は XML 形式の文書で、クライアントに存在します。 XML 文書を DTD を使用して妥当性検査することを選択した場合、 DAD ファイルをその DTD に関連付けることができます。 XML エクステンダーのストアード・プロシージャーの入力パラメーターとして使用される場合、 DAD ファイルのデータ・タイプは CLOB です。
XML コレクションのアクセスおよび保管の方法を指定するには、 DAD ファイル内で以下のタグを使用します。
XML コレクションは、XML データを含むリレーショナル表のセットの仮想名です。 アプリケーションは任意のユーザー表の XML コレクションを使用可能にすることができます。 これらのユーザー表は、既存の業務データ用の既存の表、または XML エクステンダーが最近作成した表などです。 XML コレクション・データへのアクセスには、 主に XML エクステンダーに備わっているストアード・プロシージャーを使用します。
DAD ファイルは、以下の種類のノードを使用して XML 文書のツリー構造を定義します。
図 10 は、DAD ファイルで使用されているマッピングの一部を示しています。 このノードは、XML 文書の内容をリレーショナル表内の表列にマップします。
<?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> |
この例では、SQL ステートメント内の最初の 2 列に対して要素および属性がマップされます。
XML エクステンダー管理ウィザードまたはエディターを使用して、DAD ファイルの作成および更新を行うことができます。
XML コレクションを使用している場合、 XML データをリレーショナル・データベース内で表す方法を定義するマッピング体系 を選択しなければなりません。 XML コレクションはリレーショナル構造の XML 文書内で使用される階層構造と一致しなければならないので、 それら 2 つの構造の相違点を理解している必要があります。 図 11 は、 階層構造がリレーショナル表の列にどのようにマップされるかを示しています。
図 11. リレーショナル表の列にマップされた XML 文書構造
![]() |
XML エクステンダーは、複数のリレーショナル表内にある XML 文書を構成または分解するとき、 マッピング体系を使用します。 XML エクステンダーには、DAD ファイルの作成に役立つウィザードが備わっています。 しかし、DAD ファイルを作成する前に、 XML データを XML コレクションにマップする方法を考えなければなりません。
マッピング体系は、DAD ファイル内の <Xcollection> 要素に指定されます。 XML エクステンダーには、SQL マッピング と リレーショナル・データベース (RDB_node) マッピング という、 2 種類のマッピング体系が備わっています。 どちらの方式も XSLT モデルを使用して XML 文書の階層を定義します。
SQL マッピングにより、DB2 ユーザーは SQL を使用してデータをマップすることができます。 SQL マッピングを使用するとき、 1 つの SELECT ステートメント内ですべての表を結合して照会を形成しなければなりません。 1 つの SQL ステートメントでは十分でない場合、RDB_node マッピングの使用を考慮してください。 すべての表を結び合わせるため、これらの表に基本キー と外部キー の関係があることが推奨されます。
RDB_node には、 表、任意指定の列、および任意指定の条件についてのノード定義が 1 つ以上含まれます。 表および列は、XML データをデータベースに保管する方法を定義するために使用されます。 条件は、XML データの選択基準、または XML コレクション表を結合する方法を指定します。
マッピング体系を定義するには、<Xcollection> 要素のある DAD を作成します。 図 12 は、 3 つのリレーショナル表内のデータから XML 文書のセットを構成する、 XML コレクション SQL マッピングのあるサンプルの DAD ファイルの一部を示しています。
<?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> |
XML エクステンダーには、XML コレクション内のデータを管理するいくつかのストアード・プロシージャーが備わっています。 これらのストアード・プロシージャーは両方のタイプのマッピングをサポートしますが、 DAD ファイルは マッピング体系の要件で説明されている規則に従う必要があります。
以下の節では、それぞれの XML コレクションのマッピング体系の要件について解説します。
このマッピング体系では、SQL_stmt 要素を DAD <Xcollection> 要素に指定しなければなりません。 SQL_stmt には、複数のリレーショナル表を照会述部 に結び合わせる単一の SQL ステートメントが含まれていなければなりません。 さらに、以下の文節が必要です。
SELECT o.order_key, customer, p.part_key, quantity, price, tax, ship_id, date, mode
この例で、表 ORDER_TAB の order_key および customer は、 XML 文書の階層ツリーで高いレベルにあるために、最高のリレーショナル・レベルを持ちます。 表 SHIP_TAB の ship_id、date、および mode は、 最低のリレーショナル・レベルにあります。
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
この例で、generate_unique() 関数は CHAR データ・タイプの TIMESTAMP に適用され、 別名 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
SQL_stmt には前述の要件がありますが、 述部の式が表内に列を使用する限り WHERE 文節に任意の述部を指定できるので、たいへん強力です。
このマッピング方式を使用するとき、 要素 SQL_stmt を DAD ファイルの <Xcollection> 要素内で使用しないでください。 その代わりに、RDB_node 要素を element_node の各トップ・ノードに対して、 および各 attribute_node と text_node に対して使用します。
DAD ファイル内の先頭 element_node は、 XML 文書のルート要素を表します。 先頭 element_node に対する RDB_node を以下のように指定します。
<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"/>
このマッピング体系では、 データは各 element_node に対する attribute_node および text_node 内に存在します。 そのため、XML エクステンダーはデータベースのどこからデータを見つけるかを知る必要があります。 attribute_node および text_node ごとに RDB_node を指定して、 ストアード・プロシージャーにどの表、どの列、そしてどの照会条件からデータを取得するかを指定します。 表および列の値は指定しなければなりません。 条件の値は任意指定です。
<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"/>
RDB_node マッピング・アプローチでは、SQL ステートメントを与える必要はありません。 しかし、RDB_node 要素に複合的な照会条件を入れることはさらに難しくなります。 たとえば、共用体、式、または演算を使用しても、 SQL-to-XML アプローチほど強力な機能は得られません。
分解では RDB_node マッピングを使って、 表行への要素と属性値の抽出によって XML 文書を DB2 表に分解する方法を指定します。 各 XML 文書の値は、1 つ以上の DB2 表に保管されます。 どの表にも、各文書から分解した最大 1024 行までを入れることができます。
たとえば、XML 文書を 5 つの表に分解する場合、 その 5 つの表のおのおのに、該当する文書中の 1024 行までを入れることができます。 複数の文書用の行をもつ表でも、各文書につき 1024 行までを入れることができます。 20 個の文書をもつ表の場合、各文書につき 1024 行ずつ、20,480 行を入れることができます。
複数回出現要素 (XML 構造内で複数回出現する可能性のある ロケーション・パスをもつ要素) を使うと、行数が影響を受けます。 たとえば、20 回出現する要素 <Part> の入った文書は、 表内で 20 行として分解されることがあります。 複数回出現要素を使用する場合、このような表サイズの制限事項に配慮してください。