80 phút
Database Normalization
Giới thiệu Normalization
Normalization là quá trình tổ chức dữ liệu trong database để giảm redundancy và cải thiện data integrity.
First Normal Form (1NF)
Quy tắc 1NF
- Mỗi cell chỉ chứa một giá trị atomic
- Mỗi bản ghi là unique
- Các giá trị trong column cùng kiểu dữ liệu
Ví dụ vi phạm 1NF
-- VI PHẠM 1NF
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(100),
courses VARCHAR(500) -- Chứa nhiều khóa học: "Math,Science,History"
);
Chuẩn hóa 1NF
-- ĐẠT 1NF
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE student_courses (
student_id INT,
course_name VARCHAR(100),
PRIMARY KEY (student_id, course_name),
FOREIGN KEY (student_id) REFERENCES students(id)
);
Second Normal Form (2NF)
Quy tắc 2NF
- Đạt 1NF
- Mọi non-prime attribute phụ thuộc đầy đủ vào primary key
Ví dụ vi phạm 2NF
-- VI PHẠM 2NF
CREATE TABLE order_items (
order_id INT,
product_id INT,
product_name VARCHAR(100), -- Phụ thuộc vào product_id, không phụ thuộc đầy đủ vào composite key
quantity INT,
price DECIMAL(10,2),
PRIMARY KEY (order_id, product_id)
);
Chuẩn hóa 2NF
-- ĐẠT 2NF
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
price DECIMAL(10,2),
PRIMARY KEY (order_id, product_id)
);
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(100)
);
Third Normal Form (3NF)
Quy tắc 3NF
- Đạt 2NF
- Không có transitive dependency (non-prime attribute không phụ thuộc vào non-prime attribute khác)
Ví dụ vi phạm 3NF
-- VI PHẠM 3NF
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(100),
department_id INT,
department_name VARCHAR(100), -- Phụ thuộc vào department_id (transitive dependency)
department_location VARCHAR(100)
);
Chuẩn hóa 3NF
-- ĐẠT 3NF
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(100),
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(department_id)
);
CREATE TABLE departments (
department_id INT PRIMARY KEY,
department_name VARCHAR(100),
department_location VARCHAR(100)
);
Boyce-Codd Normal Form (BCNF)
Quy tắc BCNF
- Đạt 3NF
- Mọi determinant phải là candidate key
Ví dụ vi phạm BCNF
-- VI PHẠM BCNF
CREATE TABLE course_enrollment (
student_id INT,
course_id INT,
instructor_id INT,
-- Giả sử: mỗi instructor chỉ dạy một course
-- Nhưng một course có nhiều instructor
PRIMARY KEY (student_id, course_id)
);
Chuẩn hóa BCNF
-- ĐẠT BCNF
CREATE TABLE student_enrollment (
student_id INT,
course_id INT,
PRIMARY KEY (student_id, course_id)
);
CREATE TABLE course_instructors (
course_id INT,
instructor_id INT,
PRIMARY KEY (course_id, instructor_id)
);
Denormalization
Đôi khi cần denormalization cho performance:
-- Denormalization cho reporting
CREATE TABLE sales_summary (
product_id INT,
product_name VARCHAR(100),
category_name VARCHAR(100),
total_sales DECIMAL(15,2),
total_quantity INT,
last_sale_date DATE
);