【おーあーるえむ】

ORM とは?

💡 オブジェクトとDBテーブルの「自動翻訳」
📌 このページのポイント
オブジェクト class User name: string email: string save() find() delete() ORM 自動変換 オブジェクト ⇔ SQL SQL記述不要 マッピング処理 テーブル users name email 田中 t@ex.com 佐藤 s@ex.com 鈴木 z@ex.com 開発者はオブジェクトを操作するだけでDBアクセスが可能
ORMの役割
ひよこ ひよこ

なぜORMを使うの?

ペンギン先生 ペンギン先生

SQLを直接書くと文字列結合でSQLインジェクションのリスクがあるし、DB固有のSQL方言に依存してしまう。ORMならUser.findById(1)のようにプログラミング言語メソッドでDB操作できて安全。型チェックも効くからタイポも防げるよ

ひよこ ひよこ

ORMのデメリットは?

ペンギン先生 ペンギン先生

N+1問題(関連データ取得で大量のクエリが発行される)、②複雑なクエリが書きにくい、③生成されるSQLが非効率なことがある、④ORMの抽象化に隠れてSQLの理解が浅くなる。特にN+1問題は知らないとパフォーマンスが数十〜数百倍悪化するから要注意だよ

ひよこ ひよこ

N+1問題って何?

ペンギン先生 ペンギン先生

ユーザー一覧と各ユーザーの投稿を取得する場合、①ユーザー一覧取得で1クエリ、②各ユーザーの投稿取得でN回クエリ、合計N+1クエリ。ユーザー100人なら101クエリ。Eager Loading(JOINやINCLUDE)を使えば1〜2クエリで済む。ORMを使うなら必ずSQLログを確認する習慣をつけようね

ひよこ ひよこ

ORMなしで開発する選択肢は?

ペンギン先生 ペンギン先生

クエリビルダー(Knex.js、Kysely)はSQLの構造を活かしつつ型安全に書ける中間的な選択肢。SQLをそのまま書くならsqlcやPrismaのtypedSQLで型安全なSQLが可能。「ORMは不要悪」という過激な意見もあるけど、CRUDが中心のアプリならORMの生産性は高いよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ORM」って出てきたら「オブジェクトとDBを橋渡しするライブラリ」と思えればだいたいOK!
📖 おまけ:英語の意味
「Object-Relational Mapping」 = オブジェクト関係マッピング
💬 Object(オブジェクト)とRelational(関係DB)のMapping(対応付け)だよ
← 用語集にもどる