Hur sönderdelas denna relation i 3NF-relationer?

Idag läste jag om nedbrytningsalgoritmen 3NF. Det stod:

  1. Hitta en minimal bas för F, säg G
  2. För varje FD X → A i G, använd {X, A} som schema för en av relationerna i nedbrytningen
  3. 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:

  1. {A→B, B→A, B→C, C→B}; och
  2. {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:

  1. Hitta en minimal bas för F, säg G
  2. 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
  3. Radera alla relationer vars attribut finns i en annan relation.
  4. 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.

Kommentarer

  • Tack för ditt svar! Men hur producerade du tre förhållanden: R1 (A, B), R2 (A, B, C), R3 (B, C)? Jag trodde att den bara har R1 och R3. R2 är den ursprungliga relationen.
  • För det andra steget i den korrekta algoritmen finns det två beroenden med samma vänstra del, B → A och B → C, så du bör sätta ihop alla attribut och få förhållandet (A, B, C). Det dikteras bara av algoritmen.
  • Oj, jag visste inte ' om det andra steget. Jag tog algoritmen från en bok med namnet A First Course in Database System - 3rd edition. Vilken bör jag följa nu?
  • Den algoritmen är inte komplett. Alla större böcker om databaser har den algoritm som jag har beskrivit i svaret.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *