ドメインモデルのJOIN処理

ドメインモデルが使えないという指摘でよくあがるの1つとしてエンティティのJOIN処理がある。
主な指摘ポイントは、パフォーマンス面とJOIN処理の簡便さの2点であると思っている。


データ操作自体はRDBMSの得意分野なので基本的にはドメインモデルよりもいろいろ便利なのは間違いないと思う。ではJOIN処理を含むような処理はドメインモデルを使わないほうが良いのかというとそうでもないと考えている。


パフォーマンスについては、サマリー帳票であげたようにDataMapperをチューニングすることで、集約や絞り込みと同様にデータ操作についてはRDBMSを活かしつつビジネスロジックドメインモデルで行うことが可能である。
ちなみに少し考えれば分かることではあるが、エンティティをJOINして表示する場合、RDBMSでJOINする方法がもっともコストが低いとは限らないので、ビジネス層やプレゼン層でJOINすることも含めて考えて必要がある。*1


次にJOIN処理の簡便さについては、HibernateのHQLなど見てるとORMの高機能化によってあまり問題にならなくなってきていると思うし、そもそも僕はドメインモデルでJOINする発想はもっていないのでJOINが便利だと思わない。これは、プレゼンテーション層でも直接ドメインモデルを利用する方針で、表示のタイミングで適切なデータをオブジェクトグラフをナビゲーションしながら表示するほうが良いと考えているためである。画面とのギャップが大きいと思える場合でも、画面の表示構造からドメインモデルのアクセスパスを分析してプログラム実装すると分かりやすいかもしれない。

*1:10万行のレコードに2値しか持たないマスタをJOINしてページングしながら表示する場合に、「SQL文でJOINする方法」と「表示の段階まで遅延して表示のときにJOINする方法」どちらがパフォーマンスが良いでしょうか?