インピーダンス・ミスマッチ

いわゆるObjectとRelationalのいやーんなやつです.
この「インピーダンス・ミスマッチ」,言葉はよく耳にするし,実際にビシバシと感じるわけですが,何がどうミスマッチなのかをちゃんと自分の言葉でまとめたことがないので,たまには書いてみるてすと(弱気).
このミスマッチは,次の3つを含んでいると思います*1

  • Javaなどのプログラミング言語(手続き的)とSQL(宣言的)のミスマッチ
  • Record at a timeとSet at a timeのミスマッチ
  • オブジェクトモデルとリレーショナルモデルのミスマッチ

と書いたものの,実は始めの二つは最後のミスマッチから導出されたものと考えられるので,根源はオブジェクトモデルとリレーショナルモデルのミスマッチなのかなぁ,と思う次第です.そしてこのミスマッチ,考えても考えても相容れなさそうというか,相性が悪いというか,どうやっても仲良くできない気がしちゃって,なのでO/Rマッピングなんていうのもちゃんちゃらおかしいね*2
オブジェクトモデルとリレーショナルモデル,どちらかがどちらかのスーパーセットであるなら,もっとうまく一緒に使えると思うんですよね.例えばオブジェクトモデルとERモデル.ERモデルのちゃんとした定義を見たことはありませんが,なんとなくオブジェクトモデルはERモデルのスーパーセットでしょって感じがします.なので,プロセスとしてのDOAなんかはともかく,成果物としてのERモデルは,表記法さえ変えればオブジェクトモデルと言い張っても誰も気づかなさそう.そう,見た目だけの問題って感じです.
ところがリレーショナルモデルは違います.これは,オブジェクトモデルのサブセットとして扱うわけにはいかないものを持っています.
リレーショナルモデルの主な構成要素は,ドメイン(カラム),タップル(レコード),リレーション(テーブルまたはビュー,それに問合せ結果)です.
このうち,ドメインとオブジェクト(正確にはクラスですか)の相性はバッチリです.ドメインは簡単に言えば型です(細かいことは気にしない).それも値型です.数値型とか文字列型とか日付型とか.これらをオブジェクト(クラス)として見ることはごく自然です.ですから,この部分では大きな問題になるようなミスマッチはないと思います.Javaのデータ型とSQLのデータ型が微妙に違うとかみたいな程度でしょう.小さい小さい.
問題はタップルおよびリレーションです.タップルはリレーションの要素であるとして,ここではリレーションとクラスを対比します.この二つは,ドメインと(値型の)クラスのように親和性の高いもの同士ではなく,次のような相違点があります.

  • リレーションは静的な状態のみを持つが,クラスはそれに加えて動的な振る舞いを持つ.
  • クラスは決まりきった形(静的な構造)を持つが,リレーションは自在に生み出すことができる(動的).

このように,どちらも相手にないものを持っているのですね.
この相違点を避ければ,いわゆるO/Rマッピングも結構簡単になります.

  • (継承の表現は別として)一つのクラスを一つのテーブルにして,テーブル単位にアクセスする(自在なリレーションを排除).
  • そのクラスには振る舞いとしてのメソッドを持たせない(動的な振る舞いの排除).

その結果がバリューオブジェクトとかデータトランスファーオブジェクトとか呼ばれるようなものですよね.でもこれ,オブジェクトモデル(オブジェクト指向,かな)の能力を使っているとは言いがたいですし,リレーショナルモデル(RDBMS,かな)の能力を使っているとも言いがたいです.必要なカラムだけを選択したり,他のテーブルと結合したりすることで最適なDBアクセスができるのに.
ここで行き詰まっちゃうんですよね.無念だ.
自由にリレーションを生み出す能力と,動的な振る舞いを持つ能力.
この両者を共存させるにはどうすればいいのか? そう,この問題で頭がいたいのは,両者のナイスな能力をともに使いたいから.RDBMSを単なるオブジェクトのストレージとして使うのではなくて,RDBMS本来の能力(リレーショナルモデルのいいところ)も一緒に使いたいのです.なので,オブジェクトを単純にテーブルにマップするだけのO/Rマッピングツールって興味が持てないのですよね.いやその,Hibernateとかはその程度のものじゃないのかもしれませんけどね.勉強不足なのでよく知りません.心より恥じる.
それでですね,ちょっと邪道なのかもしれないけれど,もしかしてAspectがこの解決にならないかなぁって考えています.自在に作り出されるリレーションすなわち結果セットをCore Concernとみなして,それに適用できる動的な振る舞いすなわちメソッドをCrosscutting Concernとみなしてみる.うん,その方が素敵ッ! な感じがちょっとだけするんですよね.いやその,深く考えたわけじゃないんでバカなことを言っている可能性濃厚なんですが.
ちょっと退屈な作業をしているので,ついつい逃避してしまいました.心より恥じる.
考えが深まったら(撤回したくなったら?)また書きます...

*1:表構造と木構造の違いをあげる人もいるでしょうね

*2:ここは笑うところです,怒ってはいけません,O/Rマッピングまんせーな人(そんな人いる?).