IT用語: ORM(オブジェクトリレーショナルマッパー)とは|SQLを書かずにDBを操作
プログラミング言語のオブジェクトとDBのテーブルを対応付けるORMの仕組みとN+1問題を解説。
ORM(Object-Relational Mapper)とは
ORMは、プログラミング言語のオブジェクト(クラス・構造体)とリレーショナルデータベースのテーブルを対応付け、SQLを直接書かずにプログラムコードでDBを操作できるようにするライブラリです。「SELECT * FROM users WHERE id = 1」をUser.find(1)のように書けます。
主要ORMライブラリ
| 言語 | ORM | 特徴 |
|---|---|---|
| JavaScript/TS | Prisma | 型安全・宣言的スキーマ |
| JavaScript/TS | Sequelize | 老舗・柔軟 |
| Python | SQLAlchemy | 高機能・非常に柔軟 |
| Ruby | ActiveRecord | Rails標準・シンプル |
| Java | Hibernate | JPA実装の定番 |
| Go | GORM | Go標準的ORM |
N+1問題
ORMで最も注意すべきアンチパターンです。
// N+1問題の例(Nユーザー分のSQLが発行される)
const users = await User.findAll(); // SELECT * FROM users(1回)
for (const user of users) {
const posts = await user.getPosts(); // SELECT * FROM posts WHERE user_id = ? (N回)
}
解決策: include(Eager Loading)で関連データを一括取得し、クエリ数を1〜2回に抑えます。
ORMのトレードオフ
ORMは開発速度を上げますが、複雑なクエリや大量データ処理では生SQLより非効率な場合があります。「ORM + 必要に応じて生SQL」が現実的なアプローチです。
関連する用語 (データベース)
全23件を見るMySQL(マイSQL)
オープンソースのリレーショナルデータベース管理システム。WordPressをはじめ多くのWebアプリに採用され、読み取りパフォーマンスが高く導入が容易なRDBMSの定番。
Redis(リモートディクショナリサーバー)
インメモリ型のキーバリューストア。超高速な読み書きを実現し、キャッシュ・セッション管理・リアルタイム処理に広く使われるOSSデータベース。
データベースインデックス(索引)
データベースの検索速度を向上させるためのデータ構造。B木・ハッシュ・全文検索等の種類があり、適切なインデックス設計はクエリパフォーマンスを劇的に改善する。
PostgreSQL(ポストグレSQL)
オープンソースのリレーショナルデータベース。ACID準拠・豊富な機能・強力なSQL拡張・JSONサポートを持ち、企業向けから個人プロジェクトまで幅広く使われる高信頼性DBMSの代表格。
シャーディング(データベース水平分割)
データを複数のサーバー(シャード)に水平分割して分散させるDBスケーリング手法。1台のサーバーに収まらない大規模データの処理に使われる。モンゴDBやCassandraが得意とする。
ACID特性(トランザクション4要件)
データベーストランザクションの信頼性を保証する4つの特性。原子性(Atomicity)・一貫性(Consistency)・独立性(Isolation)・永続性(Durability)の頭文字をとった概念。