SQL Server: Chuẩn hóa dữ liệu (Normalization)


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

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ênChi 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ênChi 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

» Tiếp: Practical 0
« Trước: Lược đồ Thực thể-Quan hệ (Entity-Relationship Diagram - E-R D)
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!