Các Chuẩn Hóa Cơ Sở Dữ Liệu: Từ 1NF đến 6NF và BCNF
Chuẩn hóa cơ sở dữ liệu là một quy trình quan trọng trong thiết kế cơ sở dữ liệu, giúp loại bỏ dư thừa dữ liệu và đảm bảo tính toàn vẹn, nhất quán của thông tin. Dưới đây là 8 chuẩn hóa quan trọng trong cơ sở dữ liệu, từ 1NF đến 6NF, và BCNF.
1. Chuẩn 1NF (First Normal Form)
Chuẩn 1NF yêu cầu mỗi bảng trong cơ sở dữ liệu phải có cấu trúc đơn giản, mỗi cột chỉ chứa một giá trị duy nhất và không được phép chứa các danh sách hoặc mảng. Điều này đảm bảo rằng dữ liệu được chia thành các thành phần nhỏ nhất và tránh dư thừa thông tin trong cùng một cột.
Ví dụ:
CREATE TABLE Customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(100),
phone_number VARCHAR(15) -- Chỉ chứa một số điện thoại duy nhất, tuân thủ chuẩn 1NF
);
-- Dữ liệu mẫu
INSERT INTO Customers (customer_id, customer_name, phone_number)
VALUES (1, 'Nguyen Van A', '0912345678');
Trong bảng trên, mỗi hàng chỉ chứa một số điện thoại duy nhất cho mỗi khách hàng, đảm bảo tuân thủ chuẩn 1NF.
2. Chuẩn 2NF (Second Normal Form)
Chuẩn 2NF yêu cầu mỗi thuộc tính phi khóa phải phụ thuộc hoàn toàn vào khóa chính của bảng, nghĩa là không được có phụ thuộc bộ phận. Điều này đặc biệt quan trọng đối với các bảng có khóa phức hợp (khóa chính gồm nhiều cột).
Ví dụ:
CREATE TABLE Orders (
order_id INT,
product_id INT,
customer_name VARCHAR(100), -- Vi phạm 2NF vì customer_name không phụ thuộc hoàn toàn vào khóa chính (order_id, product_id)
PRIMARY KEY (order_id, product_id)
);
Để khắc phục, nên tách thông tin khách hàng ra thành bảng riêng:
CREATE TABLE Customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(100)
);
CREATE TABLE Orders (
order_id INT,
product_id INT,
customer_id INT,
PRIMARY KEY (order_id, product_id),
FOREIGN KEY (customer_id) REFERENCES Customers(customer_id)
);
Với cách thiết kế này, mỗi thuộc tính phi khóa phụ thuộc hoàn toàn vào khóa chính, đảm bảo tuân thủ chuẩn 2NF.
3. Chuẩn 3NF (Third Normal Form)
Chuẩn 3NF yêu cầu rằng không có thuộc tính phi khóa nào phụ thuộc vào một thuộc tính phi khóa khác. Tức là tất cả các thuộc tính phi khóa chỉ phụ thuộc vào khóa chính. Điều này giúp loại bỏ các phụ thuộc bắc cầu.
Ví dụ về Vi phạm Chuẩn 3NF:
Trong đoạn mã SQL dưới đây, bảng Employees
vi phạm chuẩn 3NF do thuộc tính department_name
phụ thuộc vào department_id
thay vì phụ thuộc trực tiếp vào khóa chính (employee_id
).
CREATE TABLE Employees (
employee_id INT PRIMARY KEY,
employee_name VARCHAR(100),
department_id INT,
department_name VARCHAR(100) -- Vi phạm quy tắc 3NF vì department_name phụ thuộc bắc cầu vào department_id thay vì trực tiếp phụ thuộc vào khóa chính (employee_id)
);
-- Dữ liệu mẫu
INSERT INTO Employees (employee_id, employee_name, department_id, department_name)
VALUES (1, 'Nguyen Van B', 10, 'Sales');
Để khắc phục, nên tách thông tin phòng ban sang bảng Departments
:
CREATE TABLE Departments (
department_id INT PRIMARY KEY,
department_name VARCHAR(100)
);
CREATE TABLE Employees (
employee_id INT PRIMARY KEY,
employee_name VARCHAR(100),
department_id INT,
FOREIGN KEY (department_id) REFERENCES Departments(department_id)
);
4. Chuẩn BCNF (Boyce-Codd Normal Form)
BCNF là phiên bản mạnh hơn của 3NF. Một bảng được coi là tuân thủ BCNF nếu với mọi phụ thuộc chức năng X → Y
, X
phải là một siêu khóa. BCNF giải quyết các vấn đề khi thuộc tính không phải khóa có thể xác định một thuộc tính khác.
Ví dụ:
CREATE TABLE Course (
course_id INT,
instructor_name VARCHAR(100),
room_number VARCHAR(100),
PRIMARY KEY (course_id, instructor_name)
);
-- Vi phạm BCNF vì instructor_name xác định room_number nhưng instructor_name không phải là siêu khóa.
5. Chuẩn 4NF (Fourth Normal Form)
Chuẩn 4NF yêu cầu rằng bảng không được có phụ thuộc đa trị phi tầm thường, tức là mỗi mối quan hệ đa trị cần phải được chia thành các bảng riêng biệt để tránh dữ liệu lặp lại và không cần thiết.
Ví dụ:
CREATE TABLE ProjectAssignment (
employee_id INT,
project_id INT,
skill VARCHAR(100),
PRIMARY KEY (employee_id, project_id, skill)
);
-- Một nhân viên có thể có nhiều kỹ năng và tham gia vào nhiều dự án, dẫn đến phụ thuộc đa trị.
Để tuân thủ 4NF, nên tách bảng này thành các bảng nhỏ hơn để lưu trữ mối quan hệ giữa nhân viên, dự án, và kỹ năng.
6. Chuẩn 5NF (Fifth Normal Form)
Chuẩn 5NF loại bỏ phụ thuộc kết hợp, yêu cầu bảng phải được chia thành các bảng nhỏ hơn để tránh mất thông tin khi kết hợp lại. Điều này đặc biệt cần thiết khi có mối quan hệ phức tạp giữa các thuộc tính.
Ví dụ:
CREATE TABLE SupplierPartsProjects (
supplier_id INT,
part_id INT,
project_id INT,
PRIMARY KEY (supplier_id, part_id, project_id)
);
-- Vi phạm 5NF nếu quan hệ giữa ba thuộc tính này không thể được chia nhỏ mà không mất thông tin.
7. Chuẩn 6NF (Sixth Normal Form)
Chuẩn 6NF tập trung vào việc loại bỏ mọi phụ thuộc nối kết và giúp cho việc xử lý dữ liệu dễ dàng hơn, đặc biệt trong trường hợp lưu trữ dòng thời gian và cập nhật liên tục.
Ví dụ:
CREATE TABLE EmployeeHistory (
employee_id INT,
position VARCHAR(100),
start_date DATE,
end_date DATE,
PRIMARY KEY (employee_id, start_date)
);
-- Bảng này lưu trữ thông tin thay đổi vị trí của nhân viên theo thời gian, đảm bảo không có phụ thuộc nối kết.
Kết luận
Các chuẩn hóa cơ sở dữ liệu từ 1NF đến 6NF và BCNF là các bước quan trọng giúp thiết kế cơ sở dữ liệu có cấu trúc hợp lý, tránh dư thừa và đảm bảo tính toàn vẹn. Tuân thủ các chuẩn này sẽ giúp bạn xây dựng cơ sở dữ liệu hiệu quả hơn, dễ bảo trì và tránh được nhiều vấn đề về tính nhất quán dữ liệu trong quá trình vận hành.