2. ERD and Normalization
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).
- Các giá trị trong mỗi cột cùng một kiểu dữ liệu (Data type).
- Xác định khóa cho mỗi hàng.
-
Cách làm như sau:
- Tách bảng thành hai bảng riêng biệt: một bảng cho thông tin về nhân viên (Employees) và một bảng cho thông tin về dự án (Projects).
- Bảng Employees:
- Các cột trong bảng Employees sẽ bao gồm: EmployeeId, EmployeeName, Grade và Salary, ProjectId.
- Trong bảng Employees, EmployeeId và ProjectId sẽ là khóa chính (primary key) để định danh mỗi nhân viên một cách duy nhất.
- Bảng Projects:
- Các cột trong bảng Projects sẽ bao gồm: ProjectId và ProjectName.
- Trong bảng Projects, ProjectId sẽ là khóa chính (primary key) để định danh mỗi dự án một cách duy nhất.
Bảng Employees
EmployeeId | ProjectId | EmployeeName | Grade | Salary |
---|---|---|---|---|
142 | 113 | John | A | 20,000 |
142 | 124 | John | A | 20,000 |
168 | 113 | James | B | 15,000 |
263 | 113 | Andrew | C | 10,000 |
109 | 124 | Bob | C | 10,000 |
Bảng Projects
ProjectId | ProjectName |
---|---|
113 | BLUE STAR |
124 | MAGNUM |
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.
-
Cách làm như sau:
- 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 hàng một cách duy nhất.
- Xóa cột ProjectId trong bảng Employees.
- 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.
Bảng Employees_Projects:
EmployeeId | ProjectId |
---|---|
142 | 113 |
142 | 124 |
168 | 113 |
263 | 113 |
109 | 124 |
Bảng Projects:
ProjectId | ProjectName |
---|---|
113 | BLUE STAR |
124 | MAGNUM |
Bảng Employees:
EmployeeId | EmployeeName | Grade | Salary |
---|---|---|---|
142 | John | A | 20,000 |
168 | James | B | 15,000 |
263 | Andrew | C | 10,000 |
109 | Bob | C | 10,000 |
Third Normal Form (3NF)
-
Để đạt được 3NF, bảng cần thỏa mãn các điều kiện sau:
- Cần đạt được 2NF.
- Tất cả các thuộc tính không khóa trong 3NF được yêu cầu là phải phụ thuộc trực tiếp vào mỗi khóa của quan hệ
-
Cách làm như sau:
- Tạo bảng Grade với các cột: Grade và Salary.
- Trong bảng Grade, cột Grade sẽ là khóa chính (primary key) để định danh mỗi hàng một cách duy nhất.
- Xóa cột Salary trong bảng Employees.
- Tạo mối quan hệ giữa bảng Employees và bảng Grade thông qua cột Grade.
Bảng Grade
Grade | Salary |
---|---|
A | 20,000 |
B | 15,000 |
C | 10,000 |
Bảng Employees
EmployeeId | EmployeeName | Grade |
---|---|---|
142 | John | A |
168 | James | B |
263 | Andrew | C |
109 | Bob | C |
Bảng Projects
ProjectId | ProjectName |
---|---|
113 | BLUE STAR |
124 | MAGNUM |
Bảng Employees_Projects
EmployeeId | ProjectId |
---|---|
142 | 113 |
142 | 124 |
168 | 113 |
263 | 113 |
109 | 124 |