Databasedatabasepostgres

Chuẩn hóa cơ sở dữ liệu là gì và tại sao cần chuẩn hóa?

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 cơ sở dữ liệu là gì và tại sao cần chuẩn hóa?

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ế.

Ủng hộ tác giả

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.

Mua cho tôi ly cà phê

Cần hỗ trợ cho dự án của bạ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 đỡ.

Xem dịch vụ của tôi