はじめに
ORMが職場で流行していているので、なぜ流行しているのかを自分なりに考えました。
今回、ORMと言っているものですが、HibernateのようなSQLを自動生成する機能を持ったものを対象としています。
流行した理由として、「QRMを使うとSQLに詳しくなくてもデータベースを扱える」も挙げようと思ったのですが、諸々の理由で書くのをやめて、また別の視点から話を進めていこうと思います。
途中にORMと関係ないことも書いてあるので、要点だけ知りたい人は最後のまとめを読んで下さい。
言語の課題解決のパターン
よく言われていることですが、言語の進化の速度は、課題提起される速度に比べて非常に遅いです。
そのため、本来は言語の仕様を変更することで解決できる課題も、それ以外の様々なアプローチで解決されていることが頻繁に起こります。また、言語の仕様を変更すると、過去のプログラムを破壊してしまうことがある場合は、仕様そのものが変更できないという場合もあります。
例えば多くの言語で「参照型にnullが入って、実行時エラーになる」という課題があるのですが、これに対する解決方法として、以下のようなものが挙げられます。もちろんこれで解決方法は全部というわけではないでしょうが。
- 過去のプログラミング言語を元に新たな仕様の言語を作る(Swift)
- 現在のプログラミング言語の仕様を変更(追加)する(C#7.0)
- フレームワーク(ライブラリ、パッケージ)を作り対応する
- デザインパターンを用いて解決する(Null Objectパターン)
この解決方法一覧では、上に行くほど労力がかかるようになり、下に行くほど労力が少なくなると考えてください。そのため、「参照型にnullが入って、実行時エラーになる」という課題に対しては労力の少ない順に
デザインパターンができる → フレームワークができる → 言語仕様が変更される → 新言語が開発される
という流れで課題解決に向かうことが期待できます。当然、必ずこの順に進むとは限りませんが。
SQLでの課題解決の方法は?
SQLでの課題解決を上のパターンに当てはめるとどうなるか考えていきたいと思います。
1. 過去のプログラミング言語を元に新たな仕様の言語を作る
2016年時点でRDBMSを扱う言語がほとんどSQLしかなく、SQL == RDBMS のようになっている現状があります。新たに代替言語を作り、普及させるのはそうとう労力がかかる作業になるでしょう。仕様が若干違う方言のような言語ならたくさんあるのですが…
2. 現在のプログラミング言語の仕様を変更(追加)する
妥当な案だと思われます。ただ労力がかかるので解決には時間がかかるでしょう。
3. フレームワーク(ライブラリ、パッケージ)を作り対応する
個人や企業内レベルだと対応できるかもしれません。しかしSQLは、C#やJavaと違いパッケージ配布の仕組みが整っていないので全体に行き渡るようにすることは難しいでしょう。また、C#やJavaとくらべてパッケージの制作難度が高いです。
4. デザインパターンを用いて解決する
妥当な案だと思います。全てがデザインパターンで解決できるわけではありませんが、有用なパターンに名前をつけて普及させることは、SQLの品質向上に大いに役立つでしょう。
現状のSQL課題解決案
以上のような理由からSQLの課題を解決する方法として、適切なのは以下の2点だと言えます。
- 現在のプログラミング言語の仕様を変更(追加)する
- デザインパターンを用いて解決する
ORMによる解決方法
やっとORMの話です。実は、ORMでもSQLの課題を解決しています。それも今まで述べた方法は使っていません。
具体的な実現手段は以下になります。ここではJavaを使って実装するものとします。
- SQLの課題を解決できるようなインタフェースを考える
- Javaで実装を行なう
- Javaのフレームワークとして配布する
このような手段を取ることで、先程述べたSQL単体では解決できなかった以下の問題点を解決しています。
- SQLの仕様変更を行なう労力の発生(SQLそのものは変更しない)
- パッケージ開発の難しさ
- パッケージ配布の難しさ
フレームワークの開発なので、SQLに手を入れるよりは少ない労力で済みます。そのため、要望に対してより短時間で改善を行なうことができます。パッケージの開発もJavaを用いたほうが容易に行うことができ、パッケージ配布の仕組みも整っているので公開が容易いです。
実際にORMが行ったSQLの課題解決
ORMが解決した課題は以下の様なものが挙げられます。
ここに関しては、ORMの利点などというテーマで多くの人が既に書かれていると思うので、自分が便利だなと思ったものの概要を述べる程度に留めます。また特定のORMのことを言っているわけではないので、実装されているかどうかはORMによってまちまちです。
- クエリの細分化と、構築する機能の強化
- 簡易な文法の導入(IN句内に配列を書ける等)
- Index使用の明示化、作成忘れ防止(述部でカラムごとにIndexを貼るかの指定を書ける)
以上のような機能があるため、ORMはSQLの機能拡張を行ったフレームワークであると言えます。
まとめ
ORMが流行した理由
- ユーザはORMを通してより容易になった多機能のDB操作を利用することができる。
- ORMはフレームワークという性質上、更新が頻繁に行われるので、SQLの言語の進化を待つ必要がない。
以上のことから、SQLのことをある程度わかっている人が、SQLより効率的な生産方法を求めてORMを使用するようになったと言えるだろう。