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ệuRấ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ảngCó 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ộngMở 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:
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):
{
  "_id": "60c72b2f9b1d8e2b8c8d8888",
  "fullName": "Nguyen Van A",
  "email": "a@gmail.com",
  "addresses": [
    { "city": "Ha Noi", "street": "Nguyen Trai" },
    { "city": "Da Nang", "street": "Le Loi" }
  ]
}
  • Ư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ỉ).
MongoDB không thực thi ràng buộc khóa ngoại vật lý. Nếu một bài viết có authorId tham chiếu tới một User không tồn tại, database vẫn cho phép lưu bình thường. Lập trình viên phải tự kiểm soát tính toàn vẹn này ở tầng Logic (NestJS Service).

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
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document, Types } from 'mongoose';

export type UserDocument = User & Document;

@Schema({ timestamps: true }) // Tự động thêm cột createdAt và updatedAt
export class User {
  @Prop({ required: true, unique: true })
  email: string;

  @Prop({ required: true })
  fullName: string;

  @Prop({ default: true })
  isActive: boolean;

  // Ví dụ mảng nhúng (Embedded array)
  @Prop([String])
  hobbies: string[];
}

export const UserSchema = SchemaFactory.createForClass(User);

Hướng dẫn viết Prompt cho Claude Code thiết kế CSDL MongoDB

Khi yêu cầu Claude Code viết code tương tác với MongoDB, hãy làm rõ chiến lược lưu trữ (Nhúng hay Liên kết) để mã nguồn sinh ra chuẩn xác nhất.

Prompt mẫu chuẩn thiết kế MongoDB Schema:

Tôi muốn xây dựng một hệ thống E-commerce bằng NestJS sử dụng cơ sở dữ liệu MongoDB và thư viện Mongoose. Hãy thiết kế Schema 'Order' cho tôi:
1. Đặt tên Schema là 'Order', lưu trong bảng 'orders'.
2. Các trường dữ liệu:
   - customerName: string, bắt buộc.
   - totalAmount: number, bắt buộc.
   - status: string, mặc định là 'PENDING'.
3. Về cấu trúc liên kết:
   - Hãy sử dụng mô hình NHÚNG (Embedding) để lưu danh sách các mặt hàng trong đơn (items) trực tiếp vào trong Document Order dưới dạng một mảng các Sub-document. Mỗi item gồm: productId (string), quantity (number), và price (number).
4. Hãy sử dụng decorator từ '@nestjs/mongoose' để khai báo Schema chuẩn chỉnh.