Idag läste jag om nedbrytningsalgoritmen 3NF. Det stod:
- Hitta en minimal bas för F, säg G
- För varje FD X → A i G, använd {X, A} som schema för en av relationerna i nedbrytningen
- Om ingen av uppsättningarna av relationer från steg 2 är en supernyckel för R, lägg till en annan relation vars schema är en nyckel för R
Jag vill sönderdela denna relation i 3NF.
R(A,B,C) S={A→B, A→C, B→A, B→C, C→A, C→ B, AB→ C, BC→A, AC→B, A→BC, B→AC, C→AB}
Som vi kan se är nyckeln till R: {A},{B},{C}
S har flera minimala baser, till exempel:
-
{A→B, B→A, B→C, C→B}
; och -
{A→B, B→C, C→A}
Problemet är att om vi använder den första minimibasen, sönderdelar vi R i två relationer : (A, B), (B, C).
Om vi använder den andra minimibasen blir R till: (A, B), (B, C), (C, A).
Min fråga är: vilken är rätt?
Svar
Observera först att originalrelationen finns redan i tredje normala formen, eftersom varje attribut är primärt (varje attribut är faktiskt en nyckel), så att definitionen av 3NF respekteras.
Observera sedan att algoritmen är ofullständig. Stegen är:
- Hitta en minimal bas för F, säg G
- För varje grupp av FD med samma vänster del, X → A 1 , X → A 2 , …, X → A n i G, använd {X, A 1 , A 2 , …, A n } som schemat för en av relationerna i nedbrytningen
- Radera alla relationer vars attribut finns i en annan relation.
- Om ingen av uppsättningarna relationer från steg 2 är en supernyckel för R, lägg till en annan relation vars schema är en nyckel för R.
Så i det första fallet får du tre grupper av beroenden:
A → B B → A B → C C → B
som ger tre relationer, R 1 (A, B), R 2 (A, B, C), R 3 (B, C), och efter algoritmen får du som resultat endast R 2 , eftersom de andra två har attribut som finns i dem.
Så du har två olika utgångar från algoritmen, beroende på den minimala bas som används (vilket i sin tur beror på i vilken ordning du tar hänsyn till beroendeförhållandena vid beräkning av minsta täckning).
Så svaret på din fråga:
vilken en är korrekt?
är: båda är korrekta eftersom de båda uppfyller definitionen av 3NF. Du har helt enkelt upptäckt att syntesalgoritmen för sönderdelning av en relation i 3NF kan producera olika lösningar.
En annan fråga är: vilken är ”bättre”, och naturligtvis är lösningen med en enda relation ”bättre” , eftersom du inte behöver gå med i tabeller när du gör frågor.
Naturligtvis, om man kunde kontrollera i början om relationen redan finns i 3NF, än han kan undvika att tillämpa algoritmen. Men detta kan i allmänhet inte göras, eftersom kontrollen kräver exponentiell beräkning av alla nycklar för att hitta de främsta attributen för relationen.
A First Course in Database System - 3rd edition
. Vilken bör jag följa nu?