Lab 9
back
Link do IDroo: https://idroo.com/board-sVDidbHrLP
Zadanie 1
Dana relacja R(ABCDEF) z zależnościami funkcyjnymi:
X={AB→C,C→E,D→E,C→D}
Nadklucze: {ABCDEF,ABCDF,ABCEF,ABDEF,ABCF,ABDF,ABF}
Klucz: ABF
Normalizacja do 3NF:
Aby zminimalizować zbiór X należy wyrzucić zależność C→E, bo wynika ona z C→D oraz D→E.
X′={AB→C,D→E,C→D}
Pozostałe zalezności już są minimalne, robimy więc relację dla każdej z nich:
R1=(ABC,{AB→C}), klucz AB
R2=(CD,{C→D})), klucz C
R3=(DE,{D→E})), klucz D
No i brakuje nam relacji reprezentującej cały klucz.
R4=(ABF,{}), klucz ABF
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 R.
Najpierw liczymy X∗:
X∗={AB→CDE,C→DE,D→E}
Zależność AB→CDE narusza BCNF, bo AB nie jest nadkluczem (nie implikuje F). W związku z tym dzielimy na dwie tabele:
T1=(ABCDE,{AB→CDE,C→DE,D→E})
T2=(ABF,{})
Tabela T2 jest już w BCNF, bo nie ma żadnych zależności funkcyjnych i cały zbiór kolumn jest jedynym kluczem. W tabeli T1 nadkluczem jest teraz AB. W związku z tym zależnośc C→DE psuje BCNF, dzielimy więc T1 na T3 i T4:
T2=(ABF,{})
T3=(CDE,{C→DE,D→E})
T4=(ABC,{AB→C})
Dla T3 kluczem jest C, więc ostatnim krokiem jest rozbicie T3 przez zależność D→E na T5 i T6:
T2=(ABF,{})
T4=(ABC,{AB→C})
T5=(CD,{C→D})
T6=(DE,{D→E})
Dostaliśmy te same tabele co dla 3NF-a, wszystkie zależności da się odzyskać.
Zadanie 2
Relacja R(ABCDE) z zależnościami:
X={AB→CD,C→E,D→E}
Nadklucze: {ABCDE,ABCD,ABCE,ABDE,ABC,ABD,ABE,AB}
Klucz: AB
Normalizacja do 3NF
Minimalna reprezentacja X:
X′={AB→C,AB→D,C→E,D→E}
Dzielimy na 4 tabele:
R1=(ABC,{AB→C}), klucz AB
R2=(ABD,{AB→D}), klucz AB
R3=(CE,{C→E}), klucz C
R4=(DE,{D→E}), klucz D
Klucz jest zawarty zarówno w R1 jak i w R2, 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 R1 i R2 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 X przedefiniować: łączymy wszystkie takie zależności X→Y, X→Z, że Y ani Z nie należą do żadnego klucza. W tym przypadku połączylibyśmy AB→C i AB→D i dostalibyśmy tabelę (ABCD,{AB→CD}). Dowód tego, że algorytm nadal działa i zwraca 3NF jest dość prosty.
Normalizacja do BCNF
Liczymy dopełnienie:
X∗={AB→CDE,C→E,D→E}
Zależność C→E łamie BCNF, dzielimy.
T1=(CE,{C→E})
T2=(ABCD,{AB→CD})
I to tyle, obie tabele są w BCNF. Straciliśmy jednak zależność D→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.
back