O/Rマッピング

O/Rマッピングを調査中です。
というか、激しく悩んでいます。

O/Rマッピングを簡単に説明すると、オブジェクトとリレーショナルデータベースを自動的にマッピングする仕組みです(簡単すぎ:汗)。
Hibernateなんかが有名なんですが、SQL文、データベース名とオブジェクト名のマッピング、テーブルのカラムとクラスのフィールドのマッピング等をXMLに定義しておくことで、自動的に変換してくれる仕組みです。

これを導入することで、オブジェクト指向とリレーショナルデータベースの思想の違い(インピーダンスミスマッチ)を解決できるし、ビジネスロジックにSQLが紛れ込むこともなくなります。
また、SQLがXMLに書かれるため、メンテナンスがし易いといったメリットもあるのです。

当然のことながら、C#でも実装できますし、オープンソースでもいくつかあります。
ところが、.NETではDataSetというのがあって、これを使うことでデータグリッド等の表示が簡単に行えるので、わざわざエンティティクラスを定義する必要があるのか微妙なところです。
というか、DataSetをエンティティクラスの代わりに使うこともできちゃいますし。(現実世界の構造とは狂うかもしれないが)
あと、DataTableを変更したときに、変更内容に応じて自動的にInsert、Update、Deleteを行ってくれる機能まであったりする。
しかも、Abstractクラスでメソッド宣言するときに、パラメータなんかとインタフェースで定義しておいて、実装はサブクラスで行うようにすれば、ADO.NETだけでなく、ODP.NETやpgsqlでも、ポリモーフィズムが実現できる。

また、SQLをXMLに書くというのも、私は大歓迎ですが、O/Rマッピングを知らないエンジニアがすんなり受け入れてくれるとも思えないんですよねえ。
とりあえず、
・SQLをXMLに書かないが、データベース層に該当するクラス内に閉じ込める
・DataSetを返す
・機能(SELECT、INSERT、UPDATE、DELETE)と実装(SQLの実行、トランザクション処理、コネクション管理)を分ける
といったあたりを念頭にコーディングしてみることとする。

投稿者: ♪ 日時: 2006年07月04日 12:24 このエントリーをはてなブックマークに追加 このエントリーをYahoo!ブックマークに登録 Save This Page to del.icio.us このエントリーをlivedoorクリップに追加 このエントリーをニフティクリップに追加 このエントリーをBuzzurlに追加このエントリーをBuzzurlに追加 このエントリーをBlogPeople Tagsに追加 このエントリーをBlogPeople Instant Bookmarkに追加 このエントリーをPingKingポッケに追加 このエントリーをFC2ブックマークへ追加 このエントリーをnewsingへ追加 Yahoo!ブックマークでこのサイトを登録している人数 人が登録

トラックバック

このエントリーのトラックバックURL:
http://magicbox.sakura.ne.jp/mt/mt-tb.cgi/68

コメント: O/Rマッピング

はじめまして。私は最近C#をはじめた初心者です。

エンティティクラスの考え方なのですが

1.DBのテーブルに依存する。
  テーブルカラムと1対1に定義する。
  Aテーブルのaカラム : A.a
  Bテーブルのbカラム : B.b

2.データアクセス層のSQL処理に依存する。
  Select したいテーブル(結合含む)ごとに定義する。
  つまり、Select別に同じようなエンティティクラスを定義する
  Aテーブルのaカラム : A.a
  Bテーブルのbカラム : B.b
  Cテーブルのa,bカラム : C.a C.b

  a と b は同じ内容です。

テーブルのちがうカラムを
いっぺんでSelect するときは?
どのようにあればってことなんです。

投稿者 C#初心者 | 2006年11月24日 16:21

コメントありがとうございます。
投稿から4ヶ月経った、今の状況です。

最終的な実装は、頂いたコメントとほとんど同じになっています。
1.については、DataAccessObjectパターン
2.については、ProcedureAccessObjectパターン
に従って実装しています。
複数テーブルのクエリはストアド(プロシージャ、ファンクション)を使い、ストアド用のアクセスクラス、エンティティを作ることで解決しましたが、
エンティティとは実体を意味していて、実際の世界のモデリングとは必ずしも一致しないのが気持ち悪いところです。

エンティティについて、永続化機構も必要なので実装しています。
また、SQLが複数レコードを返すような時は、エンティティの中に自エンティティの集合を保持できるように工夫しました。
で、このエンティティをデータベース定義から自動生成できるようにしております。

現在作成中のフレームワークはオープンソースで年内公開予定なので、ご意見等を頂けると幸いです。

投稿者 ♪ | 2006年11月27日 13:05

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)