データベース設計・開発

ORM(オブジェクト関係マッピング) おーあーるえむ

ORMオブジェクト関係マッピングHibernatePrismaSQLAlchemyインピーダンスミスマッチ
ORMって何のために使うの?

簡単に言うとこんな感じ!

ORMは「SQLを書かずにプログラムのオブジェクトでデータベースを操作できるようにする仕組み」だよ!SELECT * FROM users WHERE id = 1 を書く代わりに User.find(1) って書けるようになるんだ。コードがスッキリして、SQLのミスも減るよ。


ORM(オブジェクト関係マッピング)とは

ORM(Object-Relational Mapping:オブジェクト関係マッピング) とは、オブジェクト指向プログラミング言語のオブジェクトと、リレーショナルデータベーステーブル自動的に対応付け(マッピング)し、SQL文を書かずにデータ操作を可能にするフレームワーク・手法です。

オブジェクト指向とリレーショナルDBの構造の違い(インピーダンスミスマッチ)を吸収するために登場しました。


主なORMフレームワーク

言語ORM特徴
JavaHibernate, JPAエンタープライズ標準
PythonSQLAlchemy, Django ORM柔軟性と表現力
RubyActiveRecord(Rails)Convention over Configuration
JavaScript/TypeScriptPrisma, TypeORM, Sequelize型安全なDB操作
PHPEloquent(LaravelシンプルなAPI
GoGORMGo標準に近いインターフェース

ORMのメリット・デメリット

メリットデメリット
生産性SQL記述量が減る複雑なクエリの表現が難しい
安全性SQLインジェクション対策が自動化N+1問題が発生しやすい
移植性DB種類を変えやすいパフォーマンスチューニングが困難
可読性コードがオブジェクト指向的に書けるORMの仕組みを理解する必要がある

N+1問題

関連データを取得するループでSQLが大量発行される問題。User 100件と各Userの注文を取得する際、1(User一覧)+100(各Userの注文)= 101回SQLが発行されるケース。eager loading(事前一括取得)で解消する。


歴史と背景

  • 1990年代:オブジェクト指向言語の普及とともにインピーダンスミスマッチが問題視される
  • 2001年:Hibernate(Java)がリリースされORMが主流に
  • 2004年Ruby on RailsのActiveRecordがORMの「楽しさ」を広める
  • 2020年代:PrismaなどTypeScriptファーストのORMが台頭

関連する規格・RFC

規格内容
JPA(Java Persistence API)JavaのORM標準仕様(JSR-338)

関連用語