連載 DB2でXMLを操作する(5)
XML Collectionを使うための設計・実装

XMLの普及とともにリレーショナルデータベースにもXMLを格納できる機能が搭載されてきている。しかしその機能は、製品ごとに固有のものだ。この記事では、IBMの製品であるDB2 UDBでどのようにXMLを扱うか、について解説する。

たがわ製作所
2003/6/20


今回の主な内容
要素をカラムにマッピングする
XML Collection を用いるための設計作業
XML Collectionを用いるための実装作業

 過去2回(「XML Columnを使うための設計・実装」「XML ColumnにDocBook文書を格納する」)にわたり、DB2でXMLを取り扱うための方法の1つであるXML Columnについて解説しました。 今回からは2回にわたり、DB2でXMLを取り扱うためのもう1つの方法であるXML Collectionを取り上げます。 前編に当たる今回は、XML Collectionの概要について解説し、後編に当たる次回で実際のサンプルを紹介したいと思います。

要素をカラムにマッピングする

 さて、この連載の最初で簡単に説明したとおり、XML CollectionとはXML文書の要素とテーブルのカラムを対応付けるための仕組みです(図1)。

図1 XML Collectionの考え方
XML文書の内容を分解してテーブルに格納する

 このような仕組みを持つXML Collectionは以下のようなケースでの利用に適している、という点についても連載の最初で紹介しました。

  • データの更新を頻繁に行う
  • XML文書に含まれるデータそのものを保存することが必要で、文書の構造をそのまま保存する必要はない
  • 既存のテーブルに基づいてXML文書を合成したい

 今回はこのような特徴を持つXML Collectionを、実際に使う場合の手順について概説していくわけですが、 この手順はXML Columnの利用手順と同じく、設計作業と実装作業に分けて考えることができます。

 まず設計作業ですが、以下のような事柄について事前に検討しておく必要があります。

  • コレクションの検討
  • XML文書の検討
  • コレクションの指定方法の選定
  • 文書型の検証の有無

 これらの設計作業の結果に基づいて、以下のような実装作業を行います。

  1. DADファイルの定義
  2. XMLエクステンダーの有効化
  3. DTDの登録
  4. DAD ファイルの登録およびXML Collectionの有効化

 以下で、これらの設計作業と実装作業について順に見ていきましょう。

XML Collectionを用いるための設計作業

(1)Collectionの検討

 最初は、XML文書と対応付けるテーブルの検討です。基本的には図1の例のように、テーブルの1行が1つのXML文書に対応します。

 もちろん対応付けるテーブルは1つには限定されません。複数のテーブルを結合した上でXML文書に対応付けることもできます。その場合のことを考えてみます。例えば図2のような関係にある2つのテーブルA、Bを結合したとします。

図2 参照関係にある2つのテーブル
A1〜AnおよびB1〜Bnは、それぞれのテーブルのカラムを表す。Bの各行は外部キーB2によりAを参照

 XML Collectionの機能を用いると、Aのある行とBを結合した集合を、リスト1のような形式のXML文書と対応づけることができます。

<?xml version="1.0"?>

<A>
  <A1>……</A1>
  <A2>……</A2>
  ……
  ……
  <An>……</An>


  <B>
    <B1>……</B1>

    <B2>……</B2>
    ……
    ……
    <Bn>……</Bn>
  </B>
この部分は、Aと結合するBの行数だけ繰り返される

</A>
リスト1 図2のテーブルをXML文書に対応付けた例

 見ればお分かりのように、、図1と同じようにテーブルAの1行が1つのXML文書に対応しています。また、このAの一行と結合されるBの各行が、子要素Bとして表現されていますね。これはテーブルが2つの場合ですが、3つ以上ある場合も同じような形で階層的に表現されることになります。XML文書の合成に用いるこれらの複数のテーブルの集合を指してCollectionと呼んでおり、XML Collectionの名前もここに由来しています。

(2)XML文書の検討

 Collectionとして選定したテーブルを、どのような構造のXML文書にマッピングするのかを検討します。基本的なマッピングのパターンはリスト1のような形になるので、ここで検討するのは以下のような補足的な事柄になります。

  • どのカラムをXML文書に含めるのか
  • カラムを属性もしくは要素のいずれの形式で取り出すのか
  • 属性もしくは要素の名前

 なおここではCollectionのテーブルを先に選定した後にXML文書の構造を検討する、という前提で説明をしています。もちろん実際にはこの逆のケースもあり得るでしょう。 例えば、既存のXML文書のツリー構造を、既存の複数のテーブルにマッピングする必要がある場合です。この場合も基本的な考え方は同じですが、XML文書のデータをうまくマッピングできるかどうかはその構造に依存する点に注意してください。

(3)Collectionの指定方法の選定

 Collection(テーブルの集合)をDB2に対して指定する方法には以下の2種類があります。

  • SQL Mapping
  • RDB_Node Mapping

 前者はCollectionのテーブルを結合するSQL文を記述することでCollectionを指定する方法です。後者は、Collectionに含まれるテーブルを1つ1つ指定する方法です。

 前者は記述が比較的簡単なうえ、XML文書として抽出するデータの条件指定もWHERE句に追記するだけなので非常に簡単です。しかし、XML文書の合成を行う場合にしか利用できません。他方、XML文書を分解してテーブルにデータを格納する場合は後者の方式を利用することになりますが、複雑な条件を指定しづらいという欠点があります。これらの特徴を踏まえ、用途に合わせた選択を行う必要があります。

(4)文書型の検証の有無

 XML文書を分解してテーブルにデータを格納する際、入力されたXML文書の文書型の検証を行うがとうかを検討します。検討のポイントはXML Columnの場合と同じです。 入力として渡されるXML文書の構造に誤りがあり得るかどうか、この点を考慮して検証の有無を決定します。

XML Collectionを用いるための実装作業

(1)DADファイルの定義

 SQL MappingとRDB_Node Mappingを用いるかで記述方法が若干異なります。まずはSQL Mappingを用いた場合の例から見ていきましょう。一般的にはリスト2のような形になります。

<?xml version="1.0"?>
<DAD>
  <dtdid>DTD名</dtdid>
  <validation>yesもしくはno</validation>
  <Xcollection>
  <SQL_stmt>Collectionを指定するためのSQL文</SQL_stmt>
  <prolog>?xml version="1.0"?</prolog>

  <root_node>
    <element_node name="ルートタグ">
      ……
      ……
      XML文書の構造の定義
      ……
      ……
    </element_node>
  </root_node>


</DAD>
リスト2 SQL Mappingを用いる場合のDADファイルの記述例  

 リスト2に含まれる要素を説明しましょう。

 

<validation>および<dtdid>
文書型の検証を行うかどうか、および検証に用いるDTDのIDを指定します。使用方法はXML Columnの場合と同じです。

<Xcollection>
XML Collectionを用いる場合、その保存方法の詳細を<Xcollection>の中で定義します。

<SQL_stmt>
コレクションをSQLの形で指定します。ここで記述するSQLは、ある一定の基準を満たしている必要があります。

  • ORDER BY句は必須。各テーブルのプライマリキーを階層構造と対応する順に並べる
  • その順に合わせて各テーブルのカラムをグルーピングしてSELECT句に並べる
  • WHERE句では各テーブルを結合するための条件を必ず指定する
  • そのほか、データを選別するための条件をWHERE句に追加できる

<prolog>
出力するXML文書に含まれるXML宣言を指定します。

<root_node>
出力するXML文書の構造をここで指定します。<element_node><attribute_node><text_node>および<column>の4種類のタグを用いて構造を定義していきます。

 root_node要素内で利用するタグについては、個々のタグを詳しく解説してもイメージがわきづらいと思うので、簡単な例をリスト3に挙げて説明に代えておきます。

<element_node name="item">

  <attribute_node name="id">
    <column name="id" />
  </attribute_node>

  <element_node name="name">
    <text_node>
      <column name="name" />
    </text_node>
  </element_node>


</element_node>
リスト3 SQL Mappingで要素を出力する例 

 これはitem要素を出力し、idおよびnameカラムの値をそれぞれ属性id、子要素nameとして出力する例です。 このような定義を組み合わせてXML文書全体の構造を定義します。次回取り上げる予定の具体的なサンプルと突き合わせてみると理解が深まるかと思いますが、 そちらを待ちきれない方はDB2に添付のサンプルのDADファイルなどを参考にしてみてください。

 なお、大原則として複数のテーブルを結合している場合は、リスト1のような階層構造の文書を出力する必要があります。 この原則に違反するとエラーとなるので注意してください。

 RDB_Node Mappingを用いる場合も、基本的なDADの書き方は同じです。 異なるのは以下の2点です。

  • <SQL_stmt>でなく<RDB_node>を用いて明示的にコレクションのテーブルおよび結合条件を指定する
  • データの出力を指定する個所で<RDB_node>を用いる

 RDB_Node Mappingを用いる場合のDADファイルの形は一般的にリスト4のようになります。

<?xml version="1.0"?>

<DAD>
  <dtdid>DTD名</dtdid>
  <validation>yesもしくはno</validation>

   <Xcollection>
    <prolog>?xml version="1.0"?</prolog>
    <root_node>
      <element_node name="ルートタグ">

        <RDB_node>
          <table name="Collectionに含むテーブル名1"/>
            ……
            ……
          <table name="Collectionに含むテーブル名n"/>
          <condition>テーブルを結合するための条件</condition>
        </RDB_node>

        ……
        ……
        XML文書の構造の定義
        ……
        ……
      </element_node>
    </root_node>
  </Xcollection>
</DAD>
リスト4 RDB_Node Mappingを用いる場合のDADファイルの記述例

 リスト4で使われているRDB_node要素について説明します。

 

<RDB_node>
<RDB_node>は2つの用途に用いられます。まず1つ目はリスト4にあるように、Collectionに含まれるテーブルおよび結合条件の指定に用います。もう1つはXML文書と対応付けるテーブルのカラムを指定するのに用います。

 RDB_node内で使われているtable要素およびcolumn要素を併用してテーブルのカラムを指定しますが、こちらもリスト5に例を挙げておきます。

<element_node name="item">

  <attribute_node name="id">
    <RDB_node>
      <table name="item" />
      <column name="id" />
    </RDB_node>
  </attribute_node>

  <element_node name="name">
    <text_node>
      <RDB_node>
        <table name="item" />
        <column name="name" />
      </RDB_node>
    </text_node>
  </element_node>


</element_node>
リスト5 RDB_Node Mappingで要素を出力する例 

 先ほどと同じく、item要素を出力し、idおよびnameカラムの値をそれぞれ属性id、子要素nameとして出力する例です。こちらもDB2に添付のサンプルのDADファイルがあるので、次回のサンプルを待てない方は参考にしてみてください。

(2)XMLエクステンダーの有効化

 XML CollectionもXML Columnと同じく、利用に当たってはあらかじめXMLエクステンダーの有効化を実行しておく必要があります。手順はまったく同じですので、詳細については前回の記述を参考にしていただくとして、以下では実行する一連のコマンドのみ掲げておきます。

cd DB2をインストールしたディレクトリ\bnd
db2 connect to データベース名
db2 bind @dxxbind.lst
dxxadm enable_db データベース名

 なお、有効化はデータベース単位で実行するものですので、一度有効化したデータベースに対しては再度実行する必要はありません。

(3)DTDの登録

 文書の検証を行う場合は、あらかじめDTDを登録します。この手順もXML Columnの場合とまったく同じです。

INSERT INTO DB2XML.DTD_REF VALUES ('DTD名', DB2XML.XMLClobFromFile('DTDファイルへのパス'), 0, 'user', 'user', 'user')

(4)DADファイルの登録およびXML Collectionの有効化

 最後の手順として、作成したDADファイルを登録し、XML Collectionの有効化を実行します。有効化が必要という点はXML Columnと同じですが、dxxadmコマンドのパラメータが少しだけ違っています。

dxxadm enable_collection データベース名 Collection名 DADファイル名

 XMLエクステンダーの有効化を行うことで、DADファイル内に定義したコレクションを利用できるようになります。このコレクションはストアドプロシージャを通じて利用する形になるのですが、このときコレクションを一意に指定できる必要があります。このため、DADファイルを登録してコレクションを有効化する際、一意名として「コレクション名」を指定します。

コラム 有効化せずにXML Collectionを用いる方法

 今回の解説を読めばお分かりのように、XML Collectionも使用に当たってはあらかじめXMLエクステンダーを有効化する作業が必要です。一度しかXML文書の合成を行わないような場合でも有効化する必要があるのは少し面倒ですが、実はXML Collectionに関していうとあらかじめ有効化しておかなくても利用することは可能です。

 ただし、その場合でもDB2内部では毎回有効化時に実行しているさまざまな処理を暗黙のうちに繰り返すことになるので、パフォーマンスの観点からは不利です。 また以下のような機能は有効化したときのみ利用可能です。

  • コレクションのテーブルを自動的に生成可能
  • 同じ要素がXML文書で複数個出現する場合の順番を指定できる

用途に合わせてXMLエクステンダー有効化の有無を判断してください。

 今回はXML Collectionのセットアップ手順について概説しました。次回は具体的なサンプルを用いたセットアップ例に加え、XML文書の合成と分解の操作についても解説したいと思います。 お楽しみに!

<<前回へ 「XML Collectionでデータマッピングを実現

Index
連載:DB2でXMLを操作する
  (1) XMLの格納方法を2種類備えるDB2
  (2) DB2 UDBのインストールと動作確認
  (3) XML Columnを使うための設計・実装
  (4) XML ColumnにDocBook文書を格納する
(5) XML Collectionを使うための設計・実装
  (6) XML Collectionでデータマッピングを実現
  (最終回) Webサービス機能を徹底検証する


XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間