ITの世界には、多くの標準仕様が作成され、それらをベースとする、さまざまな製品がリリースされています。標準仕様のおかげで、われわれは、ベンダーに縛られることなく、「相互接続性」や「ポータビリティ」などのメリットを享受しています。ところが、標準仕様を別の角度から見てみると、適用領域によっては、オーバスペックで複雑すぎるのではと感じてしまうものも多く見られます。
特に、最近は、XMLとWebサービスの世界で、そういった傾向が強くなってきているようです。
一般的な企業システムで使用されるデータは、そのほとんどがRDBに永続化されています。そこでは、2次元の表である「テーブル」を、キーによって関連付け(リレーションシップ)することで、多次元的なデータ構造が実現されています。
Javaアプリケーションでは、JDBC APIでRDBにアクセスし、それらのデータを何らかのオブジェクトのプロパティにマッピングして使用します。その結果、メモリ上では、RDBのデータモデルを投影したオブジェクトとして表現されることになります。
ここまでは、「そんなの常識」という内容ですが、これらのデータをWebサービスで扱う場合には、ちょっと話が違ってきます。
Webサービスでは、送受信メッセージをXML形式で扱います。XMLは、RDBやJavaオブジェクトとくらべると、「豊かな表現力」を持っていますが、その裏返しとして、複雑でかつオーバスペックなデータモデルを生みやすいという副作用があると思います。
ここでは、複雑さの落とし穴にはまらないよう、RDBのデータをXML化するときに、シンプルなモデルを作成する方法について考えてみたいと思います。
実際には、JavaオブジェクトとRDB間のマッピングについても、いろいろと考えるべきことはあるのですが、ここでは、すでに最適化されたJavaオブジェクトが定義されていると仮定して、話を進めていきます。
みなさんは、WSDLを作成するとき、どんな方法を使いますか?
「JAX-RPCによる、Webサービス開発スタイル」の中で、ボトムアップ型とトップダウン型という2つのスタイルの概要を説明しました。この2つのスタイルを、出来上がるWSDLの複雑さという観点で見ると、トップダウン型の方が、複雑なXMLスキーマができる確率が高い傾向があります。その理由としては、やはり、XMLが持つ「豊かな表現力」によるところが大きいのではと思われます。XMLスキーマを設計していると、発想も豊か(?)になってしまい、「将来の拡張のため」などの名の下に、不要な項目を追加したり、モデリングに凝りすぎて、不要な型を作ってしまう傾向が強いようです。
一方、ボトムアップ型では、いくつかの制約はあるものの、圧倒的にシンプルなXMLスキーマになります。もちろん、ベースとなるオブジェクトモデルがシンプルな構造であることが前提です。オブジェクトモデルに関しても、変に凝りすぎず、RDBのデータモデルを素直にマッピングしていれば、それほど複雑にはならないでしょう。
ボトムアップ型の制約が問題となる場合は、トップダウン型を採用しますが、その場合でもスタートポイントしては、ボトムアップ型のツールで生成されたWSDLを使用することで、複雑さを回避できると思います。
さらに、誤解を恐れずに言うと。。。
当たり前の話ですが、RDBのデータをJavaオブジェクトに直線的にマッピングした場合、1行分のデータは、カラム名をキーとするMapで表現することができます。複数行のデータやto manyリレーションシップはListに対応付けることができます。このような、MapとListからなるオブジェクトを、Mapのキーを要素名とするXMLにマッピングしてできあがるモデルは、かなりシンプルなものになります。
XMLスキーマという観点では、制約があるモデルかもしれませんが、世の中のかなりのビジネスデータは、これで十分にカバーできるのではと思います。
例えば、以下のようなMapとListから構成されるオブジェクトがあります(HashMapとArrayListをtoString()したイメージです)。
|
これを、XMLにマッピングしたものが、以下のようなイメージです。
|
特に目新しい考え方というわけではないですが、Javaでも、こういったシンプルなマッピングの標準仕様というのが、あってもいいのではないかと思います。
WSDLには、ちょっと合わないけれど、RESTfulなWebサービスには、フィットするのではないでしょうか。
PHPのSimpleXML関数は、かなり近いイメージかもしれませんね。