階段 4 · 資料放哪、怎麼串

ORM

用程式語言操作資料庫,而不是直接手寫所有 SQL 的工具。

先用一句話理解

英文全名:Object-Relational Mapping

用程式語言操作資料庫,而不是直接手寫所有 SQL 的工具。

打個比方

像用表單填資料,工具幫你翻成資料庫語法。

什麼時候會遇到

資料表多、需要型別、安全查詢與資料庫 migration 管理時。

再往深一點看

ORM 是資料庫和程式碼之間的翻譯層:你用 TypeScript 物件和方法描述查詢,ORM 幫你生成正確的 SQL 傳給資料庫。以 Prisma 為例,你的 schema 定義了資料結構,查詢寫成 prisma.user.findMany({ where: { active: true } }),Prisma 翻成 SELECT … FROM users WHERE active = true。好處是有型別提示、防 SQL 注入、可以跨資料庫切換;壞處是複雜查詢(如多層 JOIN、視窗函式)有時比直接寫 SQL 更難表達。ORM 還通常附帶 migration 管理,讓 schema 變動有版本紀錄,是現代 TypeScript 後端常見的選擇。

舉個例子

你用 Prisma 搭配 Neon(PostgreSQL):schema.prisma 定義了 User 和 Post 兩個 model,寫 prisma.post.findMany({ where: { authorId: userId }, include: { author: true } }) 就能同時拿到文章和作者資訊,不需要手寫 JOIN SQL,而且 TypeScript 自動推斷回傳型別,欄位打錯名字編譯就會報錯。

常見誤解

  • - 以為 ORM 讓你不用理解資料庫與查詢效能,結果用 ORM 的迴圈一次查一筆資料(N+1 問題),100 筆資料觸發 101 次資料庫查詢。
  • - 只用 ORM 提供的 findMany 等方法,沒意識到可以用 $queryRaw 執行原始 SQL 處理複雜查詢,導致把很慢的邏輯放在應用層用 JavaScript 迴圈處理。
  • - Prisma schema 改了卻忘了執行 prisma migrate dev,本機資料庫和 schema 定義不同步,查詢時出現莫名其妙的型別錯誤。

相關名詞

相關服務

SupabaseNeon

相關工具