MongoDB: document linh hoạt
MongoDB lưu mỗi bản ghi là một document JSON — mỗi document có thể có cấu trúc khác nhau. Phù hợp dữ liệu phi cấu trúc hoặc hay thay đổi schema.
// File: mongo.js
// Mỗi document là một object, có thể khác nhau
const order = await db.orders.insertOne({
userId: 'u1',
items: [
{ productId: 'p1', qty: 2 },
{ productId: 'p2', qty: 1 },
],
total: 299000,
shipping: { city: 'Hà Nội', fee: 0 }, // cấu trúc lồng nhau
});
Nhanh lúc đầu vì không cần migrate, nhưng 6 tháng sau bạn không biết document nào có trường nào. Mongoose (ODM) giúp áp “schema ảo” — dùng nó ngay từ đầu.
Redis: in-memory database
Redis lưu dữ liệu trong RAM nên đọc/ghi nhanh cực kỳ (micro-giây). Nhưng RAM đắt và dữ liệu có thể mất khi restart (trừ cấu hình persist). Redis phù hợp: cache, session, hàng đợi nhỏ, đếm.
// File: redis.js
import redis from 'redis';
const client = redis.createClient();
await client.connect();
// cache: key tự hết hạn sau 300 giây
await client.set('course:g1:detail', JSON.stringify(detail), {
EX: 300,
});
const hit = await client.get('course:g1:detail');
if (hit) return JSON.parse(hit); // cache hit!
Chọn công cụ nào
| Tiêu chí | PostgreSQL (SQL) | MongoDB | Redis |
|---|---|---|---|
| Cấu trúc | Cứng, đã chuẩn hoá | Linh hoạt | Key–value |
| Quan hệ phức tạp | Mạnh nhất | Phải tự quản lý | Không phù hợp |
| Tốc độ đọc/ghi | Vừa | Vừa | Cực nhanh |
| Lưu trữ | Đĩa (persistent) | Đĩa | RAM (đắt, có thể mất) |
| Dùng khi | Dữ liệu đúng là dữ liệu | Schema hay đổi, document lồng nhau | Cache, session, hàng đợi |
Mặc định dùng SQL cho dữ liệu chính. Thêm Redis cho những gì đọc nhiều ghi ít. Chỉ cân nhắc MongoDB khi schema thật sự linh hoạt hoặc bạn cần document lồng sâu.
❓ Bạn muốn lưu session đăng nhập mà mỗi request phải đọc, thời gian sống ngắn. Công cụ phù hợp nhất?
- Hiểu document MongoDB khác row SQL thế nào
- Lý giải được vì sao Redis nhanh
- Biết Redis phù hợp cache/session, không phải dữ liệu chính
- Không chọn NoSQL chỉ vì “nghe hay”