Phụ thuộc hàm có ứng dụng trong việc giải quyết các bài toán như: tìm khoá, tìm phủ tối thiểu, xác định dạng chuẩn… Định Nghĩa Phụ Thuộc Hàm: Cho RA1,…,An là một sơ đồ quan hệ với tập t
Trang 1ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA HỆ THỐNG THÔNG TIN
ĐẶC TẢ THUẬT TOÁN MÔN THIẾT KẾ CƠ SỞ DỮ LIỆU
Sinh viên thực hiện :
Trang 2CHƯƠNG 1: TỔNG QUAN
1 Đặt vấn đề:
Cơ sở dữ liệu quan hệ được xây dựng theo lý thuyết do E.F.Codd giới thiệu năm
1970 Mô hình quan hệ có nhiều ưu điểm hơn hẳn các mô hình trước nó và từ năm
1980 đã trở thành mô hình được dùng rộng rãi để phát triển hệ quản trị CSDL
Cùng với sự phát triển của mô hình dữ liệu quan hệ, có nhiều vấn đề lý thuyết và thực nghiệm nảy sinh và được giải quyết Khi thiết kế CSDL quan hệ ta thường đứng trước vấn đề lựa chọn giữa các lược đồ quan hệ: lược đồ nào tốt hơn? Tại sao? …
Có thể nói tổng quát một lược đồ quan hệ có cấu trúc tốt là lược đồ không chứa đựng các vấn đề liệt kê sau đây:
a Dư thừa dữ liệu
Là sự trùng lặp thông tin trong CSDL
Ví dụ: Xét lược đồ quan hệ NHACC(Ten_NCC, Hang, DonGia, Diachi_NCC)
Nếu một nhà cung cấp cung cấp nhiều mặt hàng thì địa chỉ nhà cung cấp phải lặp lại nhiều lần kéo theo dư thừa dữ liệu
Ngoài việc gây lãng phí dung lượng lưu trữ, sự dư thừa dữ liệu có thể gây ra những hậu quả nghiêm trọng đối với dữ liệu khi người dùng cập nhật dữ liệu làm cho dữ liệu không tương thích, thiếu nhất quán
Ví dụ: Xét lại lược đồ NHACC trên Ta có thể sửa địa chỉ một nhà cung cấp tại một bộ nào đó mà không sửa ở một bộ khác gây ra địa chỉ không nhất quán của cùng một nhà cung cấp
b Dị thường do thêm dữ liệu
Không thể chèn bộ mới vào quan hệ nếu không có đầy đủ dữ liệu
Ví dụ: Ta không thể ghi nhận địa chỉ một nhà cung cấp nếu nhà cung cấp đó không cung cấp mặt hàng nào cả vì Ten_NCC, Hang tạo thành một khoá cho quan hệ
c Dị thường do xóa dữ liệu
Trang 3Ngược lại với vấn đề c, khi ta xoá hết các mặt hàng do một hãng cung cấp, ta không thể theo dõi được địa chỉ của hãng đó
Trong ví dụ trên, vấn đề này sẽ không còn nữa khi ta thay quan hệ NHACC bằng hai quan hệ:
NCC_ĐC(TÊN_NCC, ĐC_NCC) NCC_HG(TÊN_NCC, TÊN_HG, GIA)
Cách giải quyết các vấn đề trên khi thiết kế lược đồ quan hệ là xây dựng lược đồ đạt các dạng chuẩn
2 Cơ sở kiến thức:
a Phụ thuộc hàm:
Phụ thuộc hàm (functional dependancy) là một công cụ dùng để biểu diễn một cách hình thức các ràng buộc toàn vẹn Phương pháp biểu diễn này có rất nhiều ưu điểm, và đây là một công cực kỳ quan trọng, gắn chặt với lý thuyết thiết kế cơ sở dữ liệu Phụ thuộc hàm có ứng dụng trong việc giải quyết các bài toán như: tìm khoá, tìm phủ tối thiểu, xác định dạng
chuẩn…
Định Nghĩa Phụ Thuộc Hàm:
Cho R(A1,…,An) là một sơ đồ quan hệ với tập thuộc tính U={A1,…,An} X và Y là tập con của U Xét một quan hệ cụ thể r nao đó Ta nói X Y (đọc là: X xác định hàm Y hoặc Y phụ thuộc hàm vào X) nếu với mỗi cặp bộ u, v của r thỏa:
u[X] = v[X] u[Y] = v[Y]
Để chứng minh và suy ra các phụ thuộc hàm khác từ các phụ thuộc hàm đã có ta dùng hệ tiên đề Armstrong:
Gọi R(U) là lược đồ quan hệ với U = {A1,…,An} là tập các thuộc tính X, Y, Z,
W U Hệ tiên đề Armstrong bao gồm:
F1) Tính phản xạ:
Y X X Y
Trang 4F2) Tính tăng trưởng:
X Y XZ YZ F3) Tính bắc cầu:
X Y, Y Z X Z
b Bao đóng:
Bao đóng (closure) của tập phụ thuộc hàm F (ký hiệu là F + ) là tập hợp tất cả các
phụ thuộc hàm có thể suy ra từ F dựa vào các tiên đề Armstrong Tức nó phải thoả hai tính chất sau:
i) F+ F
ii) Khi áp dụng các hệ tiên đề Armstrong cho F+ ta không thu được phụ thuộc
hàm nào nằm ngoài F+
Bao Đóng Của Tập Thuộc Tính : Cho tập phụ thuộc hàm F trên tập thuộc tính U và
X U Bao đóng của tập thuộc tính X (đối với F), ký hiệu X+, là tập sau:
X+ = {A | X A F+}
c Bài toán thành viên:
Qua phần trên ta nhận thấy X+ được định nghĩa thông qua F+ Vấn đề nảy sinh khi nghiên cứu lý thuyết CSDL là: Cho trước tập các phụ thuộc hàm F và một phụ thuộc hàm f, bài toán kiểm tra có hay không f ∈ F+
gọi là bài toán thành viên
d Siêu khóa, khóa:
Cho quan hệ R(U, F), với U là tập thuộc tính, F là tập phụ thuộc hàm Cho K ⊆ U Định nghĩa Siêu Khoá Của Quan Hệ :
K là một siêu khoá của R nếu thoả điều kiện sau:
K xác định hàm mọi thuộc tính trong U Tức là K+ = U
Định nghĩa Khoá Của Quan Hệ :
Trang 5K là một khoá của R nếu thỏa:
K là siêu khóa và không có siêu khóa nào nhỏ hơn K Tức là K+ = U và
H⊂K ⇒ H+ ≠ U
Một lược đồ quan hệ có thể có nhiều siêu khoá, nhiều khoá
e Phủ tối thiểu:
Tập phụ thuộc hàm tối thiểu là tập phụ thuộc hàm thoả mãn các điều kiện sau:
1) Vế phải của mỗi phụ thuộc hàm trong F chỉ có 1 thuộc tính
2) Mọi phụ thuộc hàm X A F đều không dư thừa, tức là tập phụ thuộc hàm
có từ F bằng sự loại bỏ phụ thuộc hàm X A: F \ {X A} không tương đương với F
3) Với mỗi phụ thuộc hàm X A F, mọi thuộc tính B X đều không dư thừa, tức là tập phụ thuộc hàm có từ F bằng việc thay phụ thuộc hàm X A bởi phụ thuộc hàm (X \{B}) A : (F \ {X A}) {X \ {B}) A} không tương đương với F
Tập phụ thuộc hàm tương đương của F:
Tập phụ thuộc hàm G được gọi là tương đương với F nếu và chỉ nếu F+ = G+
Ký hiệu: F ≡ G Phủ tối thiểu của F:
Là tập phụ thuộc hàm tối thiểu và tương đương với F
Ký hiệu : PTT(F)
f Các dạng chuẩn:
Như đã nói ở trên, một lược đồ quan hệ có thể bị dư thừa dữ liệu, dị thường do thêm,
dị thường do xóa Những vấn đề trên đã được giải quyết qua việc xây dựng các dạng chuẩn
Xét lược đồ quan hệ R(U, F), với U là tập thuộc tính, F là tập phụ thuộc hàm
Trang 6i) Dạng chuẩn 1: R được xem là đạt dạng chuẩn 1 nếu mọi thuộc tính của R đều
khác rỗng, phụ thuộc hàm vào khoá và có miền trị nguyên tố (tức là không đa hợp và đa trị)
ii) Dạng chuẩn 2: R được xem là đạt dạng chuẩn 2 nếu nó đạt dạng chuẩn 1 và
mọi thuộc tính không khóa phải phụ thuộc đầy đủ vào khóa
iii) Dạng chuẩn 3: R được xem là đạt dạng chuẩn 3 nếu nó đạt dạng chuẩn 2 và
mọi thuộc tính không khóa đều không phụ thuộc bắc cầu vào khóa
Một cách định nghĩa khác : R được xem là đạt dạng chuẩn 3 nếu mọi phụ thuộc hàm không hiển nhiên trong F đều có vế trái chứa khóa hay vế phải nằm trong khóa
iv) Dạng chuẩn B – C : R được xem là đạt dạng chuẩn B – C nếu mọi phụ thuộc
hàm không hiển nhiên trong F đều có vế trái chứa khóa
3 Yêu cầu cho đề tài:
Đề tài phải trình bày rõ ràng các thuật toán sau và các thuật toán bổ trợ:
o Thuật toán tìm Bao đóng
o Thuật toán kiểm tra Phụ thuộc hàm thành viên
o Thuật toán tìm Khóa
o Thuật toán tìm Phủ tối thiểu
o Thuật toán xác định Dạng chuẩn
Cài đặt thử nghiệm các thuật toán trên trong phần mềm có giao diện đồ họa, nhập liệu trực tiếp hay từ file dữ liệu nhập
Trang 7CHƯƠNG 2: CHI TIẾT CÁC THUẬT TOÁN
1 Thuật toán tìm Bao đóng cho tập thuộc tính:
Cho lược đồ quan hệ R(U, F), tập thuộc tính U, tập phụ thuộc hàm F Tìm X+F?
Trang 8Ta có thể xây dựng thuật toán với độ phức tạp tuyến tính, sử dụng LIST
2 Thuật toán kiểm tra phụ thuộc hàm thành viên:
Cho lược đồ quan hệ R(U, F), tập thuộc tính U, tập phụ thuộc hàm F Cho phụ thuộc hàm f: X->Y Kiểm tra xem f có thuộc F+ không?
a Ý tưởng:
- X->Y F+ X+F Y
b Mô hình hóa:
Input: Phụ thuộc hàm cần kiểm tra f: X→Y, Tập phụ thuộc hàm F
Output: true nếu f là thành viên của F+, false nếu ngược lại
KiemTraPTHThanhVien(X, Y, F)
{
X+ = TimBaoDong(X, F)
Trang 9là cốt lõi của thuật toán này
3 Thuật toán tìm khóa:
Cho lược đồ quan hệ R(U, F), tập thuộc tính U, tập phụ thuộc hàm F Tìm tất cả các khóa của R?
a Ý tưởng: (Tìm khóa Vét cạn)
- Tìm tất cả các siêu khóa :
o Liệt kê tất cả các tập con của U
o Tìm bao đóng của các tập con đó
o Nếu Bao đóng = U thì tập con đó là siêu khóa
- So sánh các siêu khóa, loại bỏ cái lớn hơn đi được các khóa
Trang 10CacSieuKhoa = CacSieuKhoa {TapCon}
}
'loại bỏ các siêu khóa không nhỏ hơn
for each SieuKhoa1 in CacSieuKhoa
for each SieuKhoa2 in CacSieuKhoa {
if SieuKhoa2 SieuKhoa1 then
CacSieuKhoa = CacSieuKhoa \ SieuKhoa1 break;
}
các siêu khóa không nhỏ hơn đi
}
c Độ phức tạp, nhận xét, cải tiến:
Thuật toán trên có độ phức tạp tính toán O(2nn2) với n là số thuộc tính của lược đồ quan hệ R
Bảo đảm tìm được tất cả các Siêu khóa và các Khóa
Khi số thuộc tính trong U là lớn thì việc duyệt qua tất cả các tập con là không khả thi Nên ta đưa ra thuật toán tìm khóa bằng đồ thị sau để giới hạn số tập con sẽ xét
Thuật toán này chỉ để tham khảo, chương trình của nhóm không sử dụng thuật toán này
d Ý tưởng: (Tìm khóa bằng đồ thị)
- Dựa trên biểu diễn đồ thị của R: Gốc là thuộc tính chỉ nằm bên vế trái, Cô lập là thuộc tính không ở trong phụ thuộc hàm nào, Trung gian là thuộc tính nằm ở cả hai vế, Lá là thuộc tính chỉ nằm bên vế phải
- Các thuộc tính ở gốc và cô lập chắc chắn nằm trong khóa
- Các thuộc tính trung gian có thể ở trong khóa hoặc không
- Các thuộc tính ở lá chắc chắn không ở trong khóa
e Mô hình hóa:
Trang 11 Input: Tập thuộc tính U, Tập phụ thuộc hàm F
Output: Tập các khóa K
TimKhoaDoThi(U, F)
{
for each (pth P->Q) in F {
VT = VT P
VP = VP Q
} Goc = VT \ VP 'chi nam o ve trai
TrungGian = VT \ (VT \ VP) 'Nam o ca hai ve
If TimBaoDong(SKK, F) = U Then
CacSieuKhoa = CacSieuKhoa {SKK}
End If
} 'loại bỏ các siêu khóa không nhỏ hơn
for each SieuKhoa1 in CacSieuKhoa
for each SieuKhoa2 in CacSieuKhoa {
if SieuKhoa2 SieuKhoa1 then
CacSieuKhoa = CacSieuKhoa \ SieuKhoa1 break;
}
Return CacSieuKhoa ' Tập các khóa cuối cùng sau khi
đã bỏ các siêu khóa không nhỏ hơn đi
}
f Độ phức tạp, nhận xét, cải tiến:
Thuật toán trên có độ phức tạp tính toán tối đa O(2nn2) với n là số thuộc tính của lược đồ quan hệ R Nhưng thường đạt thấp hơn do giới hạn số tập con cần duyệt không phải 2n nữa
Trang 12Bảo đảm tìm được tất cả các Khóa Nhưng không bảo đảm tìm được tất cả các siêu khóa
4 Thuật toán tìm Phủ tối tiểu cho tập phụ thuộc hàm:
Cho lược đồ quan hệ R(U, F), tập thuộc tính U, tập phụ thuộc hàm F Tìm PTT(F)?
d Ý tưởng:
- Tách vế phải ra thành các thuộc tính đơn
- Thay thế các phụ thuộc hàm không đầy đủ
- Loại bỏ các phụ thuộc hàm dư thừa
Trang 13for each Pi in P1P2…Pk ->Q {
if F=(F-{P1…Pi…Pk-> Q}){P1…Pi-1Pi+1 …Pk->Q}then
P=P\Pi
} }
}
' - LoaiPTHDuThua(F)
5 Thuật toán xác định Dạng Chuẩn:
Cho lược đồ quan hệ R(U, F), tập thuộc tính U, tập phụ thuộc hàm F Xác định dạng chuẩn?
a Ý tưởng:
- Tìm tất cả các khóa
- Kiểm tra dạng chuẩn BC
- Kiểm tra dạng chuẩn 3
- Kiểm tra dạng chuẩn 2
- Kiểm tra dạng chuẩn 1
b Mô hình hóa:
Trang 14 Input: Tập thuộc tính U, Tập phụ thuộc hàm F,
DCBC(TapKhoa, F’)
}
Trang 15return true
}
' - DC3(TapKhoa, F’)
{
for each (pth P->Q) in F'
for each K in TapKhoa
if (P K) AND (P <> K) then return false
Trang 16for each K in TapKhoa
for each TC in TapCon
Trang 17U gồm n phần tử TapCon gồm 2^n-1 phần tử
TapCon = U For i = 0 to 2^n -1 For j = last(TapCon (i)) to n-1
TapCon.Add(TapCon (i) + U (j)) Next
List được dùng làm cấu trúc lưu trữ chính vì đây là cấu trúc động, sử dụng tối ưu cho
bộ nhớ, và có các hàm cần thiết hỗ trợ như : Add, Addrange, index, RemoveAt …
Tập thuộc tính U: Dim str_U As List(Of String)
Trang 18Mục đích: Mỗi thuộc tính là 1 string riêng biệt, có thể có khoảng trắng ở giữa
Tập phụ thuộc hàm : Dim lst_F As List(Of F)
Tập con (Tập hợp gồm nhiều tập thuộc tính):
Dim lst_Tap_Con As List(Of List(Of String))
Tập khóa (Tập hợp gồm nhiều tập khóa)
Dim lst_Khoa As List(Of List(Of String))
II Các thuật toán
a Tìm bao đóng
Public Function XPlusF(ByVal X As List(Of String), ByVal F As
List(Of F)) As List(Of String)
Dim str_old As New List(Of String)
Dim str_kq As New List(Of String)
Dim flag As Boolean
Dim count As Integer = F.Count - 1
For i As Integer = 0 To X.Count - 1
Trang 19For dem2 As Integer = 0 To F(dem).Left.Count -
Private Function Tim_Khoa(ByVal lst_U As List(Of String),
ByVal lst_F As List(Of F)) As List(Of List(Of String))
Dim lst_Goc As New List(Of String) 'Các thuộc tính gốc (1)
Dim lst_TG As New List(Of String) ' Các thuộc tính trung gian (3)
Dim lst_R As New List(Of String) ' Các thuộc tính cô lập ( rời) (4)
Dim lst_key As New List(Of String) ' Kết quả
Dim lst_kq As New List(Of List(Of String))
Dim int_kt As Integer
'Thiết lập tập gốc, trung gian, rời rạc
For i As Integer = 0 To lst_U.Count - 1
Trang 20If XPlusF(lst_key, lst_F).Count = lst_U.Count Then
'Kiểm tra xem tập Gốc giao Rời có phải là khóa duy nhất không Return lst_kq
If XPlusF(lst_key_tmp, lst_F).Count =
lst_U.Count Then
If lst_kq.Count = 0 Then
lst_kq.Add(lst_key_tmp)
Else 'Không add các siêu khóa
For j As Integer = 0 To lst_kq.Count -
Trang 21'Chuyển về dạng vế phải 1 thuộc tính
Dim lst_tmp As New List(Of String)
Dim lst_F_tmp As New List(Of F)
'Ta kiểm tra điều kiện không đầy đủ trước, điều kiện
dư thừa sau
'Kiểm tra và loại bỏ thuộc tính không đầy đủ
Trang 22Private Function KT_Dang_Chuan_2(ByVal lst_F As List(Of
F), ByVal lst_U As List(Of String)) As Integer
Dim lst_Khoa As New List(Of List(Of String))
lst_Khoa = Tim_Khoa(lst_U, lst_F)
lst_F = Tim_Phu_TT(lst_F)
Dim bool_in As Integer
For i As Integer = 0 To lst_F.Count - 1
For j As Integer = 0 To lst_Khoa.Count - 1
Private Function KT_Dang_Chuan_3(ByVal lst_F As List(Of
F), ByVal lst_U As List(Of String)) As Integer
Dim lst_Khoa As New List(Of List(Of String))
lst_Khoa = Tim_Khoa(lst_U, lst_F)
Dim bool_test As Integer
lst_F = Tim_Phu_TT(lst_F)
For i As Integer = 0 To lst_F.Count - 1
bool_test = 0 ' Vế trái là siêu khóa
Trang 23For j As Integer = 0 To lst_Khoa.Count - 1
If list_in(lst_Khoa(j), lst_F(i).Left) Then
Private Function KT_Dang_Chuan_BC(ByVal lst_F As List(Of
F), ByVal lst_U As List(Of String)) As Integer
Dim lst_Khoa As New List(Of List(Of String))
' Vế trái là siêu khóa
For j As Integer = 0 To lst_Khoa.Count - 1
If list_in(lst_Khoa(j), lst_F(i).Left) Then
Trang 25Ở trên chúng ta đã tìm hiểu các kiến thức cơ bản về mô hình cơ sở dữ liệu quan hệ, các thuật toán nền tảng thao tác trên các thành phần của một lược đồ cơ sở dữ liệu quan hệ Các thuật toán trên chủ yếu tập trung vào phần thứ nhất của lý thuyết thiết kế cơ sở dữ liệu quan hệ là xác định xem một lược đồ quan hệ có tốt không Có tránh được các vấn đề nảy sinh về dư thừa dữ liệu, bất thường khi thêm, xóa…
Tuy nhiên còn một phần vô cùng quan trọng của lý thuyết thiết kế cơ sở dữ liệu là xây dựng các dạng chuẩn cao bằng cách phân rã các lược đồ quan hệ đã có khi chúng không đạt dạng chuẩn cao
Chúng ta cũng nên lưu ý một nguyên tắc là được cái này thì sẽ mất cái khác Khi lược
đồ đạt dạng chuẩn càng cao thì sự dư thừa dữ liệu sẽ càng giảm xuống nhưng công việc xử lý
để lấy dữ liệu ra lại nhiều hơn Lược đồ đạt dạng chuẩn BC sẽ không có dữ liệu dư thừa Nhưng khi đó dữ liệu sẽ bị phân tán ra nhiều quan hệ, việc lấy dữ liệu sẽ phải kết nhiều quan
hệ và chọn rồi chiếu Nếu đạt dạng chuẩn thấp thì dữ liệu sẽ tập trung ở một chỗ và khi đó ta chỉ cần chọn và chiếu chứ không cần thực hiện phép kết Như vậy làm sao xác định phân rã đến dạng chuẩn nào là có lợi? Làm thế nào tìm được một sự thay thế tốt đẹp cho một sơ đồ quan hệ tồi tệ? Trong thực tế người ta thường chỉ phân rã các lược đồ quan hệ đến dạng chuẩn 3 là đạt yêu cầu
TÀI LIỆU THAM KHẢO
[1] Trịnh Minh Tuấn , “Giáo trình thiết kế cơ sở dữ liệu” NXB Đại học Quốc gia TP Hồ Chí Minh, 2009
[2] “Giáo trình cơ sở dữ liệu”, Trường Cao đẳng Công nghiệp 4
[3] Phạm Thị Xuân Lộc, “Bài giảng Cơ sở dữ liệu” Khoa Công nghệ thông tin, Trường Đại học Cần Thơ
[4] Đỗ Trung Tuân, “Cơ sở dữ liệu” NXB Đại học quốc gia Hà Nội
[5] PGS.TSKH Trần Quốc Chiến, “Giáo trình Cơ sở dữ liệu” Đà Nẵng
[5] Lê Tiến Vương, “Nhập môn Cơ sở dữ liệu quan hệ” NXB Khoa học và Kỹ thuật, 1995 [6] Jeffrey D Ullman – Stanford University, “Principles of Database and Knowledge – Base systems” (Volume 1&2) Computer Science Press