1. Lý thuyết
Tổng quan về Normalization
Chuẩn hóa CSDL (Cơ sở dữ liệu) là quá trình tổ chức và thiết kế cơ sở dữ liệu một cách chính xác và hiệu quả. Mục tiêu của chuẩn hóa CSDL là loại bỏ các sự không chắc chắn, mâu thuẫn và lặp lại trong dữ liệu để đảm bảo tính nhất quán và độ tin cậy của cơ sở dữ liệu.
Chuẩn hóa CSDL giúp đảm bảo rằng dữ liệu trong cơ sở dữ liệu được lưu trữ và quản lý một cách hiệu quả, giảm thiểu sự mâu thuẫn, và tránh tình trạng dư thừa thông tin. Nó đảm bảo rằng mỗi mục dữ liệu chỉ được lưu trữ ở một nơi duy nhất, giúp tránh việc cập nhật dữ liệu không nhất quán và tăng tính nhất quán của cơ sở dữ liệu.
Quá trình chuẩn hóa CSDL thường bao gồm các bước sau:
Phân tích yêu cầu: Xác định yêu cầu của hệ thống và thu thập thông tin về dữ liệu cần được lưu trữ trong cơ sở dữ liệu.
Thiết kế lược đồ ER (Entity-Relationship): Sử dụng mô hình ER để biểu diễn các thực thể, mối quan hệ giữa chúng và các thuộc tính.
Chuẩn hóa bậc 1 (First Normal Form): Đảm bảo rằng mỗi ô trong bảng chỉ chứa giá trị đơn lẻ và không lặp lại.
Chuẩn hóa bậc 2 (Second Normal Form): Xác định và tách các bảng con chứa thuộc tính phụ thuộc vào một khóa không chính.
Chuẩn hóa bậc 3 (Third Normal Form): Đảm bảo rằng không có sự phụ thuộc dựa trên các thuộc tính không khóa.
Ngoài ra, còn có các bậc chuẩn hóa tiếp theo như bậc 4, bậc 5 và dạng chuẩn hóa cao hơn như Boyce-Codd Normal Form (BCNF) hoặc Fourth Normal Form (4NF). Quá trình chuẩn hóa CSDL có thể tùy chỉnh tùy theo yêu cầu và phức tạp của cơ sở dữ liệu cụ thể.
Xét ví dụ (Normalization)
EmployeeId | ProjectId | ProjectName | EmployeeName | Grade | Salary |
---|---|---|---|---|---|
142 | 113, 124 | BLUE STAR, MAGNUM | John | A | 20,000 |
168 | 113 | BLUE STAR | James | B | 15,000 |
263 | 113 | BLUE STAR | Andrew | C | 10,000 |
109 | 124 | MAGNUM | Bob | C | 10,000 |
Bảng trên bao gồm các điểm dị thường sau:
- Insertion Anomaly
- Deletion Anomaly
- Updation Anomaly
- Redundancy / Duplication / Repetition
Điểm dị thường về REPEATION
- Cột "ProjectId" và "ProjectName" trong bảng trên chứa các giá trị lặp lại. Ví dụ, dự án có "ProjectId" là 113 và 124 có tên là "BLUE STAR, MAGNUM". Điều này dẫn đến sự lặp lại dữ liệu trong bảng.
- Cột "Grade" tương ứng với Salary trong bảng trên cũng chứa các giá trị lặp lại. Ví dụ, nhân viên có "EmployeeId" là 109 và 263 đều có "Grade" là C và đều là 10,000. Điều này dẫn đến sự lặp lại dữ liệu trong bảng.
Điểm dị thường về INSERTION
- Cột "ProjectId" trong hàng đầu tiên có giá trị "113, 124". Điều này chỉ ra rằng một nhân viên có thể tham gia vào nhiều dự án (113 và 124). Tuy nhiên, trong các hàng tiếp theo, cột "ProjectId" chỉ chứa một giá trị duy nhất cho mỗi hàng. Điều này tạo ra sự không nhất quán trong dữ liệu khi INSERT vào bảng.
- Cột "ProjectName" trong hàng đầu tiên có giá trị "BLUE STAR, MAGNUM", chỉ ra rằng dự án này có tên gồm hai phần "BLUE STAR" và "MAGNUM". Tuy nhiên, trong các hàng tiếp theo, cột "ProjectName" chỉ chứa một tên dự án duy nhất cho mỗi hàng. Điều này cũng tạo ra sự không nhất quán trong dữ liệu khi INSERT vào bảng.
Điểm dị thường INSERTION trên liên quan đến việc chèn (INSERT) dữ liệu vào bảng, khi các giá trị của cột "ProjectId" và "ProjectName" không được đồng nhất cho các hàng tương ứng. Điều này cần được sửa chữa để đảm bảo tính nhất quán và chuẩn hóa dữ liệu trong cơ sở dữ liệu.
Điểm dị thường về DELETION
- Nếu bạn muốn xóa thông tin về một dự án cụ thể, ví dụ như dự án có "ProjectId" là 113, việc xóa dự án này sẽ không chỉ xóa hàng chứa dự án này mà còn ảnh hưởng đến các hàng khác. Ví dụ, nếu bạn xóa hàng chứa dự án có "ProjectId" là 113, thì hàng của nhân viên James và Andrew cũng sẽ bị xóa vì cả hai nhân viên này đều tham gia dự án 113. Điều này gây ra sự không nhất quán và mất mát dữ liệu trong bảng.
- Nếu bạn muốn xóa thông tin về một nhân viên cụ thể, việc xóa nhân viên này cũng sẽ ảnh hưởng đến các hàng khác. Ví dụ, nếu bạn xóa hàng chứa thông tin về nhân viên James, thì hàng của dự án có "ProjectId" là 113 cũng s ẽ bị xóa vì nhân viên James tham gia dự án 113. Điều này cũng dẫn đến sự không nhất quán và mất mát dữ liệu trong bảng.
Điểm dị thường DELETION trên liên quan đến việc xóa dữ liệu trong bảng, khi việc xóa một hàng có thể ảnh hưởng đến các hàng khác trong bảng. Điều này cần được xử lý một cách thích hợp để đảm bảo tính nhất quán và bảo toàn dữ liệu trong cơ sở dữ liệu.
Điểm dị thường về UPDATION
- Cột "ProjectId": Điểm dị thường ở đây là cập nhật giá trị của cột "ProjectId" trong một hàng. Vì cột "ProjectId" trong bảng ghi đầu tiên chứa giá trị "113, 124", việc cập nhật giá trị này thành một giá trị duy nhất sẽ gây ra sự không nhất quán trong dữ liệu. Nếu chỉ cập nhật "ProjectId" thành một giá trị duy nhất, ví dụ như 113 hoặc 124, thì thông tin về việc nhân viên tham gia vào nhiều dự án sẽ bị mất.
- Cột "ProjectName": Điểm dị thường ở đây là cập nhật giá trị của cột "ProjectName" trong một hàng. Vì cột "ProjectName" trong bảng ghi đầu tiên chứa giá trị "BLUE STAR, MAGNUM", việc cập nhật giá trị này thành một tên dự án duy nhất sẽ gây ra sự không nhất quán trong dữ liệu. Nếu chỉ cập nhật "ProjectName" thành một tên dự án duy nhất, ví dụ như "BLUE STAR" hoặc "MAGNUM", thì thông tin về việc một dự án có nhiều tên sẽ bị mất.
Điểm dị thường UPDATION trên liên quan đến việc cập nhật dữ liệu trong bảng, khi cập nhật giá trị của các cột "ProjectId" và "ProjectName" có thể gây ra sự không nhất quán và mất mát thông tin trong dữ liệu. Điều này cần được xử lý một cách cẩn thận để đảm bảo tính nhất quán và bảo toàn dữ liệu trong cơ sở dữ liệu.
First Normal Form (1NF)
-
Để đảm bảo tính nhất quán và chuẩn hóa dữ liệu trong cơ sở dữ liệu, các điểm dị thường INSERTION, DELETION và UPDATION cần được xử lý một cách thích hợp. Để làm được điều này, bảng cần được chuyển đổi thành First Normal Form (1NF).
-
Để đạt được 1NF, bảng cần thỏa mãn các điều kiện sau:
- Các giá trị trong mỗi cột phải là giá trị đơn (Atomic value) và cùng một kiểu dữ liệu (Data type).
- Cột không có sự lặp lại: Trong mỗi bảng, không có cột nào được lặp lại. Tức là mỗi thuộc tính chỉ xuất hiện một lần trong một bảng.
-
Cách làm như sau:
- Để chuyển bảng dữ liệu trên sang dạng chuẩn 1NF (First Normal Form), ta cần tách các giá trị trong cột
ProjectId
vàProjectName
thành các hàng riêng biệt. Khi đó, mỗi hàng sẽ chỉ chứa các giá trị nguyên tử (atomic values) và không có sự lặp lại nhóm dữ liệu.
- Để chuyển bảng dữ liệu trên sang dạng chuẩn 1NF (First Normal Form), ta cần tách các giá trị trong cột
Bảng Employees
EmployeeId | ProjectId | Project Name | EmployeeName | Grade | Salary |
---|---|---|---|---|---|
142 | 113 | BLUE STAR | John | A | 20,000 |
142 | 124 | MAGNUM | John | A | 20,000 |
168 | 113 | BLUE STAR | James | B | 15,000 |
263 | 113 | BLUE STAR | Andrew | C | 10,000 |
109 | 124 | MAGNUM | Bob | C | 10,000 |
Second Normal Form (2NF)
-
Để đạt được 2NF, bảng cần thỏa mãn các điều kiện sau:
- Cần đạt được 1NF.
- Các cột không phải là khóa chính (non-key columns) phải phụ thuộc vào toàn bộ khóa chính (entire primary key).
- Xây dựng mối quan hệ giữa các bảng
(Primary Key <-> Foreign Key)
.
-
Cách làm như sau:
- Tách bảng Employees thành hai bảng
Employees
vàProjects
. - Tạo bảng mới có tên là Employees_Projects với các cột:
EmployeeId
vàProjectId
. - Trong bảng Employees_Projects, cả hai cột EmployeeId và ProjectId tham gia cùng làm 1 khóa chính (primary key) để định danh mỗi bảng ghi là duy nhất.
- Xóa cột ProjectId trong bảng Employees (Vì đã có bảng Employees_Projects và đã mối liên hệ dữ liệu giữa
Employees <-> Projects
). - Thiết lập khóa chính cho bảng Employees là cột
EmployeeId
. - Tạo mối quan hệ giữa bảng Employees và bảng Employees_Projects thông qua cột
EmployeeId
. - Tạo mối quan hệ giữa bảng Projects và bảng Employees_Projects thông qua cột
ProjectId
.
- Tách bảng Employees thành hai bảng