IBM Bluemix チャレンジでは、用意された多くのミドルウェアサービスを使ってアプリケーションを構築・開発することになると思いますが、入賞を狙おうとするとやはりなるべく IBM 製品を使ってアピールすべきではないか(苦笑)、とも思うわけです。

そんなわけで今回のエントリでは IBM DB2 が持つ特徴的な機能を紹介します。こういうことをやろうとすると DB2 の特徴を活かしてプログラミングや構築ができる、というサンプルになれば。


最近の話ではないのですが、DB2 に V9 から搭載された XML ストア機能というものがあります。

リレーショナルデータベースである DB2 に XML という型の列を定義することができます。そしてこの列には XML データをそのまま格納することができます。テーブル作成時にはこんな感じで定義します:
create table test(id int not null, data xml, updated timestamp)


他のリレーショナルデータベースでもちょっと無理をすればテキスト型の列を定義して、そこに XML を(文字列として)格納する、ということもできます、格納するだけであれば。

でも決定的な違いもあります。それは XML データを(文字列ではなく) ネイティブな XML データとして格納している、という点です。これによって以下のようなことができるようになります。

例えば上記の内容で定義した test テーブルに以下のようなレコードが格納されていると仮定します(最後のupdated列は無視します):
IDDATA
1<Response><Say language="ja" gender="woman">いい天気ですね</Say></Response>
2<Response><Say language="en" gender="man">Hello. What are you going do today?</Say></Response>
3<Response><Say language="ja" gender="man">encode と decode</Say></Response>

この状態のテーブルの DATA 列から色々な条件でレコードを検索したい時、普通の text 型データだと一般的には like 節を使った SQL の全文検索を実行することになると思います。例えば「天気」という文字を含むレコードを検索するにはこんな感じで:
> select * from test where data like '%天気%'

上記例であれば ID = 1 のレコードが検索されるはずです。text 型のデータでもこのくらいはできます。

では「<Say>要素の language 属性が "en" のものだけを検索したい」場合はどうでしょう?ケースとしては「英語で格納されているデータだけを取り出したい」ような場合です。先程の応用で SQL はこんな感じでしょうか?
> select * from test where data like '%en%'

でもこれだと ID = 2 だけでなく、(本文の中に "en" が含まれる)ID = 3 のレコードも検索されてしまいます。求めたかった結果とは違ってしまいますね。とはいえ text 型のデータに対する SQL はこの辺りはシンプルにはいかないのです。

一方、XML 型で格納した場合はどうでしょう? DB2 の XML 列に対しては XPath を使ったクエリーを実行できます。今回の例であれば、こんな具合で SQL(?) を実行します:
> select * from test where xmlexists( '$t/Response/Say[@language="en"]' passing test.data as "t" )

XPath を使って test テーブルの data 列の中身で <Reponse> 要素の下の <Say> 要素の language 属性が "en" のものを指定して検索しています。つまり単なる全文検索ではなく、XML のデータの属性値を対象に絞り込みを行っています。XML データとして扱うことができるので、もちろん「テキスト値だけを対象とした検索」や「他の属性値による絞り込み」を行うことも可能です。

この方法によって、非構造的なデータを XML の形式で保存するだけでなく、XML データとしてのテキスト検索や属性検索、といった非構造データの特性に合わせたクエリーの実行もできるようになるのでした。


・・・と、こんな具合に XML フォーマットのデータや、XML フォーマットに変換できる非構造データに関しては DB2 の XML ストア機能を使って保存することで、単なる全文検索だけでなく、そのデータの特性に合わせた検索も可能になるのでした。