ウォーターフォール案件へのORMの適用について

結論だけ先に言うと止めた方が良いです。

ORM自体アンチパターン

ask.fmで頂いたのですが、以下の様な記事が話題になっているようです。
ORMがアンチパターンである11の理由

中身を読むとああー思うところがあるのですが、こちらの内容を踏まえた上で、私の意見を述べたいと思います。
元にするORMはJPAですが、他の一般的なORMでも似たようなことが言えるはずです。

ORMができること

ORM自体はRDBオブジェクト指向言語のミスマッチをどうにかして一つのレイヤーだけで解消しようとするために生まれたものです。
DAOパターンでRDBとオブジェクトのマッピングを書いた事がある人はわかると思いますが、RDBからオブジェクトへの変換、もしくはその逆はマッピングするだけでも非常に多くのコードを必要とし、また、場合によって複数のオブジェクト/RDBマッピングの順番を併せることが必要だったりと非常に面倒くさいです。
そういった面倒くさいことを簡単に行ってくれるのがORMです。

ORMを使ってもSQLで行っていた難しいことを簡単にするといったことは出来ません。
あくまで、面倒くさい事を面倒くさくなくするだけです。

ORMの制限

ORMの制限について考えてみます。
これは単純に言えば、SQLほど柔軟性がないということです。
大体のORMは複数のDBに対応するため、本来のRDBMSが備えている機能のサブセットしか使うことが出来ません。
それにより、SQLを直接書くよりも表現力は格段に下がります。

何がSQLにできて、何がORMにできなくなったのか

SQLでは複雑なJoinや、本来関連がないはずのものに強制的に関連付けを持たせること等が出来ました。
そういったことはORMではしにくい、もしくは出来ないです。
SQLであれば、DB設計が破綻していたとしても、それをどうにかして繋ぎ止めることが出来ました。
ORMでは表現力の貧弱さからDB設計が破綻した場合に、まともに動作することが出来ません。

ORMがきちんと機能する時

きちんとした正規化ができていること*1が大前提です。
そのうえで、ORMの表現力の低さを補うために、ORM用のスペシャルなチューニング*2を行う必要があります。
結局ORMの貧弱さを設計で補う必要があります。
一言で言えば、設計がきちんと出来ていないとORMは満足に機能しません。

先の記事にも書いてあるとおり、オブジェクトではRDBマッピングを効率よく表現はできません。
それはRDBは学問に基づいて思考され、オブジェクト指向は経験により思考されたものなので、そもそも理論体系が違うからです。*3

ORMを使うためには

まずは、設計をしましょう。
どれだけ設計をしてもしょせんは机上の空論ですから、破綻することはよくあります。
その場合には実装の内容を設計に反映させましょう。
SQLでは設計が破綻してもSQLの柔軟性によりどうにかできていたものが、ORMではどうにもできません。

ORMの最大の利点

ORMの最大の利点はRDBの変更をオブジェクト側に反映させやすいことです。
JDBC接続の場合、INSERT文、UPDATE文、DELETE文をそれぞれ修正しなければいけませんが、ORMでは一箇所修正するだけで事が足ります。*4

ウォーターフォールへのORMの適用

ウォーターフォールを採用した実案件では設計から実装への一方通行になっている場合があります。
実装時にデータモデルの破綻が判明した場合も、いろいろな理由*5により設計に反映が出来ない場合があります。
その場合、ORMを適用した場合の最大の利点を消していることになります。
ここらへんが大規模開発になるとORMが破綻すると言われる原因になっているのではないでしょうか。
ORMを適用した場合の最大の利点かつ、ORMを使用するための大前提が政治的理由によりできなくなっているのですから。

結論

ウォーターフォール案件でのORMは相性が悪いです。
どうしても使いたいなら実装から設計へ反映できるフローを用意するべきです。

*1:ベンダーさんによってはオレオレ正規化されてたりする場合がありますが、そういった場合は除きます

*2:具体的には人工キーを付けることなど

*3:なので関数型プログラミングであればRDBと相性が良いのではないかと思っています

*4:JPAであればエンティティ

*5:容量見積もりやら、チーム間の力関係やら