Chương 6: Phụ thuộc hàm và dạng chuẩn
Cơ sở khoa học để tối ưu cấu trúc bảng khi thiết kế cơ sở dữ liệu, tổ chức dữ liệu hợp lý, loại bỏ sự trùng lặp và đảm bảo tính toàn vẹn thông tin xuyên suốt trong các mô hình cơ sở dữ liệu.
1. Các khái niệm liên quan đến phụ thuộc hàm
1.1. Ví dụ mở đầu
Phụ thuộc hàm (function dependency) là một công cụ dùng để biểu diễn hình thức một cách hình thức các ràng buộc toàn vẹn. Đây là một công cụ cực kỳ quan trọng, gắn chặt với lý thuyết thiết kế cơ sở dữ liệu.
Ta có thể xem một ví dụ về Ràng buộc toàn vẹn sau:
Cho một quan hệ sau:
| MONANID | TENMONAN | GIATIEN |
|---|---|---|
| 01 | Banh My | 10000 |
| 02 | Bun Rieu Cua | 50000 |
| 03 | Xoi Thit | 20000 |
Một số ràng buộc có thể kể đến trong quan hệ trên: Mỗi món ăn phải có một mã số duy nhất để phân biệt (PRIMARY KEY CONSTRAINT - ), không được phép để trống (NOT NULL CONSTRAINT), không được phép bé hơn 0... Tất cả đều là các ràng buộc toàn vẹn, giúp dữ liệu trong bảng luôn thống nhất và hợp lệ.
Phụ thuộc hàm được ứng dụng trong việc giải quyết các bài toán tìm kiếm khóa cho bài toán.
Cho quan hệ - cho biết các chương trình được phát sóng trên kênh truyền hình A
| NHANVIEN | CHUONGTRINH | NGAY | GIO |
|---|---|---|---|
| An | Kamen Rider Zeztz | 10/11 | 7:30a |
| Toan | Em Yeu Khoa Hoc | 12/11 | 6:30p |
| Hung | The Gioi Dong Vat | 12/11 | 2:00p |
| Nga | Buoi Trua Vui Ve | 13/11 | 13:00p |
| An | Kamen Rider Zeztz | 15/11 | 7:30a |
| Nga | The Gioi Dong Vat | 15/11 | 2:00p |
| Hung | Em Yeu Khoa Hoc | 16/11 | 6:30p |
| Nhi | Nguoi Ta Noi | 18/11 | 10:00a |
| An | Code Khuya Cung An | 19/11 | 00:00a |
Quan hệ diễn tả nhân viên nào sẽ phụ trách chương trình nào, và chương trình đó sẽ phát sóng vào thời gian nào. Không phải sự phối hợp bất kỳ nào giữa Nhân Viên, Chương trình, và Giờ Phát Sóng nào cũng đều được chấp thuận mà chúng có các điều kiện ràng buộc qui định sau:
- Mỗi chương trình có một giờ phát sóng duy nhất
Ví dụ Kamen Rider Zeztz luôn chiếu vào lúc 7g30a, Code Khuya Cung An luôn chiếu vào lúc 00:00a... - Nếu biết nhân viên phụ trách, ngày, giờ phát sóng thì biết được tên chương trình
Ví dụ Biết được {Hung, 16/11 , 6:30p} thì biết được chương trình đó là Em Yeu Khoa Hoc - Nếu biết tên chương trình, ngày, giờ phát sóng thì biết được nhân viên phụ trách chương trình đó
Ví dụ Biết được {Buoi Trua Vui Ve, 13/11, 13:00p} thì biết được nhân viên phụ trách là Nga.
Các ràng buộc này là các ví dụ về phụ thuộc hàm và được phát biểu lại như sau:
- xác định
- xác định
- xác định
hay:
- phụ thuộc hàm vào
- phụ thuộc hàm vào
- phụ thuộc hàm vào
và được kí hiệu như sau:
1.2. Phụ thuộc hàm
1.2.1. Khái niệm
Cho là hai tập thuộc tính trên quan hệ . là 2 bộ bất kỳ trên . Ta nói xác định , kí hiệu , nếu và chỉ nếu thì
Ta nói xác định hay phụ thuộc hàm vào . ( là vế trái của phụ thuộc hàm, là vế phải của phụ thuộc hàm).
Ví dụ: cho quan hệ như sau:
| MSSV | TEN | MON | SODT | CHUYENNGANH | GIANGVIEN | DIEM |
|---|---|---|---|---|---|---|
| 245200 | Huy | CSDL | 0913157875 | HTTT | Thuy | 5 |
| 245206 | Hoang | CTRR | 0913154521 | CNPM | Lan | 4 |
| 201293 | Tinh | CSDL | 0166397547 | CNPM | Thuy | 3 |
| 211234 | Minh | NMLT | 012145475 | MangMT | Viet | 1 |
Một số tính chất sau:
- Với mỗi Tên, xác định được duy nhất một số điện thoại và chuyên ngành
- Với mỗi Môn học, có duy nhất một Giảng viên
- Với mỗi Tên, Môn học có duy nhất một điểm
Kí hiệu:
1.2.2. Phụ thuộc hàm hiển nhiên (Trivial Dependencies)
Nếu thì : Nếu bao hàm (tức là một thành phần của ) thì sẽ luôn xác định
Ví dụ: , thì . Hiển nhiên đúng vì biết MSSV + Tên thì tất nhiên biết Tên
1.2.3. Tập phụ thuộc hàm
Tập phụ thuộc hàm () là một tập hợp gồm nhiều phụ thuộc hàm của một lược đồ quan hệ . Nó mô tả các ràng buộc về mối quan hệ giữa các thuộc tính trong quan hệ đó. Ta có thể đánh số các phụ thuộc hàm của là .
Ký hiệu:
1.3. Luật dẫn Armstrong
1.3.1. Khái niệm
Gọi là tập các phụ thuộc hàm, ta nói phụ thuộc hàm được suy diễn logic từ , nếu một quan hệ đã thỏa mãn tất cả các phụ thuộc hàm của thì cũng thỏa mãn phụ thuộc hàm .
Kí hiệu:
1.3.2. Tính chất
Với mọi tập thuộc tính . Phụ thuộc hàm có các tính chất sau:
- F1. Tính phản xạ: Nếu thì
- F2. Tính tăng trưởng:
- F3. Tính bắc cầu:
- F4. Tính kết hợp: X
- F5. Tính phân rã: ,
- F6. Tính tựa bắc cầu:
Ví dụ: Cho . Chứng minh
Lời giải
(tính kết hợp) (F4)
(tính bắc cầu) (F3)
Ví dụ: Cho . Chứng minh
Lời giải
(thêm vào - Tính tăng trưởng) (F2)
(thêm vào - Tính tăng trưởng) (F2)
(Tính bắc cầu) (F3)
1.4. Bao đóng
1.4.1. Khái niệm
Bao đóng của tập phụ thuộc hàm: Bao đóng của tập phụ thuộc hàm , kí hiệu là , là tập tất cả các phụ thuộc hàm được suy ra từ . Nếu thì là họ đầy đủ của các phụ thuộc hàm
Bao đóng của tập thuộc tính: Bao đóng của tập thuộc tính đối với tập phụ thuộc hàm , kí hiệu là là tập tất cả các thuộc tính có thể suy dẫn từ nhờ tập bao đóng của các phụ thuộc hàm.
Ta sẽ chủ yếu quan tâm đến cách tìm bao đóng của một tập thuộc tính, sẽ được trình bày thông qua Thuật toán dưới đây.
1.4.2. Thuật toán tìm bao đóng của tập thuộc tính
Bài toán 1: Tìm bao đóng
Chúng ta sẽ cùng nghiên cứu thuật toán thông qua một bài toán minh họa:
Bài tập 1: Cho lược đồ quan hệ và tập phụ thuộc hàm
Hãy tìm bao đóng của (Kí hiệu: )
Bước 1:
Gọi bao đóng cần tìm là , đầu tiên chắc chắn luôn bằng tập thuộc tính mà đề bài yêu cầu chúng ta tìmBước 2: Lặp qua các phụ thuộc hàm của mà đề bài cho
Ta đang có: . Ở đây, tôi sẽ tạm gọi vế bên phải là , vế bên trái là để dễ dàng truyền đạt.
Giả sử ta đang xét một phụ thuộc hàm có dạng thì điều kiện để thêm tập thuộc tính vào vế trái của là tập thuộc tính phải xuất hiện ở vế bên trái của bao đóng cần tìm.
Hãy lần lượt xét các phụ thuộc hàm của đề bài cho theo thứ tự từ trái sang phải:
Xét
Vế trái của chúng ta hiện tại là , chưa xuất hiện nên không thể thêm vào bao đóng.Xét
Vế trái của chúng ta hiện tại là , chưa xuất hiện nên không thể thêm vào bao đóng.Xét
Vế trái của chúng ta hiện tại là , chưa xuất hiện nên không thể thêm vào bao đóng.Xét
Vế trái của chúng ta hiện tại là , chưa xuất hiện nên không thể thêm vào bao đóng.Xét
Lúc này, vế trái trong bao đóng hiện tại đã có đủ thuộc tính nên ta có thể thêm thuộc tính vào bao đóng. Lúc nàyBước 3. Lặp lại việc xét tập phụ thuộc hàm (lặp lại bước 2)
Việc lặp lại này sẽ kết thúc cho đến khi ta không thể thêm bất cứ thuộc tính nào vào bao đóng nữa.
Hiện tại:
Xét
Vế trái của chúng ta hiện tại đã có nên có thể thêm vào bao đóng.Xét
Vế trái của bao đóng đã có nên ta có thể thêm vào bao đóng.Xét
Vế trái của chúng ta chưa có nên không thể thêm vào bao đóng. vẫn giữ nguyên.Phụ thuộc hàm đã xét ở Bước 2 rồi nên ta không cần xét lại nữa.
Tiếp tục lặp lại việc xét các phụ thuộc hàm, bắt đầu lại từ , … . Bao đóng cuối cùng thu được là:
Lưu ý: Các thuộc tính không cần phải viết theo thứ tự, chỉ cần đủ số lượng là được.
Bài toán 2: Cho biết có là phụ thuộc hàm thành viên của không?
Bài tập 2: Cho lược đồ quan hệ và tập phụ thuộc hàm
a) Phụ thuộc hàm có là phụ thuộc hàm thành viên của không? Giải thích
Kiến thức: Cho tập thuộc tính , tập phụ thuộc hàm trên và một phụ thuộc hàm trên . Ta có:
Nghĩa là nếu ta tính ra được bao đóng của và kết luận được thuộc vào bao đóng đó, thì ta có thể kết luận là một phụ thuộc hàm thành viên của .
Bước 1: Tìm bao đóng của
- Xét
- Xét (Vế phải của bao đóng chưa xuất hiện nên không thể thêm vào bao đóng)
- Xét
- Xét (Vế phải của bao đóng chưa xuất hiện nên không thể thêm vào)
- Xét
Tiếp tục lặp lại việc xét các phụ thuộc hàm của . Cuối cùng, ta thu được bao đóng:
Bước 2: Xét điều kiện thành viên
Nếu như mà ta đã tính được ở trên thì ta có thể kết luận , hay đây là một phụ thuộc hàm thành viên của .
Tuy nhiên, ở ví dụ này ta có thấy:
2. Khóa
2.1. Khái niệm
Cho lược đồ quan hệ , là tập thuộc tính của quan hệ . Khi đó, được gọi là một khóa của nếu:
- Không tồn tại sao cho
2.2. Thuật toán tìm khóa
Ta sẽ xét lại Bài tập 2 ở Phần 1 để nghiên cứu thuật toán tìm khóa
Bài tập 2: Cho lược đồ quan hệ và tập phụ thuộc hàm
b) Tìm tất cả các khóa của lược đồ quan hệ trên. Giải thích?
Bước 1. Tìm tập nguồn và tập trung gian
Xét một phụ thuộc hàm: , ta sẽ quy ước là vế trái, là vế phải của phụ thuộc hàm.
Tập nguồn: Tập hợp các thuộc tính chỉ xuất hiện ở vế bên trái của các phụ thuộc hàm (Kí hiệu )
Tập trung gian: Tập hợp các thuộc tính xuất hiện ở cả vế bên trái và vế bên phải của phụ thuộc hàm (Kí hiệu )
Xét các phụ thuộc hàm . Các thuộc tính của tập trung gian là:
- : xuất hiện ở vế trái của , vế phải của
- : xuất hiện ở vế trái của , vế phải của
- : xuất hiện ở vế trái của , vế phải của
Bước 2. Tìm bao đóng của tập nguồn
Mẹo xét nhanh: Nếu bao đóng của nguồn chứa tất cả thuộc tính của quan hệ, hay thì tập nguồn chính là khóa.
Nếu như bao đóng của tập nguồn không chứa tất cả thuộc tính của quan hệ, ta tiếp tục thuật toán với các bước bên dưới.
Bước 3. Xác định tất cả tập con (khác rỗng) của tập trung gian
Gọi tập hợp con của tập trung gian là:
Bước 4. Xét các tổ hợp của tập nguồn để kết luận khóa
Lần lượt lấy tổ hợp của tập nguồn với từng phần tử con của tập hay để kết luận khóa.
Ta sẽ kẻ dạng bảng dưới đây để dễ dàng giải quyết bài toán:
Kết luận Giải thích:
- Cột : Nguyên cả tập nguồn
- Cột : Các phần tử trong tập (tập hợp các tập con khác rỗng của tập trung gian)
- Cột : Tính
- Cột : Tính bao đóng của ()
- Kết luận: Kết luận xem có phải là khóa của quan hệ hay không
Bây giờ xét bài toán trên. Ta hãy xét . Ta sẽ có một phần của bảng như sau:
Kết luận D B DB DB là một khóa của quan hệ Vì đã là một khóa của quan hệ nên ta sẽ bỏ đi tất cả các tập con của mà có chứa (Tập con đã xét ở trên). Lúc này, tập còn lại là:
M = {
B, G , E ,BG, GE ,BE,BGE} =Xét tập con tiếp theo với
Kết luận D B DB DB là một khóa của quan hệ D G DG DG không phải là khóa Vì không phải là khóa nên ta không bỏ đi các tập con của có chứa . Tập hiện tại còn cái phần tử:
Xét tập con tiếp theo với
Kết luận D B DB DB là một khóa của quan hệ D G DG DG không phải là khóa D E DE DE là một khóa của quan hệ Vì đã là một khóa của quan hệ nên ta sẽ bỏ đi tất cả các tập con của mà có chứa . Lúc này, tập còn lại là:
Kết luận: Khóa của quan hệ là và .
Chú ý:
- Phải xét theo thứ tự 1 thuộc tính, 2 thuộc tính, 3 thuộc tính… (Ví dụ: , sau đó mới đến , cuối cùng mới đến ),... không được xét ngược lại.
- Nếu một tập thuộc tính đã là khóa thì ta có thể bỏ đi các tập con chứa tập thuộc tính đó. (Ví dụ: là khóa thì ta có thể bỏ đi ; không được bỏ đi tập con chỉ chứa mỗi $$ hay chỉ chứa mỗi , ví dụ: )
2.3. Siêu khóa. Thuộc tính khóa
2.3.1. Siêu khóa
Tập thuộc tính được gọi là siêu khóa (superkey) nếu tồn tại một khóa của quan hệ sao cho: . Nghĩa là tập thuộc tính này có chứa khóa
Xét ở Bài toán 2, ta có (đã tính được ở 2.2), ta có thể nêu một số siêu khóa như sau:
Một khóa cũng được coi là một siêu khóa.
2.3.1. Thuộc tính khóa
Thuộc tính được gọi là thuộc tính khóa nếu: , với là một khóa bất kỳ của quan hệ . Ngược lại, được gọi là thuộc tính không khóa.
Xét ở ví dụ trên, với khóa thì thuộc tính khóa là . Khóa thì thuộc tính khóa là . Ngược lại, các thuộc tính là thuộc tính không khóa.
3. Các dạng chuẩn
Trong thực tế, một ứng dụng cụ thể được thiết kế thành nhiều lược đồ cơ sở dữ liệu khác nhau, và tất nhiên chất lượng thiết kế của các lược đồ CSDL này cũng khác nhau. Chất lượng thiết kế của một lược đồ CSDL có thể được đánh giá dựa trên nhiều tiêu chuẩn, trong đó có sự trùng lắp thông tin và chi phí kiểm tra các ràng buộc toàn vẹn là hai tiêu chuẩn quan trọng.
Sau đây, ta sẽ tìm hiểu một số tiêu chí để đánh giá độ tốt / xấu của một lược đồ quan hệ. Trước tiên, ta hãy tìm hiểu sơ lược về một số khái niệm liên quan.
3.1. Khái niệm về xác định dạng chuẩn
Trong chương trình, ta sẽ tìm hiểu qua 4 loại dạng chuẩn: Dạng chuẩn 1 🡪 Dạng chuẩn 2 🡪 Dạng chuẩn 3 🡪 Dạng chuẩn BC.
Một lược đồ muốn đạt được dạng chuẩn thì trước hết phải đạt được dạng chuẩn trước đó.
Ví dụ: Muốn kiểm tra lược đồ đạt dạng chuẩn 3 không, trước tiên ta phải chứng minh được lược đồ đó đã đạt được dạng chuẩn 2. Nhưng để đạt được dạng chuẩn 2 trước hết lược đồ đó phải đạt được dạng chuẩn 1. Giả sử ở dạng chuẩn 3, lược đồ không đạt thì dạng chuẩn cao nhất lược đồ có thể đạt được là dạng chuẩn 2.
Ta sẽ tiếp tục xét Bài toán 2 để minh họa:
Bài tập 2: Cho lược đồ quan hệ trong đó là tập thuộc tính và là tập phụ thuộc hàm
c) Hãy tìm dạng chuẩn cao nhất mà lược đồ có thể đạt được. Giải thích?
Chú ý: Với bài tập tìm dạng chuẩn, bắt buộc phải tìm khóa của lược đồ trước.
Sau đây ta sẽ đi qua tìm hiểu các dạng chuẩn
3.2. Dạng chuẩn 1
Lược đồ ở dạng chuẩn 1 nếu mọi thuộc tính đều mang giá trị nguyên tố
Giá trị nguyên tố là giá trị không phân nhỏ được nữa. Ngược lại, các thuộc tính đa trị (multi-valued), đa hợp (composite) không là nguyên tố.
Ví dụ 1: Thuộc tính DIACHI của một quan hệ:
DIACHI: Số 7, Nguyễn Bỉnh Khiêm, TDP, Phường Ninh Hiệp, Ninh Hòa, Khánh Hòa 🡪 (Số nhà, Đường, Phường, Thị xã, Tỉnh). Đây không là thuộc tính nguyên tố.
Ví dụ 2: Cho quan hệ DONHANG
| MAHD | MAKH | Tên hàng | Số lượng | ĐVT | SỐ TIỀN |
|---|---|---|---|---|---|
| HD01 | KH02 | Chuột gaming | 1 | Cái | 200.000 |
| HD02 | KH04 | Bàn phím cơ | 1 | Cái | 905.000 |
| HD03 | KH03 | RAM | 4 | Thanh | 1.600.000 |
CHITIETMUA không là nguyên tố nên không thỏa dạng chuẩn 1
Trong thực tế, dạng chuẩn 1 rất hiếm khi xảy ra nên khi làm bài, ta có thể mặc định lược đồ cho đã thỏa mãn dạng chuẩn 1.
3.3. Dạng chuẩn 2
Lược đồ thỏa dạng chuẩn 2 nếu:
- đạt dạng chuẩn 1
- Mọi thuộc tính không khóa của đều phụ thuộc đầy đủ vào khóa
Kiểm tra dạng chuẩn 2
Bước 1: Tìm bao đóng của tất cả thuộc tính khóa
Xét Bài toán 2, ta có thuộc tính khóa là Thuộc tính khóa: .
Bước 2: Xét tất cả các vế bên phải là , không có bất cứ thuộc tính không khóa nào xuất hiện. Vì vậy, lược đồ đạt dạng chuẩn 2.
Ngược lại, sau khi tính bao đóng, nếu xuất hiện một thuộc tính không khóa ở vế bên phải thì lược đồ sẽ không đạt dạng chuẩn 2.
3.4. Dạng chuẩn 3
Lược đồ thỏa dạng chuẩn 3 nếu:
- đạt dạng chuẩn 2
- Mọi thuộc tính không khóa của không phụ thuộc bắc cầu vào khóa chính của
Hoặc:
Lược đồ ở dạng chuẩn 3 nếu mọi phụ thuộc hàm , với đều có:
- là siêu khóa, hoặc
- là thuộc tính khóa
Kiểm tra dạng chuẩn 3
Bước 1: Tìm mọi khóa của
Xét lược đồ quan hệ trong Bài toán 2, các khóa là , .
Bước 2: Phân rã vế phải
Phân rã vế phải của mọi phụ thuộc hàm trong để tập trở thành tập phụ thuộc hàm có vế phải một thuộc tính.
Ta có:
Bước 3: Kiểm tra vế trái - vế phải
Xét tập phụ thuộc hàm đã phân rã ở Bước 2, nếu ta tìm được một phụ thuộc hàm mà không là siêu khóa, không là thuộc tính khóa thì lược đồ này KHÔNG ĐẠT dạng chuẩn 3.
Xét tập phụ thuộc hàm đã phân rã, ta có có vế trái (không phải siêu khóa), vế phải (không phải thuộc tính khóa). Lược đồ không đạt dạng chuẩn 3.
3.5. Dạng chuẩn BC (Boyce – Codd)
Lược đồ ở dạng chuẩn BC nếu mọi phụ thuộc hàm , với đều có là siêu khóa.
Kiểm tra dạng chuẩn BC
Bước 1: Tìm mọi khóa của
Thực hiện thuật toán tìm khóa của một lược đồ quan hệ đã được trình bày ở Phần 2.2
Bước 2: Phân rã vế phải
Thực hiện tương tự việc Kiểm tra dạng chuẩn 3. Phân rã vế phải của mọi phụ thuộc hàm trong để tập trở thành tập phụ thuộc hàm có vế phải một thuộc tính.
Bước 3. Kiểm tra siêu khóa ở vế trái
Nếu mọi phụ thuộc hàm đã phân rã ra đều thỏa điều kiện là siêu khóa (vế trái chứa một khóa), thì lược đồ đạt dạng chuẩn BC, ngược lại không đạt dạng chuẩn BC.