連載 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文書の検討
- コレクションの指定方法の選定
- 文書型の検証の有無
これらの設計作業の結果に基づいて、以下のような実装作業を行います。
- DADファイルの定義
- XMLエクステンダーの有効化
- DTDの登録
- DAD ファイルの登録および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> |
|||
リスト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文書の構造に誤りがあり得るかどうか、この点を考慮して検証の有無を決定します。
(1)DADファイルの定義
SQL MappingとRDB_Node Mappingを用いるかで記述方法が若干異なります。まずはSQL Mappingを用いた場合の例から見ていきましょう。一般的にはリスト2のような形になります。
<?xml version="1.0"?>
|
リスト2 SQL Mappingを用いる場合のDADファイルの記述例 |
リスト2に含まれる要素を説明しましょう。
<validation>および<dtdid> <Xcollection> <SQL_stmt>
<prolog> <root_node> |
root_node要素内で利用するタグについては、個々のタグを詳しく解説してもイメージがわきづらいと思うので、簡単な例をリスト3に挙げて説明に代えておきます。
<element_node name="item">
|
リスト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"?>
|
リスト4 RDB_Node Mappingを用いる場合のDADファイルの記述例 |
リスト4で使われているRDB_node要素について説明します。
<RDB_node> |
RDB_node内で使われているtable要素およびcolumn要素を併用してテーブルのカラムを指定しますが、こちらもリスト5に例を挙げておきます。
<element_node name="item">
|
リスト5 RDB_Node Mappingで要素を出力する例 |
先ほどと同じく、item要素を出力し、idおよびnameカラムの値をそれぞれ属性id、子要素nameとして出力する例です。こちらもDB2に添付のサンプルのDADファイルがあるので、次回のサンプルを待てない方は参考にしてみてください。
(2)XMLエクステンダーの有効化
XML CollectionもXML Columnと同じく、利用に当たってはあらかじめXMLエクステンダーの有効化を実行しておく必要があります。手順はまったく同じですので、詳細については前回の記述を参考にしていただくとして、以下では実行する一連のコマンドのみ掲げておきます。
cd DB2をインストールしたディレクトリ\bnd |
なお、有効化はデータベース単位で実行するものですので、一度有効化したデータベースに対しては再度実行する必要はありません。
(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文書の合成と分解の操作についても解説したいと思います。 お楽しみに!
<<前回へ | 「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サービス機能を徹底検証する |
- QAフレームワーク:仕様ガイドラインが勧告に昇格 (2005/10/21)
データベースの急速なXML対応に後押しされてか、9月に入って「XQuery」や「XPath」に関係したドラフトが一気に11本も更新された - XML勧告を記述するXMLspecとは何か (2005/10/12)
「XML 1.0勧告」はXMLspec DTDで記述され、XSLTによって生成されている。これはXMLが本当に役立っている具体的な証である - 文字符号化方式にまつわるジレンマ (2005/9/13)
文字符号化方式(UTF-8、シフトJISなど)を自動検出するには、ニワトリと卵の関係にあるジレンマを解消する仕組みが必要となる - XMLキー管理仕様(XKMS 2.0)が勧告に昇格 (2005/8/16)
セキュリティ関連のXML仕様に進展あり。また、日本発の新しいXMLソフトウェアアーキテクチャ「xfy technology」の詳細も紹介する
|
|