階段 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