
Checklist tối ưu khi sử dụng PostgreSQL
Dưới đây là Checklist tối ưu PostgreSQL chuyên sâu cho Laravel / NestJS / NextJS trong môi trường High Traffic, tổng hợp từ kinh nghiệm triển khai API lớn, e-commerce, SaaS
DnSoft Admin
13 thg 2, 2026
Các cấp độ chuẩn hóa được gọi là các dạng chuẩn (Normal Forms), được sắp xếp từ thấp đến cao (đạt dạng cao hơn thì tự động đạt các dạng thấp hơn).
Dong Nguyen
2 tháng 3, 2026

Chuẩn hóa là quá trình tổ chức dữ liệu trong các bảng sao cho:
Các cấp độ chuẩn hóa phổ biến nhất: 1NF → 2NF → 3NF (thực tế dùng nhiều nhất), đôi khi lên BCNF.
Ví dụ ban đầu (bảng chưa chuẩn hóa)
Giả sử ta có một bảng duy nhất lưu thông tin đơn hàng sách:
Bảng DONHANG
| MaDon | TenKhachHang | DiaChiKhach | TenSach | TacGia | GiaSach | SoLuong | NgayDat | NhanVienXuLy |
|---|---|---|---|---|---|---|---|---|
| DH001 | Nguyễn Văn A | Đà Nẵng | SQL Cơ bản, Python Nâng cao | Trần Văn B, Lê Thị C | 250000, 320000 | 2, 1 | 2026-02-15 | Lê Thị Hoa |
| DH002 | Trần Thị B | Hà Nội | Java Core | Nguyễn Văn D | 280000 | 3 | 2026-03-01 | Phạm Minh |
→ Bảng này có rất nhiều vấn đề: dữ liệu đa trị trong cùng ô, dư thừa, khó cập nhật…
1. Dạng chuẩn 1 (First Normal Form – 1NF)
Yêu cầu chính:
Chuẩn hóa về 1NF → Tách các giá trị đa trị thành nhiều dòng:
Bảng DONHANG_1NF
| MaDon | TenKhachHang | DiaChiKhach | TenSach | TacGia | GiaSach | SoLuong | NgayDat | NhanVienXuLy |
|---|---|---|---|---|---|---|---|---|
| DH001 | Nguyễn Văn A | Đà Nẵng | SQL Cơ bản | Trần Văn B | 250000 | 2 | 2026-02-15 | Lê Thị Hoa |
| DH001 | Nguyễn Văn A | Đà Nẵng | Python Nâng cao | Lê Thị C | 320000 | 1 | 2026-02-15 | Lê Thị Hoa |
| DH002 | Trần Thị B | Hà Nội | Java Core | Nguyễn Văn D | 280000 | 3 | 2026-03-01 | Phạm Minh |
→ Đạt 1NF. Nhưng vẫn còn dư thừa lớn (tên khách, địa chỉ, nhân viên lặp lại nhiều lần).
2. Dạng chuẩn 2 (Second Normal Form – 2NF)
Yêu cầu:
Khóa chính hiện tại của bảng trên là (MaDon, TenSach) (vì một đơn có thể mua nhiều sách).
Vấn đề:
Chuẩn hóa về 2NF → Tách thành 3 bảng:
Bảng KHACHHANG
| MaKhach | TenKhachHang | DiaChiKhach |
|---|---|---|
| KH001 | Nguyễn Văn A | Đà Nẵng |
| KH002 | Trần Thị B | Hà Nội |
Bảng DONHANG
| MaDon | MaKhach | NgayDat | NhanVienXuLy |
|---|---|---|---|
| DH001 | KH001 | 2026-02-15 | Lê Thị Hoa |
| DH002 | KH002 | 2026-03-01 | Phạm Minh |
Bảng CHITIET_DONHANG
| MaDon | TenSach | TacGia | GiaSach | SoLuong |
|---|---|---|---|---|
| DH001 | SQL Cơ bản | Trần Văn B | 250000 | 2 |
| DH001 | Python Nâng cao | Lê Thị C | 320000 | 1 |
| DH002 | Java Core | Nguyễn Văn D | 280000 | 3 |
→ Đạt 2NF. Dư thừa giảm rõ rệt.
3. Dạng chuẩn 3 (Third Normal Form – 3NF)
Yêu cầu:
Vấn đề còn lại:
Chuẩn hóa về 3NF → Tách thêm bảng SACH:
Bảng SACH
| TenSach | TacGia | GiaSach |
|---|---|---|
| SQL Cơ bản | Trần Văn B | 250000 |
| Python Nâng cao | Lê Thị C | 320000 |
| Java Core | Nguyễn Văn D | 280000 |
Bảng CHITIET_DONHANG (sửa lại)
| MaDon | TenSach | SoLuong |
|---|---|---|
| DH001 | SQL Cơ bản | 2 |
| DH001 | Python Nâng cao | 1 |
| DH002 | Java Core | 3 |
→ Bây giờ đạt 3NF. Dữ liệu rất gọn gàng, không dư thừa, dễ bảo trì.
4. Boyce-Codd Normal Form (BCNF) – dạng chặt chẽ hơn 3NF
Yêu cầu:
Ví dụ cần BCNF:
Giả sử bảng GIANGVIEN_DAY_MON
| MaGV | MonHoc | PhongDay |
|---|---|---|
| GV01 | Cơ sở dữ liệu | P101 |
| GV01 | Lập trình web | P102 |
| GV02 | Cơ sở dữ liệu | P103 |
Phụ thuộc:
→ MonHoc quyết định PhongDay, nhưng MonHoc không phải siêu khóa → không đạt BCNF.
Chuẩn hóa BCNF:
Bảng MONHOC_PHONG
| MonHoc | PhongDay |
|---|---|
| Cơ sở dữ liệu | P101 |
| Lập trình web | P102 |
Bảng GIANGVIEN_DAY
| MaGV | MonHoc |
|---|---|
| GV01 | Cơ sở dữ liệu |
| GV01 | Lập trình web |
| GV02 | Cơ sở dữ liệu |
→ Đạt BCNF.
Tóm tắt
Hy vọng bài viết này giúp bạn hình dung rõ ràng quy trình chuẩn hóa qua ví dụ thực tế.
Nếu bạn thấy bài viết này hữu ích, hãy cân nhắc ủng hộ công việc của tôi. Điều đó giúp tôi tiếp tục tạo nội dung miễn phí cho cộng đồng lập trình viên.
Tôi sẵn sàng nhận việc freelance. Dù bạn cần ứng dụng full-stack, phát triển API hay tư vấn kỹ thuật, tôi rất vui được giúp đỡ.

Dưới đây là Checklist tối ưu PostgreSQL chuyên sâu cho Laravel / NestJS / NextJS trong môi trường High Traffic, tổng hợp từ kinh nghiệm triển khai API lớn, e-commerce, SaaS
DnSoft Admin
13 thg 2, 2026

Nếu bạn chuyển từ mô hình PHP-FPM truyền thống sang các worker chạy liên tục như RoadRunner, Laravel Queue worker, Symfony Messenger consumer, hoặc các daemon tùy chỉnh, bạn sẽ sớm nhận ra một hiện tượng quen thuộc:
Dong Nguyen
26 thg 2, 2026

Symfony Console đã trải qua nhiều cải tiến qua các phiên bản. Trước đây, lập trình viên thường phải kế thừa lớp Command, định nghĩa cấu hình trong configure() và viết logic chính trong execute(). Cách này ổn định nhưng khá dài dòng.
Dong Nguyen
26 thg 2, 2026