Vandaag heb ik gelezen over het 3NF-decompositie-algoritme. Er stond:
- Zoek een minimale basis van F, zeg G
- Voor elke FD X → A in G, gebruik {X, A} als het schema van een van de relaties in de decompositie
- Als geen van de sets relaties uit Stap2 een superkey is voor R, voeg dan een andere relatie toe waarvan het schema een sleutel is voor R
Ik wil deze relatie ontleden in 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}
Zoals we kunnen zien, is de sleutel van R: {A},{B},{C}
S heeft verschillende minimale basis, zoals:
-
{A→B, B→A, B→C, C→B}
; en -
{A→B, B→C, C→A}
Het probleem is dat als we de eerste minimale basis gebruiken, we R opsplitsen in 2 relaties : (A, B), (B, C).
Als we de 2e minimale basis gebruiken, verandert R in: (A, B), (B, C), (C, A).
Mijn vraag is: welke is juist?
Antwoord
Merk allereerst op dat de De oorspronkelijke relatie is al in de derde normale vorm, aangezien elk attribuut een priemgetal is (elk attribuut is eigenlijk een sleutel), zodat de definitie van 3NF wordt gerespecteerd.
Merk dan op dat het algoritme onvolledig is. De stappen zijn:
- Zoek een minimale basis van F, zeg G
- Voor elke groep FD met dezelfde linkerdeel, X → A 1 , X → A 2 , …, X → A n in G, gebruik {X, A 1 , A 2 , …, A n } als het schema van een van de relaties in de decompositie
- Verwijder alle relaties waarvan de attributen in een andere relatie zijn opgenomen.
- Als geen van de sets relaties uit stap 2 een superkey is voor R, voeg dan een andere relatie toe waarvan het schema een sleutel is voor R.
Dus in het eerste geval krijg je drie groepen afhankelijkheden:
A → B B → A B → C C → B
die drie relaties produceren, R 1 (A, B), R 2 (A, B, C), R 3 (B, C), en, volgens het algoritme, krijg je als resultaat alleen R 2 , aangezien de andere twee attributen bevatten.
Je hebt dus twee verschillende outputs van het algoritme, afhankelijk van de minimale gebruikte basis (die op zijn beurt afhangt van de volgorde waarin u rekening houdt met de afhankelijkheden bij het berekenen van de minimale dekking).
Dus het antwoord op uw vraag:
welke een is correct?
is: beiden zijn correct , aangezien ze allebei voldoen aan de definitie van de 3NF. Je hebt simpelweg ontdekt dat het synthese-algoritme voor het ontleden van een relatie in 3NF verschillende oplossingen kan opleveren.
Een andere vraag is: wat is “beter”, en natuurlijk is de oplossing met een enkele relatie “beter” , aangezien je geen tabellen hoeft samen te voegen bij het maken van queries.
Natuurlijk, als men aan het begin zou kunnen controleren of de relatie al in 3NF staat, dan kan hij vermijden om het algoritme toe te passen. Maar dit is in het algemeen niet mogelijk, aangezien de controle de exponentiële berekening van alle sleutels vereist om de belangrijkste attributen van de relatie te vinden.
A First Course in Database System - 3rd edition
. Welke moet ik nu volgen?