🗄️ SQL vs NoSQL

Relational Database vs Non-Relational Database — Khi nào chọn cái nào?

🔵 SQL (Relational)

Schema cố định, bảng có quan hệ, ACID transactions. PostgreSQL, MySQL, SQL Server.

🟢 NoSQL (Non-Relational)

Schema linh hoạt, nhiều mô hình (Document, Key-Value, Graph). MongoDB, Redis, Cassandra.

1. SQL Database

SQL (Structured Query Language) databases lưu dữ liệu trong các bảng (tables) với schema cố định. Các bảng có quan hệ với nhau qua foreign keys.

Đặc điểm:

  • ACID: Atomicity, Consistency, Isolation, Durability — đảm bảo tính toàn vẹn
  • Schema cố định: Mỗi bảng có cấu trúc xác định, data phải tuân theo
  • Normalization: Tránh trùng lặp data bằng cách chia thành nhiều bảng
  • JOIN: Truy vấn dữ liệu từ nhiều bảng cùng lúc
  • Vertical scaling: Scale bằng nâng cấp hardware
-- SQL: Tạo bảng với schema cố định
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    user_id INTEGER REFERENCES users(id),
    total DECIMAL(10,2) NOT NULL,
    status VARCHAR(20) DEFAULT 'pending'
);

-- JOIN: Lấy orders kèm thông tin user
SELECT u.name, o.total, o.status
FROM orders o
JOIN users u ON o.user_id = u.id
WHERE o.status = 'pending';

2. NoSQL Database

NoSQL databases không sử dụng cấu trúc bảng truyền thống. Có nhiều loại:

  • Document (MongoDB): Lưu JSON/BSON documents
  • Key-Value (Redis): Lưu cặp key-value đơn giản
  • Wide-Column (Cassandra): Lưu theo column families
  • Graph (Neo4j): Lưu nodes và relationships
// MongoDB: Document linh hoạt, không cần schema
// User 1 có address, User 2 không có — hoàn toàn OK
db.users.insertMany([
  {
    name: "Nguyễn Văn A",
    email: "[email protected]",
    address: { city: "HCM", district: "Q1" }, // nested document
    skills: ["Node.js", "MongoDB"]             // array
  },
  {
    name: "Trần Thị B",
    email: "[email protected]",
    phone: "0901234567"  // field khác hẳn user 1 — OK!
  }
]);

// Embedded documents — không cần JOIN
db.orders.insertOne({
  user: { name: "Nguyễn Văn A", email: "[email protected]" },
  items: [
    { product: "iPhone 15", price: 25000000, qty: 1 },
    { product: "Case", price: 200000, qty: 2 }
  ],
  total: 25400000,
  status: "pending"
});

3. Bảng So Sánh

Tiêu chí 🔵 SQL 🟢 NoSQL
Mô hình Bảng (rows + columns) Document, Key-Value, Graph
Schema Cố định (strict) Linh hoạt (flexible)
Transactions ACID (mạnh) BASE (eventual consistency)
Scaling Vertical (nâng cấp server) Horizontal (thêm server)
Relations JOIN giữa bảng Embedded / Denormalized
Query SQL (chuẩn hóa) API riêng từng loại
Ví dụ PostgreSQL, MySQL, Oracle MongoDB, Redis, Cassandra
Tốt cho Finance, ERP, reporting Real-time, big data, flexible schema

4. Khi Nào Chọn?

Chọn SQL khi:
• Data có cấu trúc rõ ràng, quan hệ phức tạp
• Cần ACID transactions (banking, e-commerce)
• Cần JOIN, aggregate, reporting
• Team quen SQL

Chọn NoSQL khi:
• Schema thay đổi thường xuyên
• Cần horizontal scaling (millions users)
• Data dạng document (CMS, profiles)
• Real-time apps, IoT, gaming

💡 Xu hướng hiện đại: Nhiều công ty dùng cả hai (Polyglot Persistence). VD: PostgreSQL cho orders + payments, MongoDB cho product catalog, Redis cho cache + sessions.