Chương 6: Phụ Thuộc Hàm và Dạng Chuẩn


1. Các Vấn Đề Gặp Phải Khi Tổ Chức CSDL

Khi thiết kế CSDL không tốt, ta gặp phải vấn đề dư thừa dữ liệu, dẫn đến ba loại bất thường:

Ví dụ minh họa

Xét quan hệ SINHVIEN_DIEMTHI(MaSV, MaMH, HoTen, TenMH, Diem):

MaSVMaMHHoTenTenMHDiem
SV01CSDLNguyễn Tuyết AnCơ sở dữ liệu10
SV01NMLTNguyễn Tuyết AnNhập môn lập trình9.5
SV01HDTNguyễn Tuyết AnHướng đối tượng8.5
SV02CSDLTrần Ngọc MinhCơ sở dữ liệu8
SV02CTRRTrần Ngọc MinhCấu trúc rời rạc5
SV03NMLTPhạm Tiến DũngNhập môn lập trình7
SV03CTRRPhạm Tiến DũngCấu trúc rời rạc7.5

Vấn đề: HoTen của SV01 lặp lại 3 lần, TenMH của CSDL lặp lại 2 lần → dư thừa dữ liệu.


Ba loại bất thường

Nếu đổi tên SV01 từ “Nguyễn Tuyết An” → “Nguyễn Tuyết Anh” nhưng chỉ sửa 1 dòng (dòng NMLT), các dòng còn lại vẫn là “Nguyễn Tuyết An” → mâu thuẫn dữ liệu.
Muốn thêm sinh viên SV04 (Phan Minh Đức) nhưng chưa đăng ký môn nào → phải để MaMH = NULLvi phạm ràng buộc khóa chính, không thể thêm.
Nếu SV03 chỉ học 2 môn (NMLT, CTRR), xóa cả 2 dòng → mất luôn thông tin về SV03 (họ tên, ngày sinh,…).

Giải pháp: Tách quan hệ

Tách thành 3 quan hệ riêng biệt:

SINHVIEN(MaSV, HoTen)
MONHOC(MaMH, TenMH)
DIEMTHI(MaSV, MaMH, Diem)

→ Loại bỏ dư thừa, tránh cả 3 loại bất thường trên.


2. Phụ Thuộc Hàm (Functional Dependency)

2.1. Khái niệm cơ bản

  • X gọi là vế trái của phụ thuộc hàm (PTH).
  • Y gọi là vế phải của PTH.
  • X xác định Y, hoặc Y phụ thuộc (hàm) vào X.
  • Tập tất cả PTH trên quan hệ R ký hiệu là F.

Ví dụ thực tế:

MaNV → TenNV          -- Mã NV xác định tên NV
MaNV, MaDA → ThoiGian -- Cặp (MaNV, MaDA) xác định thời gian làm việc

2.2. Xác định PTH từ dữ liệu — Ví dụ

Xét CTHD(SoHD, MaSP, SL, DonGia, ThanhTien):

SoHDMaSPSLDonGiaThanhTien
HD01SP0152.00010.000
HD01SP03210.00020.000
HD02SP0152.00010.000
HD02SP0423.0006.000
HD03SP02410.00040.000
HD03SP03412.50050.000
HD03SP0482.50020.000

2.3. Hệ Luật Dẫn Armstrong

Ký hiệu: $F \models X \rightarrow Y$ — “X→Y được suy ra từ F”.

Ba luật cơ bản (Armstrong Axioms)

#TênPhát biểuVí dụ
F1Phản xạ (Reflexivity)Nếu $Y \subseteq X$ thì $X \rightarrow Y${MaSV, TenSV} → TenSV
F2Tăng trưởng (Augmentation)Nếu $X \rightarrow Y$ thì $XZ \rightarrow YZ$Từ MaSV→TenSV suy ra MaSV,NgaySinh → TenSV,NgaySinh
F3Bắc cầu (Transitivity)Nếu $X \rightarrow Y$ và $Y \rightarrow Z$ thì $X \rightarrow Z$Từ MaSV→MaLop, MaLop→TenLop suy ra MaSV→TenLop

Ba luật bổ sung (dẫn xuất từ Armstrong)

#TênPhát biểuVí dụ
F4Kết hợp (Union)Nếu $X \rightarrow Y$ và $X \rightarrow Z$ thì $X \rightarrow YZ$MaSV→TenSV + MaSV→GioiTinhMaSV→TenSV,GioiTinh
F5Phân rã (Decomposition)Nếu $X \rightarrow YZ$ thì $X \rightarrow Y$ và $X \rightarrow Z$MaSV→TenSV,GioiTinhMaSV→TenSVMaSV→GioiTinh
F6Tựa bắc cầu (Pseudotransitivity)Nếu $X \rightarrow Y$ và $YZ \rightarrow W$ thì $XZ \rightarrow W$MaSV→MaLop, MaLop,MaMon→MaGVMaSV,MaMon→MaGV

Bài tập chứng minh


2.4. Bao Đóng (Closure)

Bao đóng của tập PTH F

Bao đóng của tập thuộc tính X

Thuật toán tính $X^+_F$

Input:  (R, F), X ⊆ R*
Output: X⁺_F

Bước 1: Khởi tạo X₀ = X
Bước 2: Lặp:
    X_{i+1} = X_i ∪ Z, với mọi Y→Z ∈ F mà Y ⊆ X_i
    (Loại Y→Z khỏi F sau khi dùng)
    Dừng khi X_{i+1} = X_i  hoặc  X_i = R*
Bước 3: Kết luận X⁺_F = X_i cuối cùng

Bài toán thành viên


2.5. Phủ Tối Thiểu (Minimal Cover)

Các khái niệm liên quan

Hai tập PTH tương đương: F ≡ G nếu $F^+ = G^+$ (suy ra được lẫn nhau).

PTH có vế trái dư thừa: $X \rightarrow Y$ có thuộc tính $A \in X$ dư thừa nếu bỏ A đi mà PTH vẫn đúng trong F, tức là $(X - A) \rightarrow Y \in (F - {X\rightarrow Y})^+$.

PTH dư thừa: $X \rightarrow Y \in F$ là dư thừa nếu $X \rightarrow Y \in (F - {X\rightarrow Y})^+$.

Thuật toán tìm Phủ Tối Thiểu

Bước 1: Phân rã vế phải
    Thay mỗi X→Y₁Y₂...Yₙ thành X→Y₁, X→Y₂, ..., X→Yₙ

Bước 2: Loại bỏ thuộc tính vế trái dư thừa
    Với mỗi X→Y có |X| ≥ 2:
        Với mỗi A ∈ X:
            Tính (X-A)⁺ trong F - {X→Y}
            Nếu Y ∈ (X-A)⁺ → A dư thừa, thay X→Y bằng (X-A)→Y

Bước 3: Loại bỏ PTH dư thừa
    Với mỗi X→Y ∈ F:
        Tính X⁺ trong F - {X→Y}
        Nếu Y ∈ X⁺ → X→Y dư thừa, loại khỏi F

2.6. Khóa (Key)

  • Thuộc tính khóa: thuộc tính xuất hiện trong ít nhất một khóa.
  • Thuộc tính không khóa: không xuất hiện trong bất kỳ khóa nào.
  • Siêu khóa: tập K’’ mà $K \subseteq K’’$ với K là khóa (siêu khóa không cần tối tiểu).

Thuật toán tìm tất cả Khóa

Bước 1: Xác định tập NGUỒN (N)
    N = {thuộc tính chỉ xuất hiện ở VẾ TRÁI của các PTH}
    Tính N⁺:
    - Nếu N⁺ = R* → Khóa duy nhất là N. DỪNG.
    - Ngược lại → Bước 2.

Bước 2: Xác định tập TRUNG GIAN (TG)
    TG = {thuộc tính xuất hiện ở CẢ vế trái lẫn vế phải}
    Liệt kê tất cả tập con khác rỗng Xᵢ ⊆ TG.

Bước 3: Kiểm tra từng tập
    ∀Xᵢ ⊆ TG:
        Nếu (N ∪ Xᵢ)⁺ = R* 
        → Sᵢ = N ∪ Xᵢ là khóa ứng viên
        → Loại bỏ mọi Xⱼ ⊋ Xᵢ (không cần kiểm tra nữa)

Bước 4: Tập khóa K = {Sᵢ}

3. Dạng Chuẩn (Normal Forms)

graph LR DC1["1NF\n(Dạng chuẩn 1)"] --> DC2["2NF\n(Dạng chuẩn 2)"] DC2 --> DC3["3NF\n(Dạng chuẩn 3)"] DC3 --> DCBC["BCNF\n(Boyce-Codd)"]

Mỗi dạng chuẩn cao hơn bao hàm dạng chuẩn thấp hơn: BCNF ⊂ 3NF ⊂ 2NF ⊂ 1NF.


3.1. Dạng Chuẩn 1 (1NF)

Các loại thuộc tính vi phạm 1NF:

  • Thuộc tính đa trị (multi-valued): một ô chứa nhiều giá trị (VD: danh sách môn học)
  • Thuộc tính tổ hợp (composite): một ô gồm nhiều thành phần (VD: địa chỉ = số nhà + đường + phường + quận)

Ví dụ vi phạm 1NF:

DiaChi: "Số 175 Đường 3/2 Phường 10 Quận 5"
→ Không nguyên tố vì có thể tách thành: SoNha, TenDuong, Phuong, Quan

Quan hệ THAMGIA(MaNV, HoTen, NgSinh, MaDA, TenDA, ThoiGian) với một ô MaDA chứa nhiều mã dự án → vi phạm 1NF.

Sau khi chuẩn hóa 1NF (mỗi dòng = 1 dự án), dữ liệu hết đa trị nhưng vẫn trùng lặp HoTen, NgSinh → cần lên 2NF.


3.2. Dạng Chuẩn 2 (2NF)

Thuật toán kiểm tra 2NF

1. Tìm tất cả khóa của R
2. Với mỗi khóa K:
   - Liệt kê tất cả tập con thực sự S ⊂ K (S ≠ K)
   - Tính S⁺
   - Nếu S⁺ chứa thuộc tính KHÔNG KHÓA → R KHÔNG đạt 2NF
3. Nếu không tìm thấy vi phạm → R đạt 2NF

3.3. Dạng Chuẩn 3 (3NF)

Phụ thuộc bắc cầu: Thuộc tính $A$ phụ thuộc bắc cầu vào X nếu tồn tại Y sao cho:

  1. $X \rightarrow Y \in F^+$ và $Y \rightarrow A \in F^+$
  2. $Y \not\rightarrow X \in F^+$   (Y không xác định ngược lại X)
  3. $A \notin (X \cup Y)$

Thuật toán kiểm tra 3NF

1. Tìm tất cả khóa → xác định thuộc tính khóa / không khóa
2. Phân rã vế phải: X→Y₁Y₂ thành X→Y₁, X→Y₂,...
3. Với mỗi X→Y (Y∉X):
   - Nếu X là siêu khóa → OK ✅
   - Nếu Y là thuộc tính khóa → OK ✅
   - Nếu cả hai đều không → R KHÔNG đạt 3NF ❌

3.4. Dạng Chuẩn Boyce-Codd (BCNF)

Thuật toán kiểm tra BCNF

1. Tìm tất cả khóa của R
2. Phân rã vế phải thành PTH 1 thuộc tính
3. Với mỗi X→Y (Y∉X):
   - Nếu X là siêu khóa → OK ✅
   - Nếu X không phải siêu khóa → R KHÔNG đạt BCNF ❌

3.5. Dạng Chuẩn của Lược Đồ Quan Hệ và Lược Đồ CSDL

Thuật toán xác định dạng chuẩn của R

1. Tìm mọi khóa của R
2. Kiểm tra BCNF:
   - Đúng → R đạt BCNF. DỪNG.
   - Sai → Bước 3
3. Kiểm tra 3NF:
   - Đúng → R đạt 3NF. DỪNG.
   - Sai → Bước 4
4. Kiểm tra 2NF:
   - Đúng → R đạt 2NF. DỪNG.
   - Sai → R chỉ đạt 1NF (hoặc thấp hơn).

Tổng Kết

graph TD A["Dư thừa dữ liệu\n→ 3 bất thường: Sửa/Thêm/Xóa"] --> B["Phụ thuộc hàm X→Y\n(X xác định duy nhất Y)"] B --> C["Hệ luật Armstrong\nF1 Phản xạ · F2 Tăng trưởng · F3 Bắc cầu\nF4 Kết hợp · F5 Phân rã · F6 Tựa bắc cầu"] C --> D["Bao đóng X⁺\n→ Bài toán thành viên"] D --> E["Phủ tối thiểu\n(tối giản F)"] E --> F["Khóa K\n(K⁺=R*, tối tiểu)"] F --> G["Dạng chuẩn\n1NF → 2NF → 3NF → BCNF"]
Dạng chuẩnYêu cầu thêm so với cấp trước
1NFMọi thuộc tính có giá trị nguyên tố
2NFKhông có phụ thuộc bộ phận vào khóa
3NFKhông có phụ thuộc bắc cầu vào khóa
BCNFMọi vế trái của PTH phải là siêu khóa