ORM(Object-Relational Mapping)とは?
下手な説明をするよりも、Wikipediaに頼った方が確実なので、まずは概要を抜粋させていただきます。
オブジェクト関係マッピング(英: Object-relational mapping、O/RM、ORM)とは、データベースとオブジェクト指向プログラミング言語の間の非互換なデータを変換するプログラミング技法である。オブジェクト関連マッピングとも呼ぶ。
具体的に言うと、オブジェクト指向プログラミング言語(Java,C#...)におけるオブジェクトと関係データベース(Olacle,MySQL...)におけるレコードを「対応づける(Mapping)」プログラミング技法のことです。
ORMをなぜ使うのか?
オブジェクト指向プログラミング(以下,OOP:Object-oriented programming)と関係データベース(以下,RDB:Relational database)、これら2つがもつそれぞれのデータモデルに違いによって生じる、インピーダンスミスマッチを解消するためです。
インピーダンスミスマッチって何?
インピーダンスミスマッチ(impedance mismatch)は元々、電気工学の用語で「抵抗の不整合」とか「抵抗の不一致」的な意味合いです。
ものすごく大まかに説明すると、「電気抵抗の異なる2つの素材に対して、電磁波を通そうとすると電気的なエネルギーが効率良く伝搬できない。」という事象のことを指しています。
これだけ説明すると、OOPとRDBに何が関係あるんだ?
と思われるかも知れませんが、確かにインピーダンスミスマッチの詳細自体はあんまり関係がありません...
ただ、物事の詳細を知っておくと「例え」を与えられたときに分かりやすいので説明してみました。
実際に上記の「[ORMをなぜ使うのか?](# ORMをなぜ使うのか?)」で使われている「インピーダンスミスマッチ」は比喩表現で、コンセプトの違う2つの分野・領域を繋ごうとする時に発生する困難や不都合のことをさしています。
特にOOPとRDBの間で発生するもの関しては、O/R インピーダンスミスマッチと言われています。
[OOPの特徴]
- オブジェクトは階層的な構造をもっており、考え方が3次元的(抽象クラスやインターフェースを使った継承)
[RDBの特徴]
- RDBは項を中心として2次元の「表」で表現されることが多い
OOPで各テーブル同士のリレーションシップを表現しようとした際などにO/R インピーダンスミスマッチが発生する。
ORMってどうやって使うの?
最初に説明した通り、ORMはプログラミング手法の1つです。
ORMということ言葉を知っているだけでは、O/R インピーダンスミスマッチは解決されません。
実際のプログラミングに反映させる必要があります。それを実現してくれる仕組みをO/Rマッパー、ORMフレームワークと呼びます。
OOPをコンセプトとする多くの言語にO/Rマッパーは存在します。
ここでは詳しい説明は省かせていただきますが、ざっとどんなものがあるのかだけはご紹介します。
C-sharp
Java
Golang
Ruby
O/Rマッパーを使うとSQLを書かなくて済む?
O/Rマッパーを使えば、SQLを書かなくていいから学習コストが低い!
とか
O/RマッパーはSQLを書きたくない人のためのツールだ!
という言葉を聞いたことがあるでしょうか?
確かにO/Rマッパーを使えば、SQLを書かなくて済む場面はたくさんあります。
しかし、ここで忘れないで欲しいのは、「SQLを書きたくない人のためのツール」としてO/Rマッパーは誕生したわけではないということです。
O/Rインピーダンスミスマッチを解決するため、方法の一つの形(プログラミング技法)としてO/Rマッパーがそういった状態を提供しているにすぎません。
そして、もう一つ忘れてはいけないのは、結局のところDBのアクセスにはSQLが使われているという事実です。
O/Rマッパーを使っても学習コストからは逃げられない
// O/Rマッパーを返したこのDBへのアクセスでどんなSQLが発行されているかわかりますか?
// これで発行されたSQLが思ったもの違った場合、どうやって目的のSQLを発行させるかわかりますか?
using (var ctnx = new DbContext(connectionString))
{
var result = ctnx.USER.Where(u => u.id == 1 && u.name == "test").FirstOrDefault();
}
性能面で問題が発生すると、SQLからは逃れられません。
- どんなQueryが発行されているのか?
- どんなQueryを発行するべきなのか?
- O/Rマッパーではそれをどうやって表現するのか?
むしろ「SQLを直接発行する」という選択肢を取っていれば、SQLの学習コストだけで済んでいたかも知れません。
O/Rマッパーで目的とするQueryを発行するためには、O/Rマッパーの使用法とSQLの両方を覚える必要が...