ORM ด้วย Prisma หรือ Sequelize

ORM (Object-Relational Mapping) คือแนวคิดการเชื่อมระหว่าง Object ในภาษาโปรแกรมกับ Table ในฐานข้อมูล ทำให้นักพัฒนาเรียกข้อมูลผ่าน method แทนการเขียน SQL ทุกครั้ง

Timeline/ประวัติศาสตร์

%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#fabd2f", "primaryTextColor": "#282828", "primaryBorderColor": "#b57614", "lineColor": "#7c6f64", "secondaryColor": "#83a598", "tertiaryColor": "#b8bb26", "background": "#fbf1c7", "mainBkg": "#ebdbb2", "fontFamily": "Tahoma, sans-serif"}}}%%
flowchart LR
  subgraph Era1["ยุค Raw SQL / Manual Query"]
    A["เขียน SQL เอง
ควบคุมสูง"] end subgraph Era2["ยุค ORM / Model API"] B["Sequelize
Model-based ORM"] C["Prisma
Schema + Type Safety"] end subgraph Era3["ยุค Type-safe Backend"] D["Generated Client
autocomplete"] E["Migration
schema เป็นระบบ"] end A --> B --> C --> D --> E

แนวคิดสำคัญ

ตารางเปรียบเทียบ Prisma และ Sequelize

หัวข้อ Prisma Sequelize
แนวทาง Schema-first Model-first
Type Safety เด่นมาก ต้องเสริม TypeScript เอง
Migration Prisma Migrate Sequelize CLI
Query API Generated Client Model Methods
เหมาะกับ TypeScript project โปรเจกต์ Node.js แบบยืดหยุ่น

Mermaid Diagram: ORM Mapping

%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#fabd2f", "primaryTextColor": "#282828", "primaryBorderColor": "#b57614", "lineColor": "#7c6f64", "secondaryColor": "#83a598", "tertiaryColor": "#b8bb26", "background": "#fbf1c7", "mainBkg": "#ebdbb2", "fontFamily": "Tahoma, sans-serif"}}}%%
flowchart LR
  A["User Object
ข้อมูลในโค้ด"] --> B["ORM Client
Prisma/Sequelize"] B --> C["SQL Query
คำสั่งฐานข้อมูล"] C --> D["users Table
ตารางใน DB"] D --> B --> A

สมการคณิตศาสตร์: ลดจำนวน Query Boilerplate

B=Q-O

Code Example

// prisma/schema.prisma
// กำหนดโครงสร้างฐานข้อมูลด้วย Prisma Model
model User {
  id    Int     @id @default(autoincrement())
  name  String
  email String  @unique
  posts Post[]
}

model Post {
  id     Int    @id @default(autoincrement())
  title  String
  userId Int
  user   User   @relation(fields: [userId], references: [id])
}
// prisma-demo.mjs
// ใช้ Prisma Client จัดการข้อมูล
import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

async function main() {
  const user = await prisma.user.create({
    data: {
      name: 'Ana',
      email: 'ana@example.com',
      posts: {
        create: [{ title: 'First post' }]
      }
    }
  });

  const users = await prisma.user.findMany({
    include: { posts: true }
  });

  console.log(user, users);
}

main()
  .catch(console.error)
  .finally(() => prisma.$disconnect());

// ตัวอย่างการใช้งาน:
// npx prisma init
// npx prisma migrate dev --name init
// node prisma-demo.mjs

กิจกรรมท้ายบท

  1. สร้าง Prisma schema สำหรับ User และ Course
  2. รัน migration
  3. เขียน findMany() และ create()
  4. เปรียบเทียบกับ raw SQL ที่ทำงานเดียวกัน

กลับสัปดาห์ที่ 11