O/R マッピングについて。

メモリ上のデータと、データベースにしたときのデータの持ち方についてのお話です。

O/Rマッピングとは?

Object指向での開発で行う場合、メモリ上のデータはEntitiyと呼ばれ、Objectに格納されます。ですが、メモリ上で持てないデータの置き場所や、保存場所としてのデータベースに格納する場合の主流は、リレーショナルデータベース(Relational DB)になります。
データを集合的に木構造に持つObjectに対して、Relational DBは表形式でデータを保持し、キー項目でそれぞれの表を関連づけて管理しています。
この異なる構造の読み込み、書き出しをマッピングすることを、O/R Mappingと呼んでいます。

O/Rマッピングの実装

やり方的には、DBをObjectに合わせる方法と、ObjectをDBに合わせる方法があります。
DBをObjectに合わせる場合、木構造を保存出来るCacheなどのDBを使う事になります。データベースがOracleSQLiteなど、Relational DBに制限されている場合は、この方法はとれません。(ORMappingの主旨からも少しずれているし・・・。)
ObjectをDBに合わせる方法の場合、テーブル用Objectに、レコード用Object(Structでも可)の配列を持たせます。

DBから取得するレコードについて

  • 1テーブルにつき1テーブル用Objectを作成し、全てのレコードObjectに一括で取得する。

この場合、テーブル内の検索、ソートはメソッドでレコード分のループを回して行います。また、テーブル間のリレーショナルについても、ControllerとなるObjectを作成し、レコード分のループを回して行います。
レコードの読み書きについては、レコード用ObjectとDBのレコードが1対1の関係になり、行いやすくなります。
メリットは、ロードした後はメモリ上に配置されているので、大量の計算でも高速に処理を行う事ができることです。
デメリットは、実装が大変な事と、メモリをレコード分消費する事です。
DB全体を使った計算を行うC/Sアプリを作成する場合に使います。

  • SQLで検索した情報(View)を1Objectとし、レコードObjectに取得する。

SQLで連結・検索し取得したレコードを保持することで、リレーショナル問題を解決します。
当然ながら取得しなかったレコードについては知る由はありません。
書き込み時は、読み込み時のObjectとは別に、対象となるテーブル用のレコードObjectを作成して行います。
Webサービスなどでの一覧表示、登録・更新画面など、全てのレコードが必要ない場合にはこちらを使います。