Webシステムが主流となり、データベース・アプリケーションはJavaやC#といったオブジェクト指向言語で開発することが多くなった。しかし、データベース設計はオブジェクト指向モデルとうまくかみ合わず、データモデル設計に苦労するエンジニアは少なくない。本連載は、オブジェクト指向モデルとデータベースモデルのインピーダンスミスマッチに対応するテクニックを紹介する。(編集局)
本連載の第2回「O/Rマッピングで失敗しない分析・設計のポイント」では「実装フェイズにおけるデータモデルの違い」、第3回「OOAとDOAを併用した最適な分析/設計パターン」では「設計フェイズにおける設計手法の違い」により、インピーダンスミスマッチが発生すること、そしてインピーダンスミスマッチの影響を局所化する方法を解説しました。
ここで題材としていたシステムは、オブジェクト指向アプローチ(OOA)によるシステム開発において、アプリケーション開発にはオブジェクト指向言語(Java)を、データの永続化にはリレーショナル・データベース(RDBMS)を利用していました。この構成がインピーダンスミスマッチを引き起こす原因となっていました。もし、RDBMSではなくオブジェクト指向データベース(OODBMS)を利用していたらどうなっていたでしょうか?
本稿では、連載第1回「JavaとDBのデータモデルはナゼすれ違う?」で提示された疑問、
に答えるべく、代表的な3つのデータベース・システム(DBMS)を永続化のデータ表現形式に注目して比較していきます。
「リレーショナル・データベース・マネジメント・システム(Relational DataBase Management System)」は現在最も普及しているDBMSです。一般にデータベースというと、ほとんどの場合、RDBMSを指しているといっても過言ではないと思います。
RDBMSは、データを単純な2次元の表(リレーション)の集合としてデータベース上に格納します。またリレーションに格納できるデータは単独のデータ(数値や文字列などのプリミティブ型または非構造データ型注1)に限られます。リレーションで表現されていない実世界のデータはデータベースに格納できないため、正規化注2を行ってデータ構造をリレーションの集合で表現可能にしなくてはなりません。データの正規化を行うとともに、その過程で得られたリレーションの定義情報であるスキーマ定義を使って、データベース上にリレーションの入れ物となるテーブルを前もって作成しておきます。
このようにデータを格納する前に、「実世界のデータ構造のモデリング(正規化)」 → 「スキーマの定義」 → 「スキーマの実装」というステップを設計、実装フェイズで踏んでおく必要があります。
RDBMSは扱うデータの正規化が必須であり、データを格納するまでが大変ですが、一度正規化されたデータはSQL問い合わせによって柔軟に取り扱うことができます。例えばリレーションから得られるSQL問い合わせの結果もリレーションであり(閉包性)、結果をさらにSQLで処理することで複雑なデータ処理を行うことができます。
オブジェクトのように複雑なデータ構造を持つデータを永続化するには、データ構造をリレーションの集合に分解します。またデータを抽出する際は、反対にリレーションを組み合わせてオブジェクトを組み立てます。このとき、オブジェクトの構造が複雑であるほど、マッピングするリレーションの数も増えていきます。この面倒な分解、組み立ての処理を行うのがO/Rマッピングです。
(次ページに続く)
Copyright © ITmedia, Inc. All Rights Reserved.