· typescript / orm / prisma

Prisma vs Drizzle 2026 — So sánh chi tiết TypeScript ORM

Prisma 7 bỏ Rust và giảm bundle size 85%. Drizzle vẫn nhỏ hơn 80×. Đây là thời điểm phù hợp để chọn từng cái cho TypeScript stack của bạn trong 2026.

Bởi Ethan

2.517 từ · 13 phút đọc

Dùng Drizzle cho edge và serverless runtime, hoặc nếu team bạn quen tư duy SQL. Dùng Prisma nếu cần MongoDB, muốn nested writes, hoặc thích schema-first hơn là kiểm soát SQL trực tiếp. Sự lựa chọn này không còn rõ ràng như hai năm trước — Prisma 7 đã bỏ engine Rust, giảm bundle size 85%, và phần lớn đã thu hẹp khoảng cách cold-start từng khiến Drizzle là lựa chọn hiển nhiên trên Cloudflare Workers.

Bài này dành cho ai

Developer đang chọn ORM cho dự án TypeScript mới trên PostgreSQL, MySQL, hoặc SQLite. Nếu bạn đang trong quá trình chuyển đổi giữa hai thư viện, phần migration gần cuối bài là nơi nên đọc trước. Nếu bạn không có ý kiến về cú pháp SQL và muốn thứ gì đó dùng được ngay, hãy chuyển thẳng xuống cây quyết định.

Những gì chúng tôi đã kiểm tra

PrismaDrizzle
Phiên bản ổn định7.8.0 (22 tháng 4 năm 2025)0.45.2 (27 tháng 3 năm 2025)
Pre-release1.0.0-rc.2 (tháng 5 năm 2026)
Bundle (unminified)~1.6 MB~31 KB
Bundle (gzipped)~600 KB~7.4 KB
Dependencies00
GitHub stars45.96834.395
Lượt tải npm/tuần~7.8M~4.2–5.1M

Các con số hiệu năng Rust-vs-TypeScript ở phần tiếp theo lấy từ bài thông báo kiến trúc của Prisma (ref #1); một bài benchmark Prisma riêng biệt (ref #3) báo cáo điều kiện workload khác và con số khác — cả hai đều được trích dẫn trong phần tham khảo. Chúng tôi không chạy benchmark độc lập cho bài so sánh này — điều này được nêu rõ trong phần lưu ý.

Cấu hình benchmark (ref #3): PostgreSQL, pg driver; thông số máy và chi tiết workload đầy đủ có trong repository benchmark được tham chiếu bởi bài benchmark Prisma.

Viết lại năm 2026: Prisma bỏ Rust

Bối cảnh của bài so sánh này thay đổi vào ngày 19 tháng 11 năm 2025, khi Prisma 7.0.0 ra mắt với việc viết lại toàn bộ query engine từ Rust sang TypeScript.

Kiến trúc Prisma ban đầu dựa trên một binary Rust được biên dịch sẵn để lập kế hoạch query. Binary đó phụ thuộc vào hệ điều hành, yêu cầu bước triển khai để cung cấp đúng target, và nặng ~14 MB unminified (~7 MB gzipped). Nó không thể chạy trên Cloudflare Workers hoặc Vercel Edge Functions — những môi trường giới hạn bundle ở 1 MB.

Phiên bản TypeScript thay thế (Prisma blog) nặng ~1.6 MB unminified và ~600 KB gzipped. Đó là mức giảm 85–91%. Lần đầu tiên, nó cũng chạy được trên edge runtime.

Các con số hiệu năng cũng đảo chiều có lợi cho Prisma. Việc chuyển sang TypeScript loại bỏ overhead serialization giữa hai ngôn ngữ — thứ hóa ra mới là nút cổ chai thực sự, chứ không phải quá trình lập kế hoạch query. Benchmark của chính Prisma so với engine Rust cũ:

Loại queryEngine RustEngine TypeScriptTăng tốc
findMany (25K bản ghi)185 ms55 ms3.4×
findMany (take=2000)6.6 ms3.1 ms2.1×
Complex JOIN207 ms130 ms1.6×

Bài benchmark riêng biệt (ref #3) báo cáo thêm kết quả many-to-many findMany (take=2000): 1.539 ms (Rust) → 136 ms (TypeScript), tăng tốc 11.3×. Test này dùng điều kiện workload khác với ba dòng trên. Mức tăng M2M lớn như vậy vì engine cũ phải serialize các intermediate result set lớn giữa Rust và Node — mỗi phần tử phải vượt ranh giới ngôn ngữ hai lần.

Drizzle đáp lại về hiệu năng bằng JIT row mapper trong v1 RC (Drizzle docs): được biên dịch lúc runtime, nó giảm overhead từ ORM xuống raw driver gần về không. Drizzle báo cáo mức giảm độ trễ đáng kể từ JIT mapper; không có benchmark công khai với số liệu cụ thể vào thời điểm viết bài. Cả hai ORM đều nhanh trong năm 2026. Cái nào nhanh hơn phụ thuộc vào schema và access pattern của bạn.

Bundle size vẫn quan trọng ở edge

Khoảng cách đã thu hẹp nhưng chưa biến mất. Drizzle ở ~7.4 KB gzipped vẫn nhỏ hơn ~80× so với Prisma ở ~600 KB gzipped.

Sự khác biệt này rõ ràng ở hai trường hợp cụ thể:

  • Cloudflare Workers free plan: giới hạn bundle 1 MB mỗi Worker. Prisma ở 600 KB chiếm 60% ngân sách đó trước khi code của bạn được đóng gói.
  • Vercel Edge Functions: cùng giới hạn 1 MB, cùng phép tính.

Với Node.js Lambda (giới hạn 10 MB), server thông thường, hoặc bất cứ môi trường nào không bị ràng buộc edge, bundle size của Prisma không phải vấn đề thực tế.

Nếu bạn đang cân nhắc runtime edge để kết hợp với ORM, Bun vs Node 2026 phân tích tradeoff trong cùng bối cảnh Cloudflare Workers và Vercel Edge.

Định nghĩa schema và migrations

Hai ORM có quan điểm trái ngược về nơi schema được định nghĩa.

Prisma là schema-first: bạn định nghĩa data model trong file .prisma bằng Prisma Schema Language. Prisma tạo TypeScript types, migration SQL, và client từ file duy nhất đó.

// schema.prisma — Prisma 7
model User {
  id    Int     @id @default(autoincrement())
  email String  @unique
  name  String?
  posts Post[]
}

model Post {
  id        Int     @id @default(autoincrement())
  title     String
  published Boolean @default(false)
  author    User    @relation(fields: [authorId], references: [id])
  authorId  Int
}
npx prisma migrate dev --name add_users

Drizzle là code-first: schema là TypeScript. Không có DSL trung gian.

// schema.ts — Drizzle 0.45.2
import { integer, text, boolean, pgTable } from 'drizzle-orm/pg-core';

export const users = pgTable('users', {
  id:    integer('id').primaryKey().generatedAlwaysAsIdentity(),
  email: text('email').unique(),
  name:  text('name'),
});

export const posts = pgTable('posts', {
  id:        integer('id').primaryKey().generatedAlwaysAsIdentity(),
  title:     text('title').notNull(),
  published: boolean('published').default(false),
  authorId:  integer('author_id').references(() => users.id),
});
npx drizzle-kit generate
npx drizzle-kit migrate

Một lưu ý thực tế về Drizzle migrations: các báo cáo từ cộng đồng (GitHub #2114) mô tả trường hợp drizzle-kit generate phát ra lệnh DROP cho các FK constraint được tạo bởi Prisma migrations — những constraint mà Drizzle không có hồ sơ tạo ra. Điều này có thể làm hỏng migration diff khi chuyển từ Prisma sang Drizzle. Nếu bạn đang migrate từ Prisma, hãy tính thêm thời gian để đối chiếu migration table. Hệ thống migration của Prisma lâu đời hơn và xử lý drift detection nhất quán hơn.

Cả hai ORM đều có giao diện Studio cục bộ để duyệt database. npx drizzle-kit studio của Drizzle là mã nguồn mở. Prisma Studio là closed-source, miễn phí, và chạy cục bộ.

Query API

Query API là nơi hai ORM khác biệt rõ nhất.

Tạo bản ghi

Prisma hỗ trợ nested writes — bạn tạo một user và các bài viết của họ trong một thao tác:

const user = await prisma.user.create({
  data: {
    email: '[email protected]',
    name: 'Alice',
    posts: { create: [{ title: 'Hello World' }] }
  }
});

Drizzle yêu cầu các lệnh INSERT riêng biệt:

const [user] = await db.insert(users)
  .values({ email: '[email protected]', name: 'Alice' })
  .returning();

await db.insert(posts)
  .values({ title: 'Hello World', authorId: user.id });

Với ứng dụng nặng về dữ liệu có nhiều relational write, API nested của Prisma tiết kiệm được nhiều dòng code và giúp lý luận về transaction boundary dễ hơn.

Truy vấn với joins

Prisma dùng relation API tự động dịch sang SQL:

const users = await prisma.user.findMany({
  where: { posts: { some: { published: true } } },
  select: { id: true, email: true }
});

Drizzle phơi bày JOIN một cách tường minh:

const result = await db.select({ id: users.id, email: users.email })
  .from(users)
  .leftJoin(posts, eq(users.id, posts.authorId))
  .where(eq(posts.published, true));

Developer có nền tảng SQL thường thích cách của Drizzle hơn khi debug — không có tầng dịch nào cần lý giải khi query trả về kết quả sai. Developer không muốn nghĩ về cú pháp JOIN thì thích Prisma hơn.

Transactions

Cả hai API gần như giống hệt nhau ở đây:

// Prisma
await prisma.$transaction(async (tx) => {
  const user = await tx.user.create({ data: { email: '[email protected]' } });
  await tx.post.create({ data: { title: 'First', authorId: user.id } });
});

// Drizzle
await db.transaction(async (tx) => {
  const [user] = await tx.insert(users).values({ email: '[email protected]' }).returning();
  await tx.insert(posts).values({ title: 'First', authorId: user.id });
});

Không có sự khác biệt đáng kể.

Type safety

Prisma tạo type từ file schema. Mọi kết quả query đều được typed đầy đủ lúc biên dịch. Prisma 7 cũng giảm overhead đánh giá TypeScript type ~98%, giúp kiểm tra type đầy đủ nhanh hơn ~70% trên schema lớn.

Drizzle suy luận type từ định nghĩa bảng TypeScript. Kết quả từ select()insert().returning() đều được typed. Điểm khác biệt: các argument trong mệnh đề where() của Drizzle có thể chấp nhận các kết hợp không hợp lệ về mặt logic mà không báo lỗi TypeScript. Tài liệu so sánh của Prisma nêu thẳng điều này: “You can write invalid queries with Drizzle.” Đây là thiết kế có chủ đích — Drizzle coi developer là người biết SQL, không phải người cần ORM kiểm soát logic query.

Với CRUD đơn giản, sự khác biệt này hiếm khi xuất hiện. Nó lộ ra trong các query phức tạp với nhiều join và filter có điều kiện.

Hỗ trợ database

DatabasePrisma 7Drizzle 0.45
PostgreSQL
MySQL
SQLite
MongoDB
CockroachDB
MSSQL✅ (v1 RC)
Cloudflare D1✅ (adapter)✅ (native)
Neon serverless
Supabase

MongoDB là điểm dừng cứng. Drizzle không hỗ trợ. Nếu yêu cầu của bạn bao gồm MongoDB, bài so sánh kết thúc ở đây.

Một lưu ý Supabase cụ thể cho người dùng Drizzle: chế độ Transaction pooling yêu cầu tắt prepared statements (prepare: false trong config Drizzle, ref #10). Bỏ qua điều này gây ra các lỗi khó hiểu trong production.

Nếu bạn vẫn đang chọn database, Postgres vs MySQL 2026 phân tích tradeoff cho các database mà cả hai ORM đều hỗ trợ.

Hệ sinh thái

Prisma đã tồn tại gần một thập kỷ và có bề mặt third-party rộng hơn: Zod schema generator, ERD generator, tRPC adapter, jest-prisma. Các managed service tùy chọn — Accelerate (connection pooling + query cache, miễn phí đến 60K ops/tháng) và Pulse (change data capture) — nhắm đến các team muốn database infrastructure đi kèm với ORM.

Momentum của Drizzle rõ nét. Stars tăng từ ~15K năm 2024 lên hơn 34K vào tháng 5 năm 2026; lượt download đã vượt Prisma trong một số khoảng đo Q4 2025. Bộ công cụ cốt lõi — Drizzle Kit, Drizzle Studio, Drizzle Seed — bao phủ toàn bộ quy trình phát triển. Hệ sinh thái third-party còn nhỏ hơn nhưng đang phát triển.

Cây quyết định

Edge/serverless (CF Workers, Vercel Edge)?
├── Có  → Drizzle (7.4 KB gzip vừa vặn; Prisma 600 KB có nguy cơ vượt giới hạn 1 MB)
└── Không → MongoDB bắt buộc?
          ├── Có  → Prisma (không có lựa chọn thay thế trong TypeScript)
          └── Không → Team quen tư duy SQL?
                    ├── Có  → Drizzle (minh bạch, dễ debug, không overhead)
                    └── Không → Ưu tiên DX và schema-first?
                              ├── Có  → Prisma (nested writes, hệ sinh thái phong phú)
                              └── Prototype → Prisma (ít boilerplate cho relations)

Chuyển từ Prisma sang Drizzle

Một câu chuyện migration thực tế được ghi lại (GitHub #3146): API 10 tháng tuổi, 19 bảng, 3 external dependency, tổng cộng ~21 giờ. Kết quả là giảm 25% số dòng code. Động lực chính là khả năng tương thích với Cloudflare Workers — kiến trúc cũ của Prisma yêu cầu remote data proxy, khiến các end-to-end test cục bộ không khả thi.

Các điểm khó khăn mà quá trình migration đó gặp phải:

  • Không có updatedAt tự động cập nhật trong Drizzle — chuyển vào domain logic
  • Không có include trong response của createupdate — xử lý từng trường hợp
  • Lỗi Cloudflare Workers I/O context — yêu cầu tạo DB client cho mỗi request

Không có codemod chính thức cho schema Prisma → Drizzle. Third-party prisma-generator-drizzle tồn tại nhưng không xử lý được tất cả loại field.

Kết luận

Chọn Drizzle nếu: bạn triển khai lên Cloudflare Workers hoặc Vercel Edge; team bạn thoải mái với việc viết SQL; bạn muốn không có dependency và kiểm soát tối đa.

Chọn Prisma nếu: bạn cần MongoDB; bạn thích schema-first DX với các type được tạo từ một nguồn sự thật duy nhất; nested writes quan trọng với data access layer của bạn; hoặc bạn muốn sử dụng Accelerate và Pulse.

Prisma 7 khiến đây là lựa chọn khó đoán hơn so với năm 2024. Bundle nhỏ hơn, hiệu năng tốt hơn, và edge runtime đã hoạt động. Nhưng Drizzle ở 7.4 KB gzip vẫn nhỏ hơn 80× — và trên ngân sách 1 MB của edge runtime, khoảng cách đó là thực tế.

Lưu ý

Không có benchmark độc lập trong bài này. Brief yêu cầu dữ liệu benchmark độc lập (1K sequential INSERT, SELECT + JOIN trên 10K hàng, 100 concurrent transaction trên PostgreSQL). Chúng tôi không thể chạy những test đó trong giai đoạn viết bài này. Các khẳng định về hiệu năng ở trên dùng dữ liệu từ nhà cung cấp. Hãy coi chúng là định hướng cho đến khi chúng tôi xuất bản bài benchmark riêng.

Drizzle v1 là pre-release. JIT row mapper có trong 1.0.0-rc.2. Hãy kiểm tra trạng thái GA trước khi áp dụng v1 vào production.

Không có affiliate link. Redirect affiliate /go/supabase chưa tồn tại trong bảng affiliate của toolchew. Supabase được link trực tiếp. Cần tạo issue riêng để thêm slug trước khi cập nhật bài viết này cho affiliate tracking.

Tham khảo

  1. Prisma ORM architecture shift: Rust → TypeScript
  2. Prisma ORM 7.0.0 announcement
  3. Prisma ORM without Rust: latest performance benchmarks
  4. Drizzle ORM overview
  5. Prisma vs Drizzle — Prisma comparison docs
  6. Prisma Accelerate pricing
  7. GitHub #3146 — Prisma → Drizzle migration story
  8. GitHub #2114 — Drizzle migration inconsistencies
  9. npm trends: drizzle-orm vs prisma
  10. Drizzle ORM — Connect Supabase (prepare: false requirement)