Bài viết này sẽ giới thiệu đến bạn 3 bước chuẩn hóa NF Cơ sở dữ liệu.

Mục đích của việc chuẩn hóa NF Cơ sở dữ liệu

  1. Giảm thiểu dư thừa dữ liệu
  2. Loại bỏ các bất thường khi cập nhật cơ sở dữ liệu

Các kiểu chuẩn hóa cơ sở dữ liệu

Có 3 dạng chuẩn hóa cơ bản đó là:

– First Normal Form (1NF): dạng chuẩn 1NF

– Second Normal Form (2NF): dạng chuẩn 2NF

– Third Nomal Form (3NF): dạng chuẩn 3NF

Các dạng chuẩn được sắp xếp theo thứ tự từ thấp đến cao. Để chuẩn hóa 2NF thì cơ sở dữ liệu của bạn phải đạt chuẩn 1NF, tương tự nếu đạt chuẩn 3NF thì phải đạt chuẩn 1NF và 2NF.

Dạng chuẩn 1NF

Cho 1 bảng như bên dưới:

Bảng có 3 khóa chính là customer_id, order_id và product_id.

Bảng dữ liệu này vi phạm cả điều kiện của chuẩn 1NF vì: address chứa các giá trị trùng lặp, hơn thế nữa, giá trị address trong từng hàng không phải là đơn trị (chỉ có 1 giá trị), thêm vào đó, thuộc tính total_amount hoàn toàn có thể tính toán được bằng cách quantity * unit_price, không nhất thiết phải đưa vào bảng, gây ra dư thừa dữ liệu. Qua nhận xét trên, ta có thể hình dung ra 3 điều kiện cần phải tuân theo đó là:

  • Các thuộc tính của bảng phải là nguyên tố
  • Giá trị của các thuộc tính trên các hàng phải là đơn trị, không chứa nhóm lặp
  • Không có một thuộc tính nào có giá trị có thể tính toán được từ một thuộc tính khác

Từ đó, ta có thể thiết kế lại bảng dữ liệu trên như sau:

  • Tách các thuộc tính lặp trong bảng như: customer_name, phone ra thành một bảng mới là customers
  • Tách address thành một bảng riêng có khóa là customer_id để biết địa chỉ đó thuộc về customer nào.
  • Loại bỏ thuộc tính total_amount.

Kết quả như sau:

Dạng chuẩn 2NF

Quy tắc chuẩn hóa từ chuẩn 1NF thành 2NF:

Bước 1: Loại bỏ các thuộc tính không khóa phụ thuộc vào một bộ phận khóa chính và tách ra thành một bảng riêng, khóa chính của bảng là bộ phận của khóa mà chúng phụ thuộc vào.

Bước 2: Các thuộc tính còn lại lập thành một quan hệ, khóa chính của nó là khóa chính ban đầu.

Bảng dữ liệu mới mà ta thiết kế vẫn chưa đạt chuẩn 2NF là vì: một số thuộc tính

như description , unit_price phụ thuộc vào 1 phần của khóa là product_id chứ không cần phụ thuộc cả vào tập khóa (customer_id, order_id, product_id), hay thuộc tính customer_name và phone cũng chỉ phụ thuộc vào customer_id, thuộc tính order_date phụ thuộc vào customer_id và order_id, thuộc tính quantity phụ thuộc vào order_id và product_id.

Vậy nên để đạt chuẩn 2NF thì ta sẽ thiết kế tiếp bảng dữ liệu chuẩn 1NF như sau:

  • Tách các thuộc tính (product_id, description, unit_price) thành một bảng riêng là products.
  • Các thuộc tính (customer_id, order_id, order_date) làm thành một bảng, mình đặt tên là orders.
  • Còn lại các thuộc tính (order_id, product_id, quantity) làm thành một bảng trung gian giữa products và orders, mình đặt là order_products.

Chỉ cần tuân thủ 2 chuẩn mà ta đã được cơ sở dữ liệu chuẩn hóa như sau:

Dạng chuẩn 3NF

Điều kiện:

  • Phải đạt chuẩn 2NF
  • Mọi thuộc tính không khóa phụ thuộc bắc cầu vào thuộc tính khóa (nghĩa là tất cả các thuộc tính không khóa phải được suy ra trực tiếp từ thuộc tính khóa)

Quy tắc chuẩn hóa từ 2NF thành 3NF:

Bước 1: Loại bỏ các thuộc tính phụ thuộc bắc cầu ra khỏi quan hệ và tách chúng thành quan hệ riêng có khóa chính là thuộc tính bắc cầu.

Bước 2: Các thuộc tính còn lại lập thành một quan hệ có khóa chính là khóa ban đầu.

Để ý thấy cơ sở dữ liệu mà ta thiết kế ở chuẩn 2NF cũng đã đạt chuẩn 3NF. Thế nên mình sẽ lấy một ví dụ khác để các bạn tham khảo như sau:

Ví dụ bảng sau vi phạm chuẩn 3NF:

chuẩn hóa NF cơ sở dữ liệu

Ta thấy thuộc tính country_name phụ thuộc vào country_id, mà country_id lại phụ thuộc vào khóa chính là id. Vì vậy ta nên tách bảng trên thành 2 bảng sau:

chuẩn hóa NF cơ sở dữ liệu

Author: Nguyễn Vũ Thành Tiến

Xem thêm các tài liệu, bài chia sẻ, hướng dẫn khác tại đây.

Đăng ký nhận bộ tài liệu kỹ năng dành cho lập trình viên (video hướng dẫn + slide) tại đây


Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.