Chuẩn hóa là quá trình tổ chức dữ liệu trong các bảng sao cho:
- Loại bỏ dư thừa dữ liệu (trùng lặp không cần thiết)
- Tránh các bất thường khi thêm/sửa/xóa (insertion, update, deletion anomalies)
- Đảm bảo tính nhất quán và toàn vẹn dữ liệu
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:
- Mọi giá trị trong ô phải là nguyên tử (không chứa danh sách, không phân tách được nữa)
- Không có nhóm lặp lại (repeating groups)
- Mỗi bảng phải có khóa 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:
- Đạt 1NF
- Mọi thuộc tính không phải khóa phải phụ thuộc đầy đủ vào toàn bộ khóa chính (không phụ thuộc bộ phận – partial dependency)
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 đề:
- TenKhachHang, DiaChiKhach chỉ phụ thuộc vào MaDon (không phụ thuộc TenSach) → phụ thuộc bộ phận
- NhanVienXuLy chỉ phụ thuộc MaDon
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:
- Đạt 2NF
- Không có phụ thuộc bắc cầu (transitive dependency): thuộc tính không khóa không được phụ thuộc vào thuộc tính không khóa khác
Vấn đề còn lại:
- Trong CHITIET_DONHANG: TacGia phụ thuộc vào TenSach (không phụ thuộc trực tiếp vào MaDon)
- → TenSach → TacGia (phụ thuộc bắc cầu)
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:
- Đạt 3NF
- Mọi yếu tố quyết định (determinant) trong phụ thuộc hàm phải là siêu khóa (superkey)
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:
- MaGV, MonHoc → PhongDay (khóa chính)
- MonHoc → PhongDay (mỗi môn chỉ học ở 1 phòng cố định)
→ 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
- Hầu hết dự án thực tế chỉ cần đạt 3NF → cân bằng giữa tính toàn vẹn và hiệu suất.
- BCNF dùng khi có nhiều phụ thuộc phức tạp, tránh bất thường hiếm gặp.
- 4NF, 5NF rất hiếm dùng (chủ yếu trong giáo trình hoặc data warehouse đặc thù).
- Đừng chuẩn hóa quá mức → có thể làm chậm truy vấn (phải join nhiều bảng).
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ế.