2012-04-15 15 views
5

Potrzebuję pomocy i wskazówek.Jak uzyskać minimalny klucz z zależności funkcjonalnych?

Mam następującą zależność: R = {A, B, C, D, E, F} i zbiór zależności funkcyjnych

 
F = { 
    {AB -> C}; 
    {A -> D}; 
    {D -> AE}; 
    {E -> F}; 
} 

Jaki jest klucz podstawowy dla R?

Gdybym stosować zasady wnioskowania i uzyskać te dodatkowe zależności funkcyjne:

D -> A 
D -> E 
D -> F 

D -> AEF 

A -> E 
A -> F 
A -> DEF 

Jak mogę kontynuować?

+1

Uważam, że A i D stanowią 1-1 odpowiednik w schemacie. – RBarryYoung

+2

Ten proces niekoniecznie określa klucz podstawowy (pojedynczy klucz). ("Klucz podstawowy" jest na dobrej drodze do bycia głównie pojęciem SQL, a nie pojęciem relacyjnym). Ten proces, właściwie zastosowany, da ci * zestaw * kluczy kandydujących. Jak wybrać klucz podstawowy z zestawu kluczy kandydatów nie jest częścią procesu. –

+0

Tak, masz rację. Ten proces da ci klucze do kandydatów :)) – mrjasmin

Odpowiedz

5

Jest to dobrze znany algorytm. Nie pamiętam tego, ale ćwiczenie wydaje się dość proste, aby go nie używać.

Myślę, że to wszystko o przechodniości:

CurrentKey = {A, B, C, D, E, F} 

Wiesz D określa, E i F. E określa Stąd D określa F od przechodniości. Jak F nie przesądza niczego, możemy go usunąć i jako E może być uzyskane z D możemy go usunąć, a także:

CurrentKey = {A, B, C, D} 

jako AB określa C i C nie ma niczego ustalić, wiemy, że może” t być częścią klucza, więc usunięcie go:

CurrentKey = {A, B, D} 

Wreszcie wiemy określa D więc możemy wyjąć z kluczem:

CurrentKey = {A, B} 

Jeśli raz masz ten możliwego klucza, możesz odtworzyć wszystkie zależności funkcjonalne es jest to możliwy klucz.

PS: Jeśli zdarzy się, że algorytm poręczny, opublikuj go jako byłbym zadowolony, że ponownie nauczyć :)

+0

Dziękuję bardzo :) Nie słyszałem o żadnym algorytmie, znam tylko niektóre reguły wnioskowania, które można wykorzystać do wyprowadzenia nowych zależności funkcjonalnych :)) – mrjasmin

+0

@ user1285737 Nie trzeba dziękować , to jest to, co akceptuje odpowiedzi :) W każdym razie istnieje algorytm, który dostarczy ci właściwego wyniku, niezależnie od złożoności relacji i zależności funkcjonalnych. Żałuję, że nie pamiętam: "( –

+0

hehe Też chcę nauczyć się algorytmu: ((I – mrjasmin

-1

Algorytm: Key obliczeń (wezwanie z x = ∅)

procedure key(x;A;F) 
foreach ! B 2 F do 
if x and B 2 x and B ̸2 then 
return; /* x not minimal */ 
fi 
od 
if x+ = A then 
print x; /* found a minimal key x */ 
else 
X any element of A x+; 
key(x [ fXg;A;F); 
foreach ! X 2 F do 
key(x [ ;A;F); 
od 
fi 
Powiązane problemy