対決! O/Rマッパー vs. オブジェクト指向DB

第1回 Javaのオブジェクト永続化に何を選ぶ?

ネクストデザイン
村山 徹
2005/12/7

永続化問題のキーワード

 本題に入る前に、まず、いくつかのキーワードについて整理しましょう。

永続化とは

 オブジェクト指向プログラミング言語を使い始めたころを思い出してください。Javaであればnewオペレータを使って、目的のクラスのインスタンスを生成し、そのインスタンスにメッセージを送る(メソッドを呼ぶ)ことで、期待した振る舞い(状態の変化など)を実現できたはずです。ただし、このインスタンスはプログラムが終了すると同時にすべて消滅してしまいます。

 例えば、文書作成プログラムであれば、せっかく入力した文書(インスタンス)がプログラムの終了と同時に消滅することになります。これでは文書作成プログラムとしては使えません。そこで、生成したインスタンスの保存(永続化)が必要になってきます。永続化とは、インスタンスの状態を半永久的に保存し、いつでも復元できるようにすることです。もちろん、永続化を必要としないシステムもたくさんありますが、ビジネスアプリケーションなどの世界では必須の要件といえるでしょう。

 通常、(永続化のための)永続ストレージには、データベース・システムを使います。現在データベース・システムとして、リレーショナル・データベース(以下、RDBMS)を採用するケースが圧倒的に多いと思われます。この状況は、RDBMSの実績や普及度を考えれば自然な選択に思われるかもしれません。しかし、オブジェクト指向で開発する場合には、インピーダンスミスマッチと呼ばれる問題が発生します。

インピーダンスミスマッチとは

 RDBMSを使ってオブジェクトを永続化するためには、オブジェクトの状態やほかのオブジェクトとの関連を、クラス図ではなく、テーブルを使って表現し直す必要があります。クラス図などで表現されたオブジェクト・モデルは、そのままではRDBMSに保存できないからです。通常、永続化したい1つのクラスを、いくつかのテーブルで定義されたリレーショナル・モデルに変換することになります。また、RDBMSからオブジェクトを復元する場合には、逆の変換が必要になります。この双方向に変換が必要なモデルの違いを、インピーダンスミスマッチと呼びます(後述の「オブジェクト指向データベースとリレーショナル・データベースの違い」を参照)。

O/Rマッピングとは

 この2つのモデル間を双方向に変換する仕組みがO/R(Object model/Relational model)マッピングです。

 例えば、本稿のような“技術レポート”を表すReportクラスを考えます(図2)。このReportクラスのインスタンスを生成し、タイトルを付けるというシナリオは、リスト1のステートメントで実現できます。

図2 クラス図で表現したReportクラス

Report report = new Report();
report.setTitle("永続化方式を比較する");
リスト1 Reportクラスのインスタンス生成とタイトル設定

 仮に、インスタンスreportがプログラムの終了と同時に消滅しても、システム要件を満たしているのであれば、これで完成です。しかし、インスタンスreportを永続化する必要がある場合は、まだ完成ではありません。永続ストレージとしてRDBMSを使用するシステムであれば、リスト1が実行されることによって、表1のような処理とSQLステートメントが実行されなければなりません。

処理とSQLステートメント
(1) 何らかの仕組みによって主キーを生成する(ここでは、ID='1'とします)
(2) insert into REPORT_TABLE (ID) values ('1')
(3) update REPORT_TABLE set TITLE='永続化方式を評価する' where ID='1'
表1 インスタンスreportの永続化に必要な処理とSQLステートメント

 インスタンスは、表2のようなテーブルに保存されます(ここでは、データベースへの接続やトランザクションに関する部分は省略します)。

ID TITLE
1 永続化方式を比較する
表2 REPORT_TABLEに格納されたインスタンスreport

 一般に、表1に相当する部分のコードは、比較的単調ですが行数は多くなります。また、変更も発生しやすい傾向があります。O/Rマッピングの優劣を決めるポイントの1つは、設計者や実装者が表1に相当する部分をどの程度簡単に定義できるのか、また、その存在をどの程度意識しないで実現できるのかにあります。開発者が、表1の内容を考える必要がなければないほど優れているといえます。

 一方、「Report report = new Report();」といったコードは書いていないという方もいるかもしれません。しかし、そのようなケースでは、「システムをオブジェクトの集まりとしてモデル化し、その実装に適した言語としてJavaを使用する」というオブジェクト指向技術とJavaの利点はなくなり、Javaを使うことで逆に開発効率が低下しているのはないでしょうか。(次ページへ続く)

  2/3

 Index
対決! O/Rマッパー vs. オブジェクト指向DB(1)
Javaのオブジェクト永続化に何を選ぶ?
  Page 1
・はじめに
・本稿のもととなった開発事例について
Page 2
・永続化問題のキーワード
  Page 3
・永続化をスマートに解決する


対決! O/Rマッパー vs. オブジェクト指向DB


Database Expert フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Database Expert 記事ランキング

本日月間