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 | 特徴 |
|---|---|---|
| Java | Hibernate, JPA | エンタープライズ標準 |
| Python | SQLAlchemy, Django ORM | 柔軟性と表現力 |
| Ruby | ActiveRecord(Rails) | Convention over Configuration |
| JavaScript/TypeScript | Prisma, TypeORM, Sequelize | 型安全なDB操作 |
| PHP | Eloquent(Laravel) | シンプルなAPI |
| Go | GORM | Go標準に近いインターフェース |
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) |
関連用語
- リレーショナルデータベース — ORMが操作する対象
- SQLの基本 — ORMが生成するSQL
- スキーマ — ORMのモデル定義と対応するDBの構造
- マイグレーション(DB) — ORMと組み合わせて使うスキーマ変更管理
- トランザクション — ORMでもトランザクション管理は重要