Tổng quan về RDBMS
Đối với lập trình viên phát triển Backend, việc nắm vững cách thức hoạt động của Hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) là bắt buộc. Hệ thống này giúp tổ chức thông tin một cách khoa học, chặt chẽ và nhất quán. Tài liệu này cung cấp các kiến thức nền tảng về CSDL quan hệ như Khóa chính, Khóa ngoại, Ràng buộc và các đặc thù cú pháp giữa MySQL, MS SQL Server (MSSQL) và PostgreSQL khi phối hợp với Claude Code để thiết kế CSDL.RDBMS là gì?
RDBMS (Relational Database Management System) là hệ thống quản lý cơ sở dữ liệu dựa trên mô hình quan hệ. Trong mô hình này:- Dữ liệu được tổ chức thành các bảng hai chiều (Tables) gồm các hàng (bản ghi - Rows) và các cột (trường dữ liệu - Columns).
- Các bảng liên kết với nhau qua các mối quan hệ logic (Relationships) thay vì lưu trữ riêng lẻ.
Các thành phần nền tảng trong CSDL quan hệ
Để đảm bảo tính nhất quán và hiệu năng của dữ liệu, CSDL quan hệ định nghĩa các cơ chế sau:1. Primary Key (PK - Khóa chính)
Khóa chính là một cột (hoặc tổ hợp nhiều cột) dùng để định danh duy nhất cho từng bản ghi trong bảng.- Đặc điểm: Không được chứa giá trị
NULL. Không được phép trùng lặp giữa các hàng. - Ví dụ: Trong bảng
users, cộtidthường là khóa chính.
2. Foreign Key (FK - Khóa ngoại)
Khóa ngoại là một cột trong bảng này liên kết trực tiếp tới khóa chính của bảng khác. Đây chính là sợi dây tạo nên “mối quan hệ” giữa các bảng.- Đặc điểm: Giúp duy trì tính toàn vẹn dữ liệu. CSDL sẽ từ chối nếu bạn cố tình lưu một giá trị khóa ngoại không tồn tại ở bảng gốc.
- Ví dụ: Bảng
orderscó cộtuser_idliên kết đến cộtid(PK) của bảngusers.
Ràng buộc dữ liệu (Constraints)
Ràng buộc là các quy tắc được thiết lập trên các cột để kiểm soát loại dữ liệu được nhập vào, tránh tối đa việc dữ liệu bị sai lệch.| Tên ràng buộc | Công dụng | Ví dụ thực tế |
|---|---|---|
| NOT NULL | Bắt buộc cột phải có dữ liệu, không được phép bỏ trống. | email của người dùng không được để trống. |
| UNIQUE | Đảm bảo tất cả các giá trị trong cột không được trùng lặp. | Mỗi username hoặc mã vạch sản phẩm phải là duy nhất. |
| DEFAULT | Tự động gán một giá trị mặc định nếu không truyền dữ liệu khi thêm mới. | Trạng thái đơn hàng mặc định là PENDING. |
| CHECK | Kiểm tra dữ liệu nhập vào có thỏa mãn biểu thức điều kiện logic. | Số lượng sản phẩm nhập kho phải lớn hơn hoặc bằng 0 (stock >= 0). |
Tính toàn vẹn thực thể & Hành vi Cascade
Khi một dòng ở bảng cha (chứa PK) bị xóa hoặc cập nhật, hệ thống RDBMS cho phép bạn định nghĩa trước hành vi tự động áp dụng lên các bản ghi ở bảng con (chứa FK):- ON DELETE CASCADE: Nếu dòng ở bảng cha bị xóa, toàn bộ dòng liên quan ở bảng con sẽ bị tự động xóa theo. (Thường dùng khi bảng con hoàn toàn phụ thuộc vào bảng cha, ví dụ: Xóa Đơn hàng -> Xóa chi tiết đơn hàng).
- ON DELETE SET NULL: Nếu dòng ở bảng cha bị xóa, giá trị khóa ngoại ở bảng con sẽ tự động được cập nhật thành
NULL. (Dùng khi dữ liệu ở bảng con vẫn có giá trị độc lập, ví dụ: Xóa Danh mục sản phẩm -> Đặt danh mục của các sản phẩm thuộc danh mục đó thànhNULL). - ON DELETE RESTRICT / NO ACTION: CSDL sẽ từ chối việc xóa dòng ở bảng cha nếu có dòng con đang liên kết tới nó. Đây là hành vi mặc định để bảo vệ an toàn dữ liệu.
Chỉ mục (Indexing) - Tối ưu hiệu năng truy vấn
Khi bảng dữ liệu lên tới hàng triệu dòng, việc tìm kiếm tuần tự từ đầu tới cuối bảng sẽ cực kỳ chậm.- Chỉ mục (Index) hoạt động giống như mục lục của một cuốn sách. Nó tạo ra một cấu trúc dữ liệu phụ (thường là cấu trúc cây B-Tree) để tăng tốc độ tìm kiếm bản ghi.
- Lưu ý: Chỉ mục giúp tăng tốc độ đọc dữ liệu (
SELECT), nhưng làm giảm nhẹ tốc độ ghi dữ liệu (INSERT,UPDATE,DELETE) do CSDL phải cập nhật lại mục lục. Chỉ đánh chỉ mục trên các cột thường xuyên xuất hiện trong mệnh đềWHEREhoặcJOIN.
Hướng dẫn Prompt cho Claude Code thiết kế CSDL hiệu quả
Khi làm việc với Claude Code, bạn nên mô tả rõ ràng các ràng buộc dữ liệu và chỉ định hệ CSDL đích mà bạn muốn sử dụng. Việc này giúp Claude sinh ra mã di cư dữ liệu (SQL DDL) hoặc Entity TypeORM chính xác.Prompt mẫu chuẩn thiết kế Schema:
Phần 2: Đặc thù và so sánh giữa các hệ CSDL
Dù cùng tuân theo các nguyên lý của RDBMS, mỗi hệ quản trị CSDL phổ biến (MySQL, MS SQL Server, PostgreSQL) lại có những cú pháp đặc thù riêng khi thực thi câu lệnh SQL thuần túy hoặc cấu hình dự án NestJS.Bảng so sánh tổng quan
| Đặc trưng | MySQL / MariaDB | MS SQL Server (MSSQL) | PostgreSQL |
|---|---|---|---|
| Khóa chính tự tăng | AUTO_INCREMENT | IDENTITY(1,1) | serial / bigserial hoặc GENERATED ALWAYS AS IDENTITY |
| Kiểu dữ liệu chuỗi | VARCHAR, TEXT | VARCHAR / NVARCHAR, TEXT | varchar, text |
| Kiểu dữ liệu ngày giờ | DATETIME, TIMESTAMP | DATETIME2, DATETIMEOFFSET | timestamp, timestamptz |
| Ký tự giữ chỗ (Placeholder) | ? | ? | $1, $2, $3... |
| Cú pháp gọi Stored Procedure | CALL tên_thủ_tục(?, ?) | EXEC tên_thủ_tục @param = ?, ... | CALL tên_thủ_tục($1, $2) |
| Cú pháp gọi Function | SELECT tên_hàm(?, ?) | SELECT dbo.tên_hàm(?, ?) | SELECT * FROM tên_hàm($1, $2) |
| Lấy dòng/ID vừa thêm | result.insertId | Mệnh đề OUTPUT inserted.* | Mệnh đề RETURNING * |
Chi tiết đặc thù của từng hệ CSDL
- MySQL / MariaDB
- MS SQL Server (MSSQL)
- PostgreSQL
1. Khóa chính & Kiểu dữ liệu tự tăng
MySQL sử dụng thuộc tínhAUTO_INCREMENT để tạo cột khóa chính tự động tăng:2. Ký tự giữ chỗ (Placeholder)
Khi viết SQL thuần túy để thực thi trong NestJS quaDataSource.query(), MySQL sử dụng dấu hỏi chấm ? làm ký tự giữ chỗ cho các tham số truyền vào:3. Thực thi Stored Procedure & Function
- Stored Procedure: MySQL sử dụng từ khóa
CALLđể thực thi thủ tục lưu trữ. - Đặc thù kết quả: Driver MySQL luôn trả về kết quả truy vấn dưới dạng một mảng lồng nhau. Trong đó, danh sách các dòng kết quả thực tế nằm ở phần tử đầu tiên (
result[0]), các phần tử tiếp theo là metadata.