SQL Server: Chuẩn hóa dữ liệu (Normalization)
Ban đầu, tất cả các cơ sở dữ liệu được đặc trưng bởi số lượng lớn các cột và bản ghi. Cách tiếp cận này có những hạn chế nhất định. Hãy xem xét các chi tiết sau đây của các nhân viên trong một bộ phận. Bảng dưới đây bao gồm thông tin chi tiết về nhân viên cũng như chi tiết về dự án mà họ đang thực hiện.
Emp_no |
Project_id |
Project_name |
Emp_name |
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 Chi tiết về nhân viên của phòng ban
► Lặp bất thường
Các dữ liệu như Project_id, Project_name, Grade và Salary ở bảng trên lặp lại nhiều lần. Sự lặp lại này ảnh hưởng đến hiệu suất trong quá trình truy xuất dữ liệu và dung lượng lưu trữ. Sự lặp lại dữ liệu này được gọi là lặp bất thường.
► Chèn (Insert) bất thường
Giả sử bộ phận tuyển dụng được một nhân viên mới tên là Ann. Bây giờ, hãy coi rằng Ann đã không được giao bất kỳ dự án nào. Khi đó việc chèn chi tiết của cô ấy trong bảng sẽ để trống các cột Project_id và Project_name. Để trống các cột có thể dẫn đến sự cố sau này. Các dị thường được tạo ra bởi các phần chèn như vậy được gọi là chèn bất thường. Sự bất thường khi chèn có thể được thấy trong bảng dưới đây.
Emp_no |
Project_id |
Project_name |
Emp_name |
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 |
195 |
- |
- |
Ann |
C |
10,000 |
► Xóa (Delete) bất thường
Giả sử, Bob bị loại khỏi dự án MAGNUM. Việc xóa bản ghi cũng sẽ xóa các chi tiết Emp_no, Grade và Salary của Bob. Việc mất dữ liệu này có hại vì tất cả các chi tiết cá nhân của Bob cũng bị mất như trong bảng dưới đây. Loại mất dữ liệu do xóa này được gọi là xóa bất thường.
Emp_no |
Project_id |
Project_name |
Emp_name |
Grade |
Salary |
---|---|---|---|---|---|
142 |
113, 124 |
BLUE STAR, MAGNUM |
John Smith |
A |
20,000 |
168 |
113 |
BLUE STAR |
James Kilber |
B |
15,000 |
263 |
113 |
BLUE STAR |
Andrew Murray |
C |
10,000 |
► Cập nhật (Update) bất thường
Giả sử John được tăng lương hoặc John bị giáng chức. Sự thay đổi về Mức lương hoặc Cấp bậc của John cần phải được phản ánh trong tất cả các dự án mà John làm việc. Việc phải cập nhật tất cả các lần xuất hiện như thế được gọi là cập nhật bất thường.
Bảng Chi tiết về nhân viên của phòng ban ở trên được gọi là bảng không chuẩn hóa. Những hạn chế này dẫn đến sự cần thiết phải chuẩn hóa.
Chuẩn hóa là quá trình loại bỏ các phần thừa và phụ thuộc không mong muốn.
Ban đầu, Codd (1972) trình bày ba dạng chuẩn (1NF, 2NF và 3NF), tất cả đều dựa trên sự phụ thuộc giữa các thuộc tính của một quan hệ. Dạng chuẩn thứ tư và thứ năm dựa trên các phụ thuộc đa giá trị và kết nối và được đề xuất sau đó.
Dạng chuẩn hóa thứ nhất (First Normal Form - 1NF)
Để đạt được 1NF, ta cần thực hiện các bước sau:
Bước 1: Tạo các bảng riêng biệt cho từng nhóm dữ liệu liên quan
Bước 2: Các cột trong bảng phải có giá trị nguyên tố
Bước 3: Tất cả các thuộc tính khóa phải được xác định
Ta xem lại bảng Chi tiết về nhân viên của phòng ban:
Emp_no |
Project_id |
Project_name |
Emp_name |
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 có dữ liệu liên quan đến các dự án và nhân viên. Bảng cần được chia thành hai bảng, đó là bảng Chi tiết dự án và bảng Chi tiết nhân viên. Các cột trong bảng gồm Project_id và Project_name có nhiều giá trị, thì dữ liệu cần được chia thành các hàng khác nhau. Các bảng kết quả là Chi tiết dự án và Chi tiết nhân viên như trong bảng 1 và bảng 2.
Project_id |
Project_name |
---|---|
113 |
BLUE STAR |
124 |
MAGNUM |
Bảng 1. Chi tiết dự án
Emp_no |
Emp_name |
Grade |
Salary |
---|---|---|---|
142 |
John |
A |
20,000 |
168 |
James |
B |
15,000 |
263 |
Andrew |
C |
10,000 |
109 |
Bob |
C |
10,000 |
Bảng 2. Chi tiết nhân viên
Thuộc tính Project_id là thuộc tính khóa chính cho bảng Chi tiết dự án. Thuộc tính Emp_no là thuộc tính khóa chính cho bảng Chi tiết nhân viên. Do đó, ở dạng 1NF, bảng Chi tiết về nhân viên của phòng ban ban đầu đã được tách thành bảng Chi tiết dự án và Chi tiết nhân viên.
Các bảng được cho là ở dạng 2NF nếu:
+ Chúng đáp ứng các yêu cầu của dạng 1NF
+ Không có phụ thuộc một phần trong các bảng
+ Các bảng được liên kết với nhau thông qua các khóa ngoại
Phụ thuộc một phần có nghĩa là một thuộc tính không phải khóa không được phụ thuộc một phần vào nhiều hơn một thuộc tính khóa. Các bảng Chi tiết dự án và Chi tiết nhân viên không thể hiện bất kỳ phụ thuộc một phần nào. Project_name chỉ phụ thuộc vào Project_id, và Emp_name, Cấp bậc và Mức lương chỉ phụ thuộc vào Emp_no.
Các bảng cũng cần được liên kết với nhau thông qua các khóa ngoại. Vì vậy, ta cần một bảng thứ ba có tên là Chi tiết dự án nhân viên được tạo gồm hai cột là Project_id và Emp_no.
Vì vậy, bảng Chi tiết dự án và Chi tiết nhân viên khi chuyển đổi sang dạng 2NF sẽ tạo thêm bảng Chi tiết dự án nhân viên như dưới đây:
Emp_no |
Project_id |
---|---|
142 |
113 |
142 |
124 |
168 |
113 |
263 |
113 |
109 |
124 |
Bảng 3. Chi tiết dự án nhân viên
Các thuộc tính, Emp_no và Project_id của bảng Chi tiết dự án nhân viên kết hợp với nhau để tạo thành khóa chính. Khóa chính như vậy được gọi là khóa chính tổng hợp.
Để đạt được dạng 3NF thì:
+ Các bảng phải đáp ứng các yêu cầu của dạng 2NF
+ Các bảng không được có phụ thuộc bắc cầu trong chúng
Các bảng Chi tiết dự án, Chi tiết nhân viên và Chi tiết dự án nhân viên đều đáp ứng dạng 2NF. Nếu một thuộc tính có thể được xác định bởi một thuộc tính không phải khóa khác, thì nó được gọi là phụ thuộc bắc cầu. Để đơn giản hơn, mọi thuộc tính không phải khóa chỉ nên được xác định bởi thuộc tính khóa. Nếu một thuộc tính không phải khóa có thể được xác định bởi một thuộc tính không phải khóa khác, thì nó cần phải đưa vào một bảng khác.
Khi quan sát các bảng khác nhau, có thể thấy rằng các bảng Chi tiết dự án và Chi tiết dự án nhân viên không thể hiện bất kỳ phụ thuộc bắc cầu nào như vậy. Các thuộc tính không khóa được xác định hoàn toàn bởi các thuộc tính khóa. Project_name chỉ được xác định bởi Project_number. Khi xem xét kỹ hơn bảng Chi tiết nhân viên, có thể thấy một sự mâu thuẫn nhất định. Thuộc tính Salary được xác định bởi thuộc tính Grade chứ không phải thuộc tính chính Emp_no. Do đó, cần phải loại bỏ sự phụ thuộc bắc cầu này.
Bảng Chi tiết Nhân viên cần phải được chia thành Chi tiết nhân viên và Chi tiết mức lương như bảng 4 và bảng 5 dưới đây.
Emp_no |
Emp_name |
Grade |
---|---|---|
142 |
John |
A |
168 |
James |
B |
263 |
Andrew |
C |
109 |
Bob |
C |
Bảng 4. Chi tiết nhân viên
Grade |
Salary |
---|---|
A |
20,000 |
B |
15,000 |
C |
10,000 |
Bảng 5. Chi tiết mức lương
Như vậy, khi kết thúc ba giai đoạn chuẩn hóa, bảng Chi tiết về nhân viên của phòng ban ban đầu đã được tách thành các bảng Chi tiết dự án, Chi tiết dự án nhân viên, Chi tiết nhân viên và Chi tiết mức lương như được thể hiện dưới đây.
Project_id |
Project_name |
---|---|
113 |
BLUE STAR |
124 |
MAGNUM |
Chi tiết dự án
Emp_no |
Project_id |
---|---|
142 |
113 |
142 |
124 |
168 |
113 |
263 |
113 |
109 |
124 |
Chi tiết dự án nhân viên
Emp_no |
Emp_name |
Grade |
---|---|---|
142 |
John |
A |
168 |
James |
B |
263 |
Andrew |
C |
109 |
Bob |
C |
Chi tiết nhân viên
Grade |
Salary |
---|---|
A |
20,000 |
B |
15,000 |
C |
10,000 |
Chi tiết mức lương