Đưa một cơ sở dữ liệu vào biểu mẫu bình thường thứ ba (3NF)

Hình thức thông thường thứ ba (3NF) là một nguyên tắc cơ sở dữ liệu hỗ trợ tính toàn vẹn của dữ liệu bằng cách xây dựng dựa trên các nguyên tắc chuẩn hóa cơ sở dữ liệu được cung cấp bởi First Normal Form (1NF) và Second Normal Form (2NF).

Yêu cầu hình thức bình thường thứ ba

Có hai yêu cầu cơ bản cho một cơ sở dữ liệu ở dạng bình thường thứ ba:

Giới thiệu về phụ thuộc khóa chính

Chúng ta hãy khám phá thêm những gì chúng ta có ý nghĩa bởi thực tế là tất cả các cột phải phụ thuộc vào khóa chính.

Nếu giá trị của một cột có thể được lấy từ cả khóa chính và cột khác trong bảng, nó vi phạm 3NF. Xem xét một bảng nhân viên với các cột này:

Cả hai LastName và FirstName chỉ phụ thuộc vào giá trị của EmployeeID? Vâng, LastName có thể phụ thuộc vào FirstName không? Không, bởi vì không có gì cố hữu trong LastName sẽ gợi ý giá trị của FirstName. FirstName có thể phụ thuộc vào LastName không? Không một lần nữa, bởi vì cùng là đúng: bất cứ điều gì một LastName có thể được, nó không thể cung cấp một gợi ý về giá trị của FirstName. Do đó, bảng này tuân thủ 3NF.

Nhưng hãy xem xét bảng Phương tiện này:

Nhà sản xuất và Mô hình có thể lấy được từ VehicleID - nhưng Model cũng có thể lấy được từ Nhà sản xuất vì một mẫu xe chỉ được thực hiện bởi một nhà sản xuất cụ thể. Thiết kế bảng này không tuân thủ 3NF, và do đó có thể dẫn đến dị thường dữ liệu. Ví dụ: bạn có thể cập nhật nhà sản xuất mà không cập nhật mô hình, giới thiệu những điểm không chính xác.

Để làm cho nó tuân thủ, chúng tôi sẽ cần phải di chuyển cột phụ thuộc bổ sung vào một bảng khác và tham khảo nó bằng cách sử dụng khóa ngoài. Điều này sẽ dẫn đến hai bảng:

Bảng phương tiện

Trong bảng bên dưới, ModelID là khóa ngoài cho bảng Kiểu:

Mô hình bảng

Bảng mới này ánh xạ các mô hình cho các nhà sản xuất. Nếu bạn muốn cập nhật bất kỳ thông tin xe cụ thể cho một mô hình, bạn sẽ làm điều đó trong bảng này, chứ không phải trong bảng Phương tiện.

Các trường có nguồn gốc trong mô hình 3NF

Một bảng có thể chứa một trường dẫn xuất - một trường được tính dựa trên các cột khác trong bảng. Ví dụ, hãy xem xét bảng các đơn đặt hàng widget này:

Tổng số phá vỡ 3NF tuân thủ vì nó có thể được bắt nguồn bằng cách nhân giá đơn vị với số lượng, thay vì phụ thuộc hoàn toàn vào khóa chính. Chúng ta phải loại bỏ nó khỏi bảng để tuân thủ với hình thức bình thường thứ ba.

Trong thực tế, vì nó có nguồn gốc, nên tốt hơn là không lưu trữ nó trong cơ sở dữ liệu.

Chúng ta có thể đơn giản tính toán nó "một cách nhanh chóng" khi thực hiện các truy vấn cơ sở dữ liệu. Ví dụ: trước đây chúng tôi có thể đã sử dụng truy vấn này để truy lục số thứ tự và tổng số:

SELECT OrderNumber, Total FROM WidgetOrders

Bây giờ chúng ta có thể sử dụng truy vấn sau:

SELECT OrderNumber, UnitPrice * Số lượng AS Total FROM WidgetOrders

để đạt được kết quả tương tự mà không vi phạm quy tắc bình thường hóa.