
【RDBとの違いが明快に分かる】
|
昨今、各ベンダから続々とXML-DB製品がリリースされている。しかし、「XML-DBってどんな製品?」という疑問を持つ読者も多いのではないだろうか。本パートでは、このような読者のために、データベースの作成、XMLデータの登録/検索/更新などの基本操作や、XMLデータ問い合わせ言語「XQuery」について解説する。ぜひ、XML-DBの世界を体験してみてほしい。
STEP5 インデックスを作成する(オプション)
RDBと同様に、XML-DBでも検索を高速化するためにインデックスを利用するが、このステップはオプションである。
その理由は、インデックスを自動で作成する「フルオートインデックス」という機能を持つ製品があるためだ。インデックスは、多く設定すればその分検索は速くなるが、データ更新に負担がかかる。これはXMLDBもRDBと同じである。インデックスを適切に設定できれば、検索と更新の性能を両立できるが、そのためには使用するXML-DB製品について詳しい知識が必要になる。手軽に高速な検索を実現したいのならばフルオートインデックス機能を持った製品を選択し、更新を重視するならば手動で設定する製品を選ぶと良い。
なお、DB2 9は手動でインデックスを設定するタイプの製品だ。GUIの管理ツール上から容易にインデックスを作成できる。インデックスはXPathを指定して作成するが、ワイルドカードを指定することもできる。
画面5では、STEP4で条件指定に使用された「/週報/報告//顧客名」を指定してインデックスを作成している。

画面5:インデックスの作成
STEP6 XMLデータを更新する
データベース内のデータ更新において重要になるのは、更新の手段と範囲、そして更新時のトランザクションである。
XML-DBの更新手段としては、XQueryの拡張仕様「XQuery Update Facility」が標準言語として現在策定中であるが、各社の製品がこの仕様に準拠しているわけではない。そのため、各製品の更新機能の実装は異なっており、その方法は独自関数、ストアドプロシージャなど千差万別だ。また更新の単位も、個々のノード単位、登録したXMLデータ単位というように異なる。これらは製品の方式によってさまざまだ。さらに更新時にロックされる範囲についてもノード単位とXMLデータ単位があるが、現状ではXMLデータ単位でロックされる製品が多いようだ。
DB2 9では、XMLデータの更新をSQLの“UPDATE”文で実現している。ただし、XML型のカラムに格納されたXMLデータを丸ごと上書きする仕様となっている。格納されているXMLデータ内にある特定の要素の値のみを更新/削除したり、格納されたXMLデータへタグを挿入したりする機能はストアドプロシージャによって提供されている。
STEP7 プログラムから使う
RDBと同様、XML-DBを単体で使うことはほとんどない。通常は、XML-DBサーバーが提供するJavaやC#などのAPIを介してアプリケーションブログラムからアクセスする。
図2にJavaベースのWebアプリケーションを構築するときの基本的な構成例を示す。Webブラウザへの表示はHTMLによって行なわれ、Webブラウザからの操作はWebアプリケーションサーバー上のサーブレットプログラムからJava APIを呼び出して行なわれる。

図2:システム構成例
システム構成全体ではRDBとXML-DBには大きな違いはない。違いがあるとすればAPIを介してデータベースとやり取りされるデータが、リレーショナルデータかXMLデータかという点と、問い合わせに用いるのがSQLかXQueryかという点に過ぎない。
XQueryを利用した場合、これにより得られたXMLデータの処理はDOM(注2)やSAX(注3)のライブラリを使って行なわれる。そして処理されたXMLデータは、XSLTを使用してHTMLに変換することによりWebブラウザで表示可能になる。
また、Java言語からアクセスするためのAPIとして、「XQJ」と呼ばれるXQuery言語をサポートするために考案された標準APIが現在策定中であるが、RDBでのJDBCほど一般的ではなく、製品独自のAPIが使われているのが現状だ。DB2 9などのハイブリッド型の製品であれば、RDBがベースになっているためJDBCドライバが使用可能である。さらに、SQLを使用してRDBにアクセスする場合とまったく同じ方法でXQueryを扱うこともできる。
LIST6にJavaのプログラムからXQueryでXML-DBにアクセスする例を示す。
LIST6:XQueryを発行するJavaプログラム
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
public class db2sample{
public static void main( String[] args ){
String xQuery =
"XQUERY "
+ "for $report in db2-fn:xmlcolumn(
'MYSCHEMA.WEEKLY_REPORT.REPORT')/週報/報告"
+ "let $name := $report/../社員/社員名"
+ "where $report/../社員/部署名='システム営業4課' "
+ "return "
+ "<顧客別問題点一覧>{ $report/顧客名,
$report//問題点, $name }</顧客別問題点一覧> ";
try{
Class.forName("com.ibm.db2.jcc.DB2Driver");
Connection conn =
DriverManager.getConnection(
"jdbc:db2://localhost:50000/DBMAG", "db2admin", "db2admin");
ResultSet rs= conn.createStatement().executeQuery(xQuery);
while (rs.next()){
System.out.println(rs.getString(1));
}
conn.close();
}catch(Exception ex){
ex.printStackTrace();
}
}
}
おわりに
本稿では、7つのステップ操作に沿って、DB2 9 Expressを例にXML-DBの基本機能と、その操作方法を紹介してきた。XML-DBは、いままでRDBができなかったことを可能にする新しいデータベースであるが、RDBについてよく知っている読者の皆さんなら、それほど戸惑うことはなかっただろう。
本稿をきっかけに、ぜひXML-DBに触れてみてほしい。
(注2)DOM(Document Object Model)は、アプリケーションがXMLを解析/操作するために使用する標準APIの1つ。XMLをツリー構造として扱い、XML全体を解析してメモリ上に保存する。そのため多くのメモリを消費するが、XMLの構造を自由にたどることができる。また要素を追加/削除できるため、XMLデータの構造を大きく変更したい場合に向いている。
(注3)SAX(Simple API for XML)はDOMと並ぶXMLを解析/操作するために使用する標準API。SAXはXML文書を先頭から読み、XML構造を認識するとそのたびにアプリケーションに伝達する。DOMに比べてメモリ消費量が少なく解析速度が速いという特徴があるが、XMLの構造を自由にたどれず、要素の変更ができないため、複雑な処理は難しい。