Lab 9

backback

Link do IDroo: https://idroo.com/board-sVDidbHrLP

Zadanie 1

Dana relacja R(ABCDEF)R(ABCDEF) z zależnościami funkcyjnymi:
X={ABC,CE,DE,CD}X = \{AB \rightarrow C, C \rightarrow E, D \rightarrow E, C \rightarrow D\}

Nadklucze: {ABCDEF,ABCDF,ABCEF,ABDEF,ABCF,ABDF,ABF}\{ABCDEF, ABCDF, ABCEF, ABDEF, ABCF, ABDF, ABF\}
Klucz: ABFABF

Normalizacja do 3NF:

Aby zminimalizować zbiór XX należy wyrzucić zależność CEC \rightarrow E, bo wynika ona z CDC \rightarrow D oraz DED \rightarrow E.

X={ABC,DE,CD}X' = \{AB \rightarrow C, D \rightarrow E, C \rightarrow D\}

Pozostałe zalezności już są minimalne, robimy więc relację dla każdej z nich:

R1=(ABC,{ABC})R_1 = (ABC, \{AB \rightarrow C\}), klucz ABAB
R2=(CD,{CD}))R_2 = (CD, \{C \rightarrow D\})), klucz CC
R3=(DE,{DE}))R_3 = (DE, \{D \rightarrow E\})), klucz DD

No i brakuje nam relacji reprezentującej cały klucz.

R4=(ABF,{})R_4 = (ABF, \{\}), klucz ABFABF

Normalizacja do BCNF

Łatwo zauważyć, że wszystkie relacje uzyskane z normalizacji do 3NF są też w BCNF. Jako ćwiczenie, zobaczmy algorytm normalizacji do BCNF odpalony na RR.

Najpierw liczymy XX^*:
X={ABCDE,CDE,DE} X^* = \{AB \rightarrow CDE, C \rightarrow DE, D \rightarrow E\}
Zależność ABCDEAB \rightarrow CDE narusza BCNF, bo ABAB nie jest nadkluczem (nie implikuje FF). W związku z tym dzielimy na dwie tabele:

T1=(ABCDE,{ABCDE,CDE,DE})T_1 = (ABCDE, \{AB \rightarrow CDE, C \rightarrow DE, D \rightarrow E\})
T2=(ABF,{})T_2 = (ABF, \{\})

Tabela T2T_2 jest już w BCNF, bo nie ma żadnych zależności funkcyjnych i cały zbiór kolumn jest jedynym kluczem. W tabeli T1T_1 nadkluczem jest teraz ABAB. W związku z tym zależnośc CDEC \rightarrow DE psuje BCNF, dzielimy więc T1T_1 na T3T_3 i T4T_4:

T2=(ABF,{})T_2 = (ABF, \{\})
T3=(CDE,{CDE,DE})T_3 = (CDE, \{C \rightarrow DE, D \rightarrow E\})
T4=(ABC,{ABC})T_4 = (ABC, \{AB \rightarrow C\})

Dla T3T_3 kluczem jest CC, więc ostatnim krokiem jest rozbicie T3T_3 przez zależność DED \rightarrow E na T5T_5 i T6T_6:

T2=(ABF,{})T_2 = (ABF, \{\})
T4=(ABC,{ABC})T_4 = (ABC, \{AB \rightarrow C\})
T5=(CD,{CD})T_5 = (CD, \{C \rightarrow D\})
T6=(DE,{DE})T_6 = (DE, \{D \rightarrow E\})

Dostaliśmy te same tabele co dla 3NF-a, wszystkie zależności da się odzyskać.

Zadanie 2

Relacja R(ABCDE)R(ABCDE) z zależnościami:
X={ABCD,CE,DE} X = \{AB \rightarrow CD, C \rightarrow E, D \rightarrow E\}

Nadklucze: {ABCDE,ABCD,ABCE,ABDE,ABC,ABD,ABE,AB}\{ABCDE, ABCD, ABCE, ABDE, ABC, ABD, ABE, AB\}
Klucz: ABAB

Normalizacja do 3NF

Minimalna reprezentacja XX:
X={ABC,ABD,CE,DE} X' = \{AB \rightarrow C, AB \rightarrow D, C \rightarrow E, D \rightarrow E\}

Dzielimy na 44 tabele:

R1=(ABC,{ABC})R_1 = (ABC, \{AB \rightarrow C\}), klucz ABAB
R2=(ABD,{ABD})R_2 = (ABD, \{AB \rightarrow D\}), klucz ABAB
R3=(CE,{CE})R_3 = (CE, \{C \rightarrow E\}), klucz CC
R4=(DE,{DE})R_4 = (DE, \{D \rightarrow E\}), klucz DD

Klucz jest zawarty zarówno w R1R_1 jak i w R2R_2, więc to już koniec.

Nie tracimy żadnych zależności, bo to głupie pytanie jest w ogóle: normalizacja do 3NF nigdy nie powoduje utraty zależności. Co więcej, dostaliśmy też BCNF na każdej tabeli.

Przy okazji widać tutaj pewien minus tego algorytmu: tabele R1R_1 i R2R_2 moglibyśmy połączyć i nadal mieć 3NF. Żeby zapobiec takiemu niepotrzebnemu dzieleniu tabel, które później będziemy musieli joinować, można nasze minimalne pokrycie XX przedefiniować: łączymy wszystkie takie zależności XYX \rightarrow Y, XZX \rightarrow Z, że YY ani ZZ nie należą do żadnego klucza. W tym przypadku połączylibyśmy ABCAB \rightarrow C i ABDAB \rightarrow D i dostalibyśmy tabelę (ABCD,{ABCD})(ABCD, \{AB \rightarrow CD\}). Dowód tego, że algorytm nadal działa i zwraca 3NF jest dość prosty.

Normalizacja do BCNF

Liczymy dopełnienie:
X={ABCDE,CE,DE} X^* = \{AB \rightarrow CDE, C \rightarrow E, D \rightarrow E\}

Zależność CEC \rightarrow E łamie BCNF, dzielimy.

T1=(CE,{CE})T_1 = (CE, \{C \rightarrow E\})
T2=(ABCD,{ABCD})T_2 = (ABCD, \{AB \rightarrow CD\})

I to tyle, obie tabele są w BCNF. Straciliśmy jednak zależność DED \rightarrow E. Ale halo, halo, przecież przed chwilą dostaliśmy schemat, który był w BCNF i nie tracił tej zależności! Morał: przed normalizacją do BCNF zawsze warto wykonać normalizację do 3NF. Dopiero kiedy po normalizacji do 3NF nie jesteśmy w BCNF odpalamy normalizację do BCNF.

backback