辨析
1. 候選碼:其閉包為整個U,也就是說U是完全依賴於候選碼的(大多數情況存在傳遞依賴),候選碼可能有多個。
2. 超碼:U是部分依賴於超碼的,簡單來說就是超碼是候選碼中加了一些可有可無的東西。
3. 主碼:如果候選碼多於一個,則選擇其中一個作為主碼(因為隨便哪個都能能被U完全依賴)。
(主碼、候選碼都稱為碼,要自己分析)
4. 主屬性:包含在任何一個候選碼中的屬性為主屬性,意思就是所有候選碼的並集的組合拆分為一個一個屬性(主屬性不可能什么都沒有,有可能是整個U),這些屬性就是主屬性。(可以在候選碼練習中看到)
方法
1. L類:只在左邊出現
R類:只在右邊出現
LR類:同時在左邊和右邊出現
NULL類:左邊右邊都沒有出現
2. 先化簡,將右邊全部拆為1個值。
屬於L類的都是候選碼的一部分,並且都是主屬性。如果此類已經可以直接推出U,則表示候選碼就是L類的了,無需繼續后面的操作
屬於R類的都一定不在候選碼里
屬於LR類的:1. 如果L類有,且只有L類無法推出U,就依次拿單個LR類與L類的組合,看是不是碼
2. 如果經過與第一輪與一個LR匹配后,剩下的不能匹配的LR則兩兩組合,再與L全體組合看能不能推出U,如果可以,也是候選碼。
3. 以此類推......
例題
R<U,F>,U=(A,B,C,D,E,G),F={AB-->C,CD-->E,E-->A,A-->G}
1. 左邊集合為{ABCDE},右邊集合為{ACEG}。可知BD只在左邊出現,一定為候選碼的一部分,BD+->BD;G只在右邊出現,一定不在候選碼中。
2. BD與A組合,求ABD的閉包:ABD+->ABD
AB->C => ABD+->ABCD
CD->E => ABD+->ABCDE
A->G => ABD+->ABCDEG=U,因此ABD為候選碼
BD與C組合,求BCD的閉包:BCD+->BCD
CD->E => BCD+->BCDE
E->A => BCD+->ABCDE
A->G => BCD+->ABCDEG=U,因此BCD也為候選碼
BD與E組合,求BDE的閉包:BDE+->BDE
E->A => BDE+->ABDE
AB->C => BDE+->ABCDE
A->G => BDE+->ABCDEG=U,因此BDE也為候選碼
3. 因此ABD、BCD、BDE皆為候選碼,主屬性為A、B、C、D、E。
R(A, B, C, D), F={B->D, AB->C}
1. 左邊={AB},右邊={CD},候選碼為AB,主屬性為A、B。
R(A, B, C, D), F={A->B, A->C, D->A}
1. 左邊={AD},右邊={ABC},因此候選碼不可能有B、C;必然有D,D+->DABC=U。因此D為候選碼,主屬性為D。
R(A, B, C, D), F={BCD->A, A->C}
1. 左邊={ABCD},右邊={AC}。BD是左邊獨有的,一定是候選碼的一部分,BD+->BD。
2. BD與A組合,ABD+ -> ABDC=U,因此ABD為候選碼。
BD與C組合,BCD+ -> ABCD=U,因此BCD為候選碼。
3. ABD、BCD皆為候選碼,主屬性為A、B、C、D。
R(A, B, C, D), F={B->C, B->D, CD->A}
1. 左邊={BCD},右邊={ACD},A不可能是候選碼,B是候選碼一部分,B+->BCDA=U,因此候選碼為B,主屬性為B
R(A, B, C, D, E, F), F={A->BC, CD->E, B->D, BE->F, EF->A}
1. L類:無;R類:無;
LR類:A、B、C、D、E、F;NULL類:無
2. 先將右邊全部化簡為1個,F={A->B, A->C, CD->E, B->D, BE->F, EF->A}
2. A+ -> {A, B, C, D, E, F},A是候選碼
B+ -> {BD}
C+ -> {C}
D+ -> {D}
E+ -> {E}
3. BC+ -> {B, C, D, E, F, A},BC是候選碼
BD+ -> {B, D}
BE+ -> {B, E, D, F, A, C},BE是候選碼
BF+ -> {B, F, D}
CD+ -> {C, D, E}
CE+ -> {C, E}
CF+ -> {C, F}
DE+ -> {D, E}
DF+ -> {D, F}
EF+ -> {E, F, A, B, C, D},EF是候選碼
4. 不能有A,BC,BE,EF
BDF+ -> {B, D, F}
CDE+ -> {C, D, E}
CDF+ -> {C, D, F, E, A, B},CDF是候選碼
5. 綜上,A、BC、BE、EF、CDF為候選碼;主屬性為A、B、C、D、E、F。