Chuẩn hóa dữ liệu dạng 2 - Second normal form là gì?

Một bảng được xem ở dạng chuẩn hóa dữ liệu dạng 2 (second normal form - 2NF) khi:

  • Nó đã đạt được chuẩn hóa dạng 1.
  • Dữ liệu chỉ phụ thuộc vào khóa chính, không có sự phụ thuộc một phần.

Phụ thuộc là gì?

Xét bảng Student dưới đây.

StudentId

Name

Address

1

Nguyễn A

Đà Nẵng

2

Nguyễn B

Hà Nội

3

Nguyễn B

Hà Tĩnh

StudentId là khóa chính của bảng này, nó là duy nhất, dùng nó có thể xác định chính xác record cần lấy ra.

Với Name = Nguyễn B, bạn không thể biết chắc được anh ấy ở Hà Nội hoặc Hà tĩnh.

Với StudentId = 2, bạn có thể truy xuất tên là Nguyễn B ở Hà Nội.

Với StudentId = 3, bạn có một sinh viên khác cùng tên Nguyễn B nhưng ở Hà Tĩnh.

Khi có các thuộc tính phụ, bạn không chắc record lấy ra có chính xác hay không. Tuy nhiên khi có khóa chính, bạn chắc chắn được record cần lấy ra. Do vậy ta có thể nói, các thuộc tính còn lại bị ràng buộc với khóa chính.

Phụ thuộc một phần là gì?

Bên cạnh bảng Student, hãy tạo thêm bảng Subject (lưu các môn học) và Score ( để lưu điểm các môn học)

Subject

SubjectId

SubjectName

1

C#

2

C++

3

Java

4

JavaScript

Score:

StudentId

SubjectId

Marks

Teacher

1

1

7.0

Iron Man

1

2

8.0

Deadpool

3

1

10.0

Iron Man

Với bảng Score, StudentId và SubjectId sẽ hợp lại thành một Primary key. Tức là với một môn học bất kì StudentId và SubjectId sẽ xác định một hàng duy nhất.

Nếu vẫn thấy bối rối vì cặp khóa PRIMARY KEY này, bạn có thể đặt câu hỏi truy ngược lại như sau.

Nếu tôi muốn biết điểm của Student có Id =1, bạn có thể lấy chính xác nó khỏi bảng được không? Chắc chắn là không, vì ở bảng trên có 2 giá trị với StudentId là 1.

Nếu tôi muốn biết điểm của Student có Id là 1 của môn học C#, bạn có thể lấy ra được không?

Câu trả lời là được. Điểm của Sinh viên đó là 7.0

Do vậy để xác định chính xác record cần lấy ra ta cần phải sử dụng cặp khóa chính StudentId và SubjectId.

Bảng trên thiết kế sai chỗ nào?

Nếu bạn nhìn vào trường teacher, bạn có thể thấy nó chỉ phụ thuộc vào subject. Bạn có thể nói, Iron Man dạy môn học C# mà không cần quan tâm đến sinh viên nào học.

Tức là teacher chỉ phụ thuộc vào SubjectId thay vì cả StudentId và SubjectId, nó không lệ thuộc hoàn toàn vào khóa chính. Vì thế ta gọi teacher phụ thuộc một phần vào khóa chính.

Giải quyết vấn đề.

Để dữ liệu phụ thuộc vào khóa chính, ta phải chuyển cột teacher sang subject. Do vậy teacher phụ thuộc hoàn toàn vào subjectId mà không phụ thuộc vào điểm.

Subject

SubjectId

SubjectName

Teacher

1

C#

Iron Man

2

C++

Deadpool

3

Java

Hulk

4

JavaScript

Batman

Score

StudentId

SubjectId

Marks

1

1

7.0

1

2

8.0

3

1

10.0


Bây giờ ta có thể nói, bảng Score và Subject đạt dạng chuẩn hóa thứ 2. Các thuộc tính phụ thuộc hoàn toàn vào khóa chính.

Lưu ý:

Để database đạng dạng chuẩn hóa thứ 2, thì nó phải đạng dạng chuẩn hóa thứ nhất trước.

Khi có lệ thuộc một phần, database sẽ không đạt được dạng chuẩn hóa thứ 2. Bấy giờ bạn nên đưa dữ liệu tới một cột thích hợp để đạt được dạng chuẩn hóa thứ 2.

Các môn học khác

Chương trình thường được xây dựng quanh dữ liệu và logic để xử lý chúng. Nói cách khác: Program = Cấu trúc dữ liệu + giải thuật. Do vậy đây là môn học bắt buộc dành cho các lập trình viên.

HTTP giúp kết nối các máy tính trên mạng Internet thông qua TCP/IP

Khóa học này cung cấp cho ta kiến thức nền tảng về công nghệ Blockchain, Bitcoin. Vì sao nó được gọi là công nghệ của tương lai, vì sao giá Bitcoin lại cao đến vậy. Làm sao để mua Bitcoin, ETH.