Tải bản đầy đủ (.pdf) (33 trang)

Các thuật toán tìm khóa trong cơ sở dữ liệu quan hệ

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (451.42 KB, 33 trang )


Trang 1/1

ÐẠỤ ỷỌạ QUỐạ ịỤự TỷÀNỷ PỷỐ ỷỒ ạỷÍ MỤNỷ
TRUNG TÂM PỷÁT TRỤỂN ạÔNị NịỷỆ TỷÔNị TỤN


BÁO ạÁO TỷU ỷOẠạỷ
M
ÔN ạÕ SỞ ỏỮ LỤỆU NÂNị ạựO



ÐỀ TÀỤể


CÁạ TỷUẬT TOÁN TÌM KỷOÁ
TRONG C
Õ SỞ ỏỮ LỤỆU QUựN ỷỆ






Giảng viên phụ trách: TS. ÐỖ PỷÚạ

Học viênể
 Võ Thế Dân – CH0301010
 Trịnh Minh Tuấn – CH0301083


Lớpể Cao học ạNTTQM – Khóa ợ



Thaìng ủ nãm ồệệủ


Trang 2/2

TÀI LIỆU THAM KHẢO


- Chuyên ðề CSDL Nâng cao : PGS. Nguyễn Xuân Huy, TS. Ðỗ Phúc
- Giáo trình CSDL Nâng Cao – TS. Ðỗ Phúc
- Thiết Kế Các Hệ CSDL -Tập 2 – Ullman ( Trần Ðức Quang dịch)
- Closed sets and Translations of relation schemes – 1991 - Nguyễn Xuân
Huy
- Balanced relation scheme and problem of key representation – 1985 –
J.Demetrovics, H
ồ Thuần, Nguyễn Xuân Huy, Lê Vãn Bảo.
- Nhập Môn CSDL Quan Hệ - GS. Lê Tiến Výõng

Trang 3/3

I. Lời nói ðầu
Qua quá trình học môn cõ sở dữ liệu trýớc ðây, khái niệm về
khóa và tìm khóa của một lýợc ðồ quan hệ, chúng tôi chỉ tìm hiểu ở
mức cõ bản, chýa có ðiều kiện ðầu tý sâu hõn, do ðó việc tìm khóa rất
tốn thời gian và còn gặp nhiều khó khãn ðối với nhiều bài toán trong
thực tế với ðộ phức tạp lớn.

D
ýới sự gợi ý của Thầy Tiến sĩ Ðỗ Phúc, chúng tôi ðã hiểu ðýợc
vấn ðề cặn kẽ hõn và cố gắng tìm kiếm vài thuật toán tìm khóa hầu
giải quyết một số bài toán trong thực tế có ðộ phức tạp týõng ðối lớn.
Do nhu c
ầu thực tế, với dữ liệu có số thuộc tính lớn thì việc tìm
khóa là rất phức tạp. Do ðó bài toán “Tìm Khóa” luôn là vấn ðề hấp
dẫn nhiều ngýời tìm hiểu nhằm mục ðích giảm thiểu ðộ phức tạp càng
nhiều càng tốt.
Ở góc ðộ là học viên, với sự ham muốn tìm tòi, học hỏi và sự
hýớng dẫn ðộng viên của Thầy, chúng tôi ðã tìm hiểu bài toán “Tìm
khóa” với mong muốn là tìm ðýợc những giải thuật có ðộ phức tạp
thấp hõn so với giải thuật tìm khóa chuẩn.
Trong b
ài thu hoạch này, chúng tôi kính trình ðến Thầy kết quả
tìm hiểu và việc xây dựng các thuật toán tìm khóa sau hõn hai tháng
học tập.
Tuy r
ằng rất nỗ lực, nhýng với sự hiểu biết còn hạn chế nên bài
thu hoạch không tránh khỏi nhiều thiếu sót. Chúng tôi rất mong nhận
ðýợc những chỉ bảo của Thầy.


Trang 4/4
II. Một Số khái niệm cõ bản
A. Quan Hệ
1. Quan hệể
Gọi R = { A1, A2, …, An } là tập hữu hạn các thuộc tính, mỗi thuộc tính Ai
với i=1,2, ,n có miền giá trị týõng ứng là Di, ký hiệu dom(Ai).
Quan h

ệ r trên tập thuộc tính R là tập con của tích Descarte
D=D1*D2*…*Dn.
2. L
ýợc ðồ quan hệể
Là tập hữu hạn các thuộc tính R={A1, A2, …, An} với Ai là thuộc tính
Cho D=D1*D2*
…*Dn. Khi ðó:
 Bộ t ðýợc ðịnh nghĩa trên R là một ánh xạ từ R vào D sao cho
t(Ai) thuộc Di.

Quan hệ r là tập các bộ {t1, t2, …, tp}

B. Phụ thuộc hàm
1. Phụ thuộc hàm
Cho R(U) là một lýợc ðồ quan hệ với U = { A1, A2, …, An} là tập thuộc
tính. X,Y là tập con của U. Phụ thuộc hàm X Y (ðọc là X xác ðịnh Y)
ðýợc ðịnh nghĩa là:

t, t’

r, nếu t.X = t’.X thì t.Y = t’.Y
Ý nghĩa: nếu 2 bộ có cùng giá trị X thì có cùng giá trị Y.
2. Bao ðóng của tập phụ thuộc hàm
Gọi F là tập các phụ thuộc hàm trên lýợc ðồ quan hệ R.
G
ọi XY là một phụ thuộc hàm. X,Y

U
Ta n
ói F khẳng ðịnh logic XY (viết là F|=XY) nếu mỗi quan hệ r của R

thỏa các phụ thuộc trong F thì cũng thỏa XY
Bao
ðóng của F là tập các phụ thuộc hàm ðýợc khẳng ðịnh logic từ F, nghĩa
là:
F
+
= { XY | F|=XY }

Trang 5/5

3. Hệ tiên ðề ựrmstrong
Ðể xác ðịnh ðýợc khóa và hiểu ðýợc các phép suy diễn logic cho các phụ
thuộc hàm nói chung, chúng ta phải có những quy tắc suy diễn cho biết làm
sao ðể có thể suy ra một hay nhiều phụ thuộc từ các phụ thuộc ðã có.
N
ãm 1974, Armstrong ðã ðýa ra một tập các quy tắc suy diễn.

Các quy tắc
này là ðúng ðắn, nghĩa là khi sử dụng chúng, ta sẽ suy ra từ F một phụ
thuộc hàm thuộc F
+
. Hõn nữa những quy tắc suy diễn ðầy ðủ theo nghĩa: từ
tập các phụ thuộc F ðã biết, những quy tắc này cho phép suy ðýợc tất cả các
phụ thuộc hàm thuộc F
+
. Tập các quy tác ðó ðýợc gọi là Hệ tiên ðề
Armstrong, bao g
ồm các quy tắc suy diễn sau:
G
ọi R là lýợc ðồ quan hệ

U l
à tập thuộc tính của R. X,Y,Z,W,V  U
F l
à tập các phụ thuộc hàm
A1: Tính Phản Xạ
Nếu Y

X

U thì X

Y
A2: Tính Tãng Trýởng
Nếu X

Y và Z

U thì XZ

YZ, với XZ là X

Z, YZ là Y

Z
A3: Tính Bắc Cầu
Nếu X

Y và Y

Z thì X


Z


Bổ ðề : hệ tiên ðề Armstrong là ðúng ðắn, nghĩa là nếu X

Y ðýợc suy
từ F nhờ hệ tiên ðề này thì X

Y ðúng trong mọi quan hệ mà các phụ
thuộc của F ðúng.

Chứng minh:
Xét A1:
R
õ ràng là ðúng ðắn vì không thể có một quan hệ r với 2 bộ giống
nhau ở các thành phần trong X nhýng lại khác nhau ở một tập con
nào ðó của X !
X
ét A2:
Gi
ả sử quan hệ r thỏa XY, và có 2 bộ t1, t2

r giống nhau ở các
thuộc tính của XZ nhýng khác nhau ở các thuộc tính của YZ. Vì t1,
t2 không thể khác nhau ở các thuộc tính của Z nên phải khác nhau ở
thuộc tính của Y. Ðiều này mâu thuẩn với giả thiết vì do XY, nên
t1 và t2 phải giống nhau ở các thuộc tính của Y.
X
ét A3:

Gi
ả sử quan hệ r thỏa XY và YZ, và có 2 bộ t1, t2r giống nhau
ở các thuộc tính của X và khác nhau ở các thuộc tính Z.
Do X
Y, và r1.X = r2.X nên r1.Y = r2.Y

Trang 6/6
Do YZ, và r1.Y = r2.Y nên r1.Z = r2.Z. Ðiều này trái với giả thiết.
4. Các quy tắc suy diễn bổ sung
A4: Quy tắc Hợp
Nếu X

Y và X

Z thì X

YZ
Chứng minh:
Do XY, áp dụng tính tãng trýởng ðối với X ta có XXY
Do X
Z, áp dụng tính tãng trýởng ðối với X ta có XYYZ
Áp dụng Tính Bắc Cầu ðối với XXY và XYYZ ta có XYZ
A5: Quy tắc Giả Bắc Cầu
Nếu X

Y và WY

Z thì XW

Z

Ch
ứng minh:
Do XY, áp dụng tính tãng trýởng ðối với W ta có XWWY
Áp dụng Tính Bắc Cầu ðối với XY và WYZ ta có XWZ
A6: Quy tắc Phân Rã
Nếu X

YZ thì X

Y và X

Z
Ch
ứng minh:
Áp dụng tính phản xạ
Hệ quả: nếu X

Y thì X

Ai, Ai

Y

5. Bao ðóng của tập thuộc tính
Cho R(U) trong ðó U là tập các thuộc tính. Gọi F là tập phụ thuộc hàm và X
là một tập con của U.
Bao
ðóng của X ứng với F (ký hiệu là X
+
) là tập các thuộc tính A sao cho

XA ðýợc suy từ F nhờ hệ tiên ðề Armstrong

Bổ ðề ể X

Y ðýợc suy từ F nhờ hệ tiên ðề Armstrong nếu và chỉ nếu
Y

X
+
.
Chứng minh:
Ðặt Y = A1,A2,…,An và giả sử Y

X. Theo ðịnh nghĩa trên, XAi
ðýợc suy ra bằng hệ tiên ðề Armstrong với mọi i. Bằng quy tắc hợp, thì
XY là ðúng.
Ng
ýợc lại, giả sử XY ðýợc suy ra từ hệ tiên ðề Armstrong. Bằng quy
tắc phân rã ta có XAi ðúng với mọi i.
V
ậy Y

X
+
.

Trang 7/7

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


Procedure
MEMBER
Va
Ìo: tập phụ thuộc hàm F và phụ thuộc hàm XY
Ra:
Ðúng nếu F |= XY và
Sai n
ếu ngýợc lại
MEMBER(F, XY)
Begin
If Y

Closure(X,F) then return (True)
Else return (False)
End

Giải thuật tính bao ðóngể
Nhập: tập thuộc tính hữu hạn X, tập phụ thuộc hàm F và X U
Xu
ất: X
+
, bao ðóng của X ứng với F
Ph
ýõng pháp:
Begin
Olddep=

Newdep=X
While Newdep <> Olddep do begin
Olddep = Newdep

For each pth W
Z  F do
If W

Newdep then
Newdep = Newdep
 Z
End {if}
End {for}
End {while}
End

Hệ quả ợể X
+
là tập các thuộc tính A sao cho F|=XA

Hệ quả ồể F
+
là tập các phụ thuộc ðýợc suy từ F bằng hệ tiên ðề
Armstrong.

Trang 8/8

C. Khoá của lýợc ðồ quan hệ
Cho quan hệ r(R), tập K

R ðýợc gọi là khóa của quan hệ r nếu K
+
=R và
nếu bớt 1 phần tử khỏi K thì K

+
≠R. Nhý thế, tập K

R và (K\A)
+
≠R,

A

K
Nh
ận xét:
 Một quan hệ có nhiều khóa
 Khóa bao hàm (còn gọi là siêu khóa) là một tập chứa khóa. Nói cách
khác, khóa là một trýờng hợp ðặc biệt của khóa bao hàm.

D. Ph
át biểu bài toán
Mục ðích chính yếu của bài thu hoạch ðýợc tóm tắt bởi bài toán sau ðây:
Cho l
ýợc ðồ quan hệ (R,F), trong ðó R là tập các thuộc tính, F là tập các
phụ thuộc hàm xác ðịnh trên R. Câu hỏi ðýợc ðặt ra là Tìm tất cả các Khoá
của lýợc ðồ quan hệ (R,F).

Lucchesi v
à Osborn ðã chúng minh ðây là bài toán loại NP-Khó ( NP-
complete)
(Lucchesi , Osborn : CandidateKeys for Relations - 1978)

Trang 9/9


III. Các thuật toán tìm khoá cõ bản
A. Qui ýớc cú pháp
Ng
ôn ngữ tựa Pascal - Hýớng ðối týợng.
1. Kiểu dữ liệu Set ể
Kiểu Tập Hợp trong Ðại Số bao gồm các phép toán Ðại số trên
Tập Hợp:
- M
ô tả A là Tập Hợp : A: Set
- Ph
ép gán tập A vào B: B:=A;
- Ph
ép Hợp : C là hợp của A và B: C:=A  B;
- Ph
ép Giao: C là giao của A và B: C:=A

B;
- Ph
ép Hiệu: C là hiệu của A và B: C:=A - B;
-
Ðịnh nghĩa A là Tập rỗng: A:=0;
- S
ố phần tử của tập A: A.SizeOf() ( Hoặc SizeOf(A) )
- T
ập hợp chỉ chứa một phần tử thứ i của A:
A.BaseOf(i)
(Hay BaseOf(i,A))
- Biểu thức logic A rỗng hay không: A!=0 ( Hoặc A<>0)
- Bi

ểu thức logic A,B khác nhau: A!=B ( Hoặc A<>B)
- Bi
ểu thức logic A,B bằng nhau: A=B
- Bi
ểu thức logic A là tập con của B: A

B
- Bi
ểu thức logic A là tập con của B hay bằng B: A

B
2. Kiểu dữ liệu Setsể
Kiểu dãy ( Array ) mỗi phần tử là một Set.
Th
í dụ : L: Array[1 100] of Set; thì ta gọi L có kiểu Sets.
Tr
ên kiểu Sets có các phép toán sau:
-
Ðịnh nghĩa L có zero phần tử: L.Reset();
- Th
êm vào L một tập hợp A : L.Add(A)
- S
ố tập hợp có trong L: L.SizeOf()
- T
ập hợp thứ i trong L: L.Set(i)
- H
ủy tập thứ i trong L: L.Sub(i)
- Ki
ểm tra việc tồn tại X trong L: L.Exist(X)
3. Kiểu dữ liệu ấỏể

Biểu diển một phụ thuộc hàm , là gồm 2 tập hợp X và Y trong phụ thuộc
hàm có dạng XY.
M
ô tả f là một phụ thuộc hàm: f: FD
- T
ập hợp vế trái của f: f.X ( Hay f.X())
- T
ập hợp vế phải của f: f.Y ( Hay f.Y())

4. Kiểu dữ liệu ấỏsể
Biểu diển một danh sách các phụ thuộc hàm.
M
ô tả F là danh sách phụ thuộc hàm : F : FDs
- S
ố lýợng các phụ thuộc hàm trong F: F.SizeOf() ( Hay SizeOf(F) )
- Kh
ởi ðộng F, zero phần tử: F.Reset();
- Ph
ụ thuộc hàm thứ i: F.FD(i)
- Th
êm một phụ thuộc hàm f vào F: F.Add(f) ( F:=F + f)
- Thay th
ế phụ thuộc hàm thứ I bởi f: F.Replace(I,f);
- Hu
ỷ bỏ phụ thuộc hàm thứ i: F.Sub(i); ( F:=F – f)

Trang 10/10

5. Một số thủ tục ụ hàm cõ bản ể
Function Closure(X :Set ; Var F : FDs) : Set;

// Tìm bao ðóng của X dựa trên Tập F
// T
ài liệu tham khảo: Giáo Trình CSDL Nâng Cao – TS. Ðỗ Phúc
Var
Old,New:Set;
W,Z: Set;
f: FD;
i: Integer;
Begin
Old:=0; New:=X;
While (Old <> New)
Begin
Old:=New;
For i:=1 to F.SizeOf() do
Begin
f:= F.FD(i); W:=f.X ; Z:=f.Y;
if ( W


New) then New:=New  Z;
End;
End;
Return (New) ;
End;



Procedure AddSuperKey(K: Set; Var Keys: Sets);
// Thêm một Super Key vào danh sách Keys
// Keys Ch

ỉ chứa các SuperKey có kích thýớc nhỏ
Var i: Integer;
X: Set;
Begin
For i:=1 to Keys.SizeOf() do
Begin
X:=Keys.Set(i);
If ( K
 X) Then
Begin
Keys.Sub(i) ; i:= i - 1;
End;
End;
Keys.Add(K);
End;

Trang 11/11

Function CheckKey( X , R : Set; Var F: FDs) : Boolean;
// Ki
ểm tra một SuperKey có phải là Key hay không
Var
I: integer;
Begin
If Closure (X,F)<> R then Return (False) ;
Else
For i:=1 to X.SizeOf() do
If (Closure(X
– X.BaseOf(i), F) = R ) then
Return (False);


Return (True);
End;




B. Thuật toán từ trên xuống

Input ban ðầu : X=R ; Keys.Reset();
OutPut : Keys l
à Tập các Khoá trên ( R,F )
Procedure FindKeys(X , R: Set; Var F: FDs; Var Keys: Sets)
Var
T: Set;
I: Integer;
Begin
If ( Keys.Exist(X) ) Then return;
AddSuperKey(X, Keys); // X l
à SuperKey
If ( X.Sizeof() = 1) return;
For i:=1 to X.SizeOf() do
Begin
T:=X.BaseOf(i) ;
If ( Closure(X
– T) = R) Then
FindKeys( X-T, R, F, Keys);
End;
End;
Ðộ phức tạp: Tính trên số lần thực hiện Hàm Closure


Trang 12/12

C. Thuật toán từ dýới lên

Input X:=0; T:= R; Keys.Reset()
Output: Keys l
à Tập các Khoá

Procedure FindKeys( X, T, R: Set; Var F: FDs; Var Keys: Sets)
Var
A: Set;
Begin
If ( Closure(X,F)=R) Then
Begin
AddSuperKey(X,Keys); Return ;
End;
For i:=1 To T.SizeOf() do
Begin
A:= T.BaseOf(i); T=T-A;
FindKeys(X

A,T,R,F,Keys);
End;

End;



D. Thuật toán ðồ thị

Ðây là thuật toán cải biên từ thuật toán từ dýới lên

Input G là Tập nút gốc, T: Tập các nút trung gian
T
ập nút gốc ðýợc tính trên thuật toán sau:
G:= (R
– ( _XX

_YY))

( _XX - _YY);
T
ập T các nút trung gian ðýợc xác ðịnh sau:
T:= ( R
– ( _YY - _XX) ) – G;

Trong
ðó _XX, _YY ðýợc tính nhý sau:
Procedure SumXY( Var _XX, _YY : Set ; Var F: FDs)
Begin
_XX:=0; _YY:=0;
For i:=1 to F.SizeOf() do
Begin
_XX:= _XX

F.FD(i).X;
_YY:= _YY

F.FD(i).Y;
End;

End;



Trang 13/13
Procedure FindKeys( G, T, R: Set; Var F: FDs; Var Keys: Sets)
Var
A,C : Set;
Begin
C:= Closure(G,F);
If ( C=R) Then Begin
AddSuperKey(G,Keys); Return ;
End;
For i:=1 To T.SizeOf() do
Begin
A:= T.BaseOf(i); T=T-A;
FindKeys(G

A,T,R,F,Keys);
End;

End;


IV. Xây dựng một số thuật toán mới
A. Một số qui ýớc :
Cho (R,F) là 1 lýợc ðồ quan hệ, trong ðó R là tập các thuộc tính và F là
tập các phụ thuộc hàm. Giả sử F ðã ðýợc rút gọn nhý sau :
o Chỉ tồn tại các phụ thuộc hàm dạng XA trong ðó A là 1 thuộc tính
của R

o Chỉ tồn tại các phụ thuộc hàm không tầm thýờng nghĩa là XA thuộc
F thì A không thuộc X
Phép Chiếu:
Cho (R,F), Cho R1 l
à tập con của R.
Ta g
ọi (R1,F1) là kết quả của phép chiếu (R,F) trên tập R1 nếu và chỉ
nếu
F1={ X
Y thuộc F ; trong ðó XY thuộc R1 }

Ta g
ọi (R1,F1) là kết quả của phép chiếu mở rộng (R,F) trên tập R1
nếu và chỉ nếu
F1={ f : X
Y trong ðó f thoả các ðiều kiện (a), (b) }
(a): N
ếu f:XY thuộc F , trong X

Y thuộc R1 thì f thuộc F1
(b): N
ếu f:X

Y thuộc F, trong ðó Y thuộc R1, X không thuộc
R1, XR1<>


Th
ì Phụ thuộc hàm XR1  Y thuộc F1


Ph
ụ thuộc hàm dý thừa ðối với việc tìm khoá:
Ph
ụ thuộc hàm f ðýợc gọi là dý thừa trong việc tính toán xác ðịnh
Khoá của (R,F)
t
ức là Nếu K là khoá của (R,F) thì K cũng là Khoá của (R,F – f)

Danh s
ách Tập hợp chặn trên: Cho K,L là Danh sách các Tập hợp.
Tức K,L là kiểu Sets.

Trang 14/14

L ðýợc gọi là Tập Chặn Trên của K nếu nhý mọi phần tử của K ðều
là phần tử của L.

B. Thuật toán loại Tập Lá
1. Khái niệm ể Tập ịốcụ Lá và Trung gian
Cho (R,F) là 1 lýợc ðồ quan hệ, trong ðó R là tập các thuộc tính và F là
tập các phụ thuộc hàm. Trên R ta xây dựng các tập thuộc tính sau :
-
Nút gốc ể
Cho G là 1 thuộc tính thuộc R, G ðýợc gọi là nút gốc nếu :
v
ới mọi XA thuộc F thì A <> G
-
Nút lá ể
Cho L là 1 thuộc tính thuộc R, L ðýợc gọi là nút lá nếu :
với mọi XA thuộc F thì L không thuộc X

tồn tại 1 XG thuộc F
-
Nút trung gian ể
Cho T l
à 1 thuộc tính thuộc R, T ðýợc gọi là nút trung gian nếu :
T không là nút gốc
T không là nút lá
-
Ký hiệu ể
Tập gốc : Goc = {A thuộc R/ A là nút gốc}
Tập lá : La = {A thuộc R/ A là nút lá}
Tập trung gian : Tg = {A thuộc R/ A là nút trung gian}
-
Nhận xét ể
R = Goc  Tg  La
Các tập Goc, Tg, La là tách biệt (có giao bằng rỗng)

2.

Các bổ ðề
2.1
Bổ ðề ởọợ ể

Gọi G là tập các nút gốc của (R,F).
N
ếu K là một khoá của (R,F) thì G  K. ( G là tập con của K)
T
ức là Nút gốc phải tham gia vào các khóa.

Ch

ứng minh :
Cho G l
à 1 thuộc tính thuộc tập Goc
V
ì K là khóa nên có phụ thuộc hàm KG thuộc Closure(F)
N
ếu G không thuộc K mâu thuẩn với ðịnh nghĩa G là thuộc tính
gốc.
V
ậy G phải thuộc K

2.2 Bổ ðề ởọồ ể
G
ọi L là tập các nút Lá của ỮRụấỀọ
N
ếu K là Khoá của ỮRụấỀ thì L

K= ; ( L giao với K bằng
rỗngỀọ
T
ức là L không tham gia thuộc tính khoá của ỮRụấỀọ

Ch
ứng minh :
Cho L l
à 1 thuộc tính thuộc tập La
X
ét Closure(K-L,F) :

Trang 15/15

Nếu Closure(K-L,F) = R thì L không thuộc K vì nếu ngýợc lại sẽ
trái với giả thiết K là khoá.
N
ếu Closure(K-L,F) <> R
X
ét Closure(K-L,F) :
N
ếu X thuộc Closure(K-L,F) xong
N
ếu X không thuộc Closure(K-L,F) xong

2.3 Bổ ðề ởọộ ể
Cho l
ýợc ðồ quan hệ ỮRụấỀụ trong ðó R là tập các thuộc tính
và ấ là tập các phụ thuộc hàmọ K là tập gồm các khóa của
(R.F).
G
ọi L là ợ nút láụ ấ_L là tập các phụ thuộc hàm trong ấ mà có
vế phải là Lọ
Ta x
ây dựng lýợc ðồ quan hệ ỮR-{L},F-F_L), trong ðó R-{L}
l
à tập các thuộc tính và ấ-F_L là tập các phụ thuộc hàmọ ịọi
K’ là tập các khóa của ỮR-{L},F-F_L). Ta có K là tập con của
K’

Ch
ứng minh :
Nh
ận xét : nếu XY thuộc F-F_La thì XY thuộc R-La

Cho Ki thu
ộc K, tức Ki là 1 khóa của (R,F)
Ta c
ó Ki là con của R-La do nút lá không tham gia vào khóa (bổ
ðề 2)
V
ới XL thuộc F_La ta có Closure(R,F-{XL}) = R-{L}

3. Tý týởng thuật toán
a. Từ việc xác ðịnh các nút lá ta loại bỏ chúng và các phụ thuộc
hàm liên quan ðến chúng. Nhý vậy từ (R,F) ðýợc thu hẹp thành
(R1,F1)
b. Sau khi th
ực hiện býớc a. có thể trên (R1,F1) lại xuất hiện 1 tập
các nút lá mới khi ðó ta tiếp tục lặp lại býớc a.
c. Khi kh
ông còn phát sinh nút lá mới, ta sẽ tìm khoá trên (R1,F1)
sau ðó duyệt trên tập các khoá vừa tìm ðýợc ðể cho ra các khóa
của (R,F)

4. Xây dựng thuật toán

Procedure Projection(Var R1: Set; Var F1, F: FDs)
Begin
F1.Reset();
For each f:W
Z thuộc ấ do
If (Z

R1) and ( W


R1) Then
Begin
F1:=F1 + f;
End;
End;

Trang 16/16
Procedure RemoveLeaf(Var R: Set; Var F: FDs)
Var XX,YY:Set;
F1: FDs;
Begin
L:=R;
While ( L <> 0) do
Begin
SumXY(XX,YY,F);
L:=YY
– XX; // L là tập nút Lá
If ( L<>0) Then
Begin
R:=R
– L; // Loại bỏ các nút Lá
Projection(R, F1,F);
F:=F1;
End;
End;
End;


C. Thuật toán loại Tập Suy diễn

1. Khái niệm
Cho (R,F), R là tập các thuộc tính, F là tập các phụ thuộc hàm.
Cho K l
à tập con của R , ðặt E:= Closure(K,F) - K
E g
ọi là Tập Suy diễn từ K.
2. Các bổ ðề

2.1 Bổ ðề ạọợể
Cho K là một khoá trong (R,F);
G
ọi K’  K;
E l
à Tập Suy diễn từ K’;
Th
ì K

E=; ( K giao với E bằng rỗng )


Chứng Minh:
Gi
ả sử K

E<>

tức tồn tại thuộc tính A

K


E.
V
ì A

E và E= Closure(K’,F) – K’ nên A

Closure(K’,F).
Do
ðó tồn tại pth X

A với X

K’
V
ậy K-{A} là siêu khoá nên mâu thuẫn với giả thiết K là khoá.


2.2 Bổ ðề ạọồể
Nếu K’ là Tập các thuộc tính Gốc;
E l
à Tập Suy diễn từ K’;
Th
ì Với mọi khoá K của (R,F) : K

E = ;


Chứng Minh:
V
ì mọi khóa phải chứa gốc nên K’


K. Nhờ bổ ðề C.1 nên ta có
thể kết luận
K

E =


2.3 Bổ ðề ạọộể
Nếu K là Tập con của một Khoá .

Trang 17/17
E là thuộc tính suy diễn từ K.
N
ếu f: X

E , trong ðó X không là tập con của Closure(K,F)
Th
ì f là dý thừa trong việc tìm khoá có chứa K.



Chứng Minh:
Ta s
ẽ chứng minh rằng: Closure (K,F) = (Closure(K,F – f).
Hay f: X

E không xuất hiện trong quá trình tìm Closure(K,F).
Th
ực vậy, Thuật toán tìm Bao ðóng chỉ duyệt tìm các f : W


Z
tho
ả ðiều kiện
L
à WClosure(K,F) vì X không là Tập con của Closure(K,F) nên
f không ðýợc chọn trong quá trình tìm Closure(K,F).

Ta gi
ả sử rằng K là một khoá, tức closure(K,F)=R;
Ta s
ẽ chứng minh rằng Closure(K,F – f)=R.
Th
ực vậy, Giã sử rằng: Closure(K,F – f)<>R, tức là E không có
trong Closure(K,F – f). Vì theo nhý chứng minh trên E phải thuộc
Closure(K,F – f)
V
ậy giả sử Closure(K, F – f)<>R là vô lý. K là một siêu khoá trên
(R,F – f)
Ta c
ũng dễ dàng thấy rằng K cũng là khoá của (R,F – f).

T
ừ Bổ ðề C.3 ta có mệnh ðề sau:


Mệnh Ðề C.4:
Cho K
’ là tập gốc trong (R,F)
E l

à tập suy diễn từ K’.
N
ếu f: X

Ei trong ðó Ei thuộc tập E, X không là tập con của
Closure(K’,F).
Th
ì khoá của (R,F) cũng là khoá của (R,F – f)


Chứng Minh:
V
ì mọi khóa phải chứa gốc nên K’

K, K là khoá. Nhờ bổ ðề C.3
nên ta có thể
k
ết luận C.4

M
ệnh Ðề C.5:
Cho K
’ là tập gốc trong (R,F)
E l
à tập suy diễn từ K’.
Gi
ã sữ rằng không tồn tại trong F các phụ thuộc hàm có dạng
f: X

Ei trong ðó Ei thuộc tập E, X không là tập con của

Closure(K’,F).
Ta thay
ðổi F nhý sau:
(i) V
ới mọi f: X

Y thuộc F, Y

E thì thu gọn F:=F – f.
(ii) V
ới mọi f:X

Y thuộc F, X

E<> thì thay f bằng
(X-E)

K’

Y
F sau khi thay
ðổi ta gọi là F1.
Th
ì khoá của (R,F) cũng là khoá của (R – E,F1).


Trang 18/18
Chứng Minh:
Do m
ệnh ðề C.4 nên ta có thể áp dụng vào (i)

(ii) Ta c
ó X=(X-E)

(X

E). Hõn nữa trong quá trình tìm khóa
ta có thể xuất phát từ tập gốc K’ mà X

E  Closure(K’,F) nên ta
có thể thay thế X

E bởi K’

3. Tý týởng thuật toán
a. Từ (R,F) ta biến dạng thành (R1,F1) , trong ðó R1 < R
S
ố các phụ thuộc hàm F1 nhỏ hõn F. Do ðó ðộ phức tạp tính
toán giảm ði.
b. Ta t
ìm tập khoá chặn trên của (R,F) bằng cách tìm tập khoá
trên (R1,F1).
c. Ta ch
ỉ cần duyệt tuyến tính trên danh sách Khoá chặn trên ðể
chỉ ra danh sách khoá của (R,F).
d. Vi
ệc loại bỏ các phụ thuộc hàm dý thừa trong việc xác ðịnh
khoá, có thể tìm ra các nút Lá mới và ta có thể thu hẹp R1
ðýợc nhỏ hõn nữa.
e. Sau m
ỗi býớc tìm một khoá, Tập Trung Gian T ðýợc thu hẹp

nhanh.
T
ức là nếu G dự kiến là Tập thuộc tính tham gia khoá, thì :
T:= T
– Closure(G,F); là tập trung gian mới.

4. Xây dựng thuật toán chuẩn

Procedure FindKeys( G, T, R: Set; Var F: FDs; Var Keys: Sets)
Var
A,C : Set;
Begin
C:= Closure(G,F);
If ( C=R) Then Begin
AddSuperKey(G,Keys); Return ;
End;
T:= T
– C; // Loại Tập Suy Diễn Bổ ðề C.1
For i:=1 To T.SizeOf() do
Begin
A:= T.BaseOf(i); T=T-A;
FindKeys(G

A,T,R,F,Keys);
End;
End;


Trang 19/19


D. Thuật toán phân rã
1. Khái niệm
Cho 3 danh sách kiểu Sets : L1, L2 và L.
Ta
ðịnh nghĩa phép toán X trên Sets nhý sau: L:= L1  L2
- Với mọi Tập A thuộc L1 thì L:= L  A. Tức là L.Add(A).
- Với mọi Tập B thuộc L2 thì L:= L  B. Tức là L.Add(B).
- Với mọi Tập A thuộc L1, Tập B thuộc L2 thì : L:= L  (AB ).
T
ức là L.Add(AB)

Thí dụ 1:
L1={ A,BD } ; L2={ AC, E }
Th
ì L={ A,E,BD,AC, AE, ABCD, BDE }
Th
í dụ 2:
Cho (R,F) trong
ðó R=ABCDE và F={ AB; BA; CD;
D
E; EC }
Ta th
ấy rằng tập khoá K của (R,F) là:
K={ AC, AD,AE, BC,BD,BE }
N
ếu ta ðặt R1=AB và F1= { AB; BA }
V
à R2=CDE và F2= { CD; DE; EC }
G
ọi L1 là tập khoá của (R1,F1). L1={A,B}

G
ọi L2 là tập khoá của (R2,F2). L2={ C,D,E }

Ðặt L:= L1

L2.
Th
ì L= { A,B,C,D,E, AC,AD,AE,BC,BD,BE }
Nh
ận xét là KL tức L là tập chặn trên của K.

C
ác thuật toán tìm tất cả các Khoá của (R,F) có ðộ phức tạp là số lần
thực hiện hàm tính Bao Ðóng của các tập X nào ðó : Closure(X,F).
V
ới thí dụ 2 nói trên , có 6 khoá , Giả sữ Ðộ phức tạp là 6.
V
ới (R1,F1) có ðộ phức tạp là 2.
V
ới (R2,F2) có ðộ phức tạp là 3.
Ðể tìm L , ta có ðộ phức tạp là 2 + 3 = 5 (nhỏ hõn 6, chú ý là: 6 = 2*3).

V
ấn ðề ðýợc ðặt ra là : Nếu có một phép phân rã (R,F) thành (R1,F1) và
(R2,F2) sau cho K1 

K2 là tập chặn trên của K thì ðộ phức tạp tính
toán cho việc tìm tất cả các khoá trên (R,F) ðýợc giảm thiểu nhiều lần.
Ghi chú : K là tập các khoá của (R,F), K1 là tập các khoá của (R1,F1) ,
K2 là tập các khoá của (R2,F2).



Trang 20/20

2. Các bổ ðề
1.1 Bổ ðề D.1:
Cho (R,F), cho ph
ép phân rã p=(R1,R2) nhý sau:
- (i) R=R1R2
- (ii) R1

R2 = 
- (iii) F= F1  F2
Trong
ðó F1 là chiếu của F trên R1, F2 là chiếu của F trên R2

G
ọi K1,K2 lần lýợt là tập các khoá của (R1,F1),(R2,F2).
G
ọi K là tập khoá của (R,F).
Th
ì K  K1  K2 ( K1  K2 là tập chặn trên của K )

Chứng minh:
Cho K là khóa của (R,F).
G
ọi K1=K

R1 và K2=K


R2
Thu
ật toán tính bao ðóng của 1 tập các thuộc tính ðã ðýợc chứng
minh là ðúng. Ta viết lại thuật toán sao cho vẫn týõng ðýõngvới
thuật toán cũ nhý sau:
Nhậpể
tập thuộc tính K, tập phụ thuộc hàm F và KR
t
ập thuộc tính K1, tập phụ thuộc hàm F1 và K1R1
t
ập thuộc tính K2, tập phụ thuộc hàm F2 và K2R2

Xuấtể
K
+
= Newdep, bao ðóng của K ứng với (F,R)
K1
+
= Newdep1, bao ðóng của K1 ứng với (F1,R1)
K2
+
= Newdep2, bao ðóng của K2 ứng với (F2,R2)

Phýõng phápể
Begin
Olddep=

Olddep1=

Olddep2=


Newdep=K
Newdep1=K1
Newdep2=K2
(1*)While Newdep <> Olddep do
begin
(2*)While Newdep1<>Olddep1 or Newdep2<>Olddep2 do
begin
Olddep = Newdep
Olddep1 = Newdep1
Olddep2 = Newdep2
(3*)For each pth W

Z

F do
If W

Newdep then
Newdep = Newdep

Z

Trang 21/21

(4*)For each pth W

Z

F1 do

If W

Newdep1 then
Begin
Newdep = Newdep

Z
Newdep1 = Newdep1


Z
End

For each pth W

Z

F2 do
If W

Newdep2 then
Begin
Newdep = Newdep

Z
Newdep2 = Newdep2

Z
End
End

End

Ta thấy :
do (i) v
à (ii) nên ta thay thế
(1*)
bởi
(2*)
là týõng ðýõng
do (iii) v
à (ii) nên ta có thể sắp lại tập F sao cho f

F1 xuất hiện
trýớc rồi ðến f

F2 nên ta thay thế
(3*)
bởi
(4*)
là týõng ðýõng

V
ậy ðây chính là thuật toán ðể tính :
(1) Closure(K,R,F)
(2) Closure(K1,R1,F1)
(3) Closure(K2,R2,F2

Do K l
à khoá của (R,F) nên Closure(K,R,F)=R tức là Newdep=R.
V

à do Newdep=Newdep1

Newdep2 và Newdep1


Newdep2=0
v
à Newdep1  R1 và Newdep2  R2 nên Newdep1= R1 và
Newdep2= R2
Nghĩa là K1 là siêu khóa trên (R1,F1) và K2 là siêu khóa trên
(R2,F2)
H
õn nữa K1 cũng là khóa trên (R1,F1) và K2 là khóa trên
(R2,F2) vì giả sử ngýợc lại thì K cũng không là khóa trên (R,F)
ðiều nầy mâu thuẫn với giả thiết.

Trang 22/22

1.2 Bổ ðề D.2:
Cho (R,F), cho ph
ép phân rã p=(R1,R2) nhý sau:
-
(i) R=R1R2
- (ii) R1

R2 = 
- (iii) Closure(R1,F)=R1
- (iv) Closure(R2,F)=R2
Ðặt F1=Chiếu mở rộng của F trên R1
Ðặt F2=Chiếu mở rộng của F trên R2

G
ọi K1,K2 lần lýợt là tập các khoá của (R1,F1),(R2,F2).
G
ọi K là tập khoá của (R,F).
Th
ì K

K1  K2 ( nghĩa là K1  K2 là tập chặn trên của K )

Ch
ứng minh:
Cho K là khóa của (R,F).
G
ọi K1=K

R1 và K2=K

R2
G
ọi F1’= chiếu của F trên R1 và F1”=F1-F1’
Ta c
ó F1=F1’

F1”
G
ọi F2’= chiếu của F trên R2 và F2”=F2-F2’
Ta c
ó F2=F2’

F2”

Do (iii) n
ên trong F không tồn tại pth X

Y sao cho X  R1 và Y

R2
Do (iv) n
ên trong F không tồn tại pth X

Y sao cho X  R2 và Y

R1
N
ên ta có thể phân hoạch F và và thay thế bởi tập F’ ( týõng
ðýõng với F ) nhý sau :
F
’ = F1’

F1”

F2’

F2” trong ðó :

các thành phần là tách biệt
 pth X

Y sao cho Y

R1 và X


R2<>

ðýợc thay thế
bởi f

F1”
 pth X

Y sao cho Y

R2 và X

R1<>

ðýợc thay thế
bởi f

F2”

Thu
ật toán tính bao ðóng của 1 tập các thuộc tính ðã ðýợc chứng
minh là ðúng. Ta viết lại thuật toán sao cho vẫn týõng ðýõngvới
thuật toán cũ nhý sau:
Nhậpể
tập thuộc tính K, tập phụ thuộc hàm F’ và KR
t
ập thuộc tính K1, tập phụ thuộc hàm F1’ và K1R1, F1 ðýợc sắp
F1’ rồi F1”
t

ập thuộc tính K2, tập phụ thuộc hàm F2 và K2

R2, F2 ðýợc sắp
F2’ rồi F2”

Xuấtể
K
+
= Newdep, bao ðóng của K ứng với (F,R)
K1
+
= Newdep1, bao ðóng của K1 ứng với (F1,R1)
K2
+
= Newdep2, bao ðóng của K2 ứng với (F2,R2)

Trang 23/23
Phýõng phápể
Begin
Olddep=


Olddep1=


Olddep2=


Newdep=K
Newdep1=K1

Newdep2=K2
(1*)While Newdep <> Olddep do
begin
(2*)While Newdep1<>Olddep1 or Newdep2<>Olddep2 do
begin
Olddep = Newdep
Olddep1 = Newdep1
Olddep2 = Newdep2
(3*)For each pth W

Z

F’ do
If W

Newdep then
Newdep = Newdep

Z

(4*)For each pth W

Z

F1’ do
If W

Newdep1 then
Begin
Newdep = Newdep


Z
Newdep1 = Newdep1

Z
End
For each pth W

Z

F1” do
If W

Newdep1 then
Begin
Newdep = Newdep

Z
Newdep1 = Newdep1

Z
End
For each pth W

Z

F2’ do
If W

Newdep2 then

Begin
Newdep = Newdep

Z
Newdep2 = Newdep2

Z
End
For each pth W

Z

F2” do
If W

Newdep2 then
Begin
Newdep = Newdep

Z
Newdep2 = Newdep2

Z
End

End
End


Trang 24/24

Ta thấy :
do (i) v
à (ii) nên ta thay thế
(1*)
bởi
(2*)
là týõng ðýõng
do nh
ận xét ở trên nên ta ðã sắp lại tập F’ nên ta thay thế
(3*)
bởi
(4*)
là týõng ðýõng.

V
ậy ðây chính là thuật toán ðể tính :
(1) Closure(K,R,F)
(2) Closure(K1,R1,F1)
(3) Closure(K2,R2,F2)

Do K l
à khoá của (R,F) nên Closure(K,R,F)=R tức là Newdep=R.
V
à do Newdep=Newdep1

Newdep2 và Newdep1


Newdep2=0
v

à Newdep1  R1 và Newdep2  R2 nên Newdep1= R1 và
Newdep2= R2
Nghĩa là K1 là siêu khóa trên (R1,F1) và K2 là siêu khóa trên
(R2,F2)
H
õn nữa K1 cũng là khóa trên (R1,F1) và K2 là khóa trên
(R2,F2) vì giả sử ngýợc lại thì K cũng không là khóa trên (R,F)
ðiều nầy mâu thuẫn với giả thiết.

1.3 M
ệnh ðề D.3
Cho (R,F) , cho ph
ép phân rã p=(R1,R2) sao cho:
- R= R1  R2
-
R1

R2 = 
- Không tồn tại các phụ thuộc hàm trong F có dạng
f:X

Y, mà YR1 và X


R2 <> 

Ta
ðặt E=Closure(R1,F) – R1
Ta thu h
ẹp R2=R2-E


F1=Chi
ếu mở rộng của F trên R1
F2=Chi
ếu mở rộng của F trên R2
K l
à tập khoá của (R,F)
K1 l
à tập khoá của (R1,F1)
K2 l
à tập khoá của (R2,F2)
Th
ì ta có kết luận sau: K  K1  K2
( Tr
ýờng hợp ðặc biệt , Nếu R2= thì (R,F) thu hẹp thành
(R1,F1) )

T
ừ mệnh ðề D.3 ta suy ra mệnh ðề D.4 nhý sau:

1.4 M
ệnh ðề D.4
Cho (R,F), g
ọi R1 là các thuộc tính gốc, R2=R – R1.
Th
ì ta phân rã (R,F) thoả mệnh ðề D.3





Trang 25/25

3. Tý týởng thuật toán
Xét (R,F) là lýợc ðồ quan hệ. Ta có thể cãn cứ vào một số yếu tố của các
phụ thuộc hàm trong F , từ ðó có thể phân rã (R,F) thành các (R1,F1),
(R2,F2), (Rn,Fn) thoả mệnh ðề D.3. Việc tìm khoá trên từng thành phần
(Ri,Fi) có ðộ phức tạp thấp hõn nhiều so với (R,F).
Ðể xác ðịnh tập khoá K của (R,F), chúng ta tính:
T=K1
 K2 K3… Kn.
Nh
ý vậy K gồm các phần tử thuộc T , thoả ðiều kiện khoá trên (R,F).

4. Xây dựng thuật toán
4.1 Thuật toán tìm Tích của 2 Sets.
// T
ìm L=L1 x L2
Function MulSets(Var L1, L2 : Sets) : Sets;
Var X,Y: Set;
L : Sets;
Begin
L.Reset();
For i:=1 to L1.SizeOf() do L.Add(L1.Set(i));
For i:=1 to L2.SizeOf() do L.Add(L2.Set(i));
For i:=1 to L1.SizeOf() do
For j:=1 to L2.SizeOf() do
Begin
X:=L1.Set(i);
Y:=L2.Set(j);
L.Add(X


Y);
End;

Return L;
End;


4.2 Thuật toán chọn lọc các Key từ Tập chặn trên.
Procedure SelectKeys( R: Set; F: FDs; Var Keys: Sets)
Var Temp: Sets;
K: Set;
Begin
Temp.Reset( );
For i:=1 to Keys.SizeOf () do
Begin
K:=Keys.Set(i);
If (CheckKey(K,R,F)) Then Temp.Add(K);
End;
Keys:=Temp;
End;



×