【おーあーるえむ】

ORM とは?

最終更新:
💡 オブジェクトとデータベースの表をつなぐ橋

プログラムのオブジェクトと、リレーショナルデータベースの表や行を対応付ける仕組み。ライブラリなどを通して読み書きを扱えるが、SQLやクエリの効率への理解も必要。

📌 このページのポイント
オブジェクトと、表の行を橋渡しオブジェクトUserid: 1name: ひよこデータベースusers表の行idname1ひよこORMの対応付け検索・保存の操作から、SQLを発行発行SQLと、問い合わせの回数も見よう
Userオブジェクトの値とusers表の行を対応付ける模式例。線は対応付けを表します。実際の記述方法や保存のタイミングはORMの実装によって異なります。
ひよこ ひよこ
ORMって、データベースの種類?
ペンギン先生 ペンギン先生
データベースそのものではなく、プログラムのオブジェクトとリレーショナルデータベースの表や行を対応付ける仕組みだよ。たとえばUserというモデルのidやnameを、users表の列に対応させる。SQLAlchemyなど、ORMを実装するライブラリを使って扱えるんだ
ひよこ ひよこ
使うと何が楽になるの?
ペンギン先生 ペンギン先生
モデルを通して検索したり、オブジェクトの変更を保存したりできるので、繰り返し書く読み書きの処理をまとめやすいよ。ORMがSQLを発行してデータベースとやり取りする。ただしライブラリごとに書き方や保存のタイミングが違うし、複雑な処理ではSQLを直接使うこともあるんだ
ひよこ ひよこ
SQLを直接書くより、必ず安全?
ペンギン先生 ペンギン先生
必ずではないよ。入力値をSQLの文字列へそのままつなぐと、SQLインジェクションの危険がある。ORMのモデル操作や適切なパラメーター化は対策になるけれど、ORMから危険な生SQLを実行することもできるんだ。直接書くSQLでも、値をパラメーターとして安全に渡せるよ
ひよこ ひよこ
N+1問題って、ORMの弱点なの?
ペンギン先生 ペンギン先生
たとえば利用者100人を1回で取得し、それぞれの関連データを別々に読めば、追加で100回、合計101回の問い合わせになる。このような余分な問い合わせがN+1問題だよ。関連データを先にまとめて取得する方法などを使えるけれど、必要なSQLの数や効率は取得方法とデータ次第なんだ
ひよこ ひよこ
じゃあORMを使わないほうがいい?
ペンギン先生 ペンギン先生
一律に決めなくていいよ。よくある読み書きを整理しつつ、発行されたSQLや問い合わせの回数・処理時間を確認するといい。関連データの取り方やトランザクションも理解して使おう。便利な橋渡し役だけれど、データベースの仕組みを全部隠してくれる魔法ではないんだ
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ORM」って出てきたら「プログラムのオブジェクトとデータベースの表をつなぐ仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Object-Relational Mapping」 = オブジェクトとリレーショナルデータの対応付け
💬 プログラム側のオブジェクトと、データベース側の表や行を橋渡しするよ。SQLを知らなくてよくなる、という意味ではないんだ

参考資料

← 用語集にもどる