DDevArchive
Đăng nhập

NoSQL: MongoDB và Redis khi nào cần

NoSQL không phải "thay thế SQL" mà là "công cụ khác cho bài toán khác". MongoDB linh hoạt về schema, Redis cực nhanh nhưng toàn bộ nằm trong RAM. Hiểu để chọn đúng, không chọn theo trend.

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
});
Vì sao "không schema" là con dao hai lưỡi

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)MongoDBRedis
Cấu trúcCứng, đã chuẩn hoáLinh hoạtKey–value
Quan hệ phức tạpMạnh nhấtPhải tự quản lýKhông phù hợp
Tốc độ đọc/ghiVừaVừaCực nhanh
Lưu trữĐĩa (persistent)ĐĩaRAM (đắt, có thể mất)
Dùng khiDữ liệu đúng là dữ liệuSchema hay đổi, document lồng nhauCache, session, hàng đợi
💡 Nguyên tắc thực tế

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”