Tìm hiểu NoSQL & MongoDB
Bên cạnh CSDL quan hệ truyền thống (RDBMS), NoSQL (Not Only SQL) là một trường phái cơ sở dữ liệu cực kỳ phổ biến trong phát triển ứng dụng hiện đại. Trong số đó, MongoDB (CSDL dạng tài liệu - Document Database) là cái tên dẫn đầu nhờ tính linh hoạt cao và khả năng mở rộng tuyệt vời. Tài liệu này giúp bạn thấu hiểu bản chất của NoSQL, cách hoạt động của MongoDB, và cách ra lệnh cho Claude Code thiết kế mô hình dữ liệu (Schema) tối ưu cho dự án Backend của mình.NoSQL là gì?
NoSQL là thuật ngữ chỉ các hệ quản trị cơ sở dữ liệu phi quan hệ, không sử dụng mô hình bảng gồm hàng và cột cố định như SQL truyền thống.So sánh nhanh RDBMS và NoSQL:
| Tiêu chí | CSDL Quan hệ (RDBMS - Postgres, MySQL) | CSDL Phi quan hệ (NoSQL - MongoDB, Redis) |
|---|---|---|
| Cấu trúc dữ liệu | Rất chặt chẽ, bắt buộc định nghĩa Schema tĩnh trước khi ghi dữ liệu. | Linh hoạt (Schema-less), dữ liệu có thể thay đổi cấu trúc động. |
| Quan hệ giữa các bảng | Có ràng buộc chặt chẽ thông qua Khóa ngoại (FK). | Không có ràng buộc khóa ngoại cứng ở tầng database. |
| Khả năng mở rộng | Mở rộng theo chiều dọc (Scale-up: Nâng cấp CPU, RAM của 1 máy chủ). | Mở rộng theo chiều ngang (Scale-out: Thêm nhiều máy chủ chạy song song). |
| Tính nhất quán | Ưu tiên tính toàn vẹn dữ liệu tuyệt đối (ACID). | Ưu tiên tính sẵn sàng và tốc độ xử lý nhanh (BASE). |
Bản chất của MongoDB (CSDL Dạng Tài liệu)
MongoDB lưu trữ dữ liệu dưới dạng Document (Tài liệu) sử dụng định dạng tương tự JSON (gọi là BSON - Binary JSON). Nhiều Document có liên quan được nhóm lại trong một Collection (Bộ sưu tập).Đối chiếu thuật ngữ giữa SQL và MongoDB:
Hai mô hình thiết kế dữ liệu cốt lõi trong MongoDB
Khi làm việc với CSDL quan hệ, bạn bắt buộc phải chia nhỏ dữ liệu ra nhiều bảng và liên kết bằng khóa ngoại (Normalize). Nhưng trong MongoDB, bạn có hai lựa chọn linh hoạt để tổ chức dữ liệu:- 1. Nhúng dữ liệu (Embedding / Denormalization)
- 2. Liên kết dữ liệu (Referencing / Normalization)
Gộp toàn bộ dữ liệu liên quan vào chung một Document duy nhất dưới dạng mảng (Array) hoặc đối tượng lồng nhau (Sub-document).Ví dụ: Lưu thông tin User và danh sách Địa chỉ (Addresses):
- Ưu điểm: Tốc độ đọc cực nhanh vì chỉ cần chạy đúng 1 câu lệnh truy vấn là lấy được toàn bộ dữ liệu cần thiết, không cần Join.
- Khi nào nên dùng: Mối quan hệ 1-Nhiều nhưng số lượng “Nhiều” ở mức giới hạn (ví dụ: một người có tối đa 5-10 địa chỉ).
Khai báo Mongoose Schema trong NestJS
Trong NestJS, ta sử dụng gói@nestjs/mongoose để khai báo cấu trúc Model.
src/users/schemas/user.schema.ts