20

Mam problem z ustaleniem, kiedy relacja jest w formie normalnej Boyce-Codd i jak rozłożyć informację BCNF, jeśli nie jest. Biorąc pod uwagę ten przykład:Dekompozycja relacji do BCNF

R (A, C, B, D, E) o zależnościach funkcjonalnych: A -> B, C -> D

Jak mogę iść o rozkładając go?

kroki wziąłem to:

A+ = AB 
C+ = CD 
R1 = A+ = **AB** 
R2 = ACDE (since elements of C+ still exist, continue decomposing) 
R3 = C+ = **CD** 

R4 = ACE (bez zamknięcia FD przebywać w tej relacji)

Więc teraz wiem, że ACE będzie komponować cały związek, ale odpowiedź na dekompozycję to: AB, CD, ACE.

Przypuszczam, że zmagam się z tym, jak prawidłowo rozłożyć relację w formularzu BCNF i jak powiedzieć, kiedy skończysz. Byłbym wdzięczny każdemu, kto może przeprowadzić mnie przez proces myślenia podczas rozwiązywania tych problemów. Dzięki!

+0

Czy przeczytałeś wszystkie pytania dotyczące BCNF na pasku bocznym? –

+0

Przeczytałem jeden przykład, który wydaje się pomagać przy dekompozycji. Myślę, że rozumiem tę część w porządku, ale wciąż jestem nieco zdezorientowany, kiedy całkowicie się rozpadasz. Czy to jest, gdy twoje relacje nie zawierają już wszystkich atrybutów w ramach zamknięcia jednej z twoich funkcjonalnych zależności? – raphnguyen

+0

Relacja jest w BCNF, gdy każda "strzałka" w każdej zależności funkcjonalnej jest "strzałką" z klucza kandydującego. –

Odpowiedz

83

Mimo że pytanie jest stare, pozostałe pytania/odpowiedzi nie wydają się dostarczać bardzo jasnej ogólnej odpowiedzi krok po kroku dotyczącej określania i rozkładu stosunków z BCNF.

1. Ustalanie BCNF:
uzyskać stosunek R być w BCNF wszystkie funkcjonalne zależności (FD), które utrzymują się w R musi spełniać tę właściwość, że determinanty X są wszystkie superkeys R. czyli jeśli X- > Y trzyma R, następnie X musi być superkey R, aby być w BCNF.

W twoim przypadku można pokazać, że jedynym kluczem kandydującym (minimalny klawisz pomocniczy) jest ACE. więc zarówno FD A-> B i C> D łamią BCNF jako A i C nie są superkeys lub R.

2. R ulegają rozpadowi do postaci BCNF:
R nie jest BCNF , rozkładamy R na zbiór relacji S, które są w BCNF.
Można to zrealizować w bardzo prosty algorytm:

Initialize S = {R} 
While S has a relation R' that is not in BCNF do: 
    Pick a FD: X->Y that holds in R' and violates BCNF 
    Add the relation XY to S 
    Update R' = R'-Y 
Return S 

W danym przypadku kolejnych etapów są następujące:

S = {ABCDE}  // Intialization S = {R} 
S = {ACDE, AB} // Pick FD: A->B which violates BCNF 
S = {ACE, AB, CD} // Pick FD: C->D which violates BCNF 
// Return S as all relations are in BCNF 

Zatem R (A, B, C, D, E) rozłożony na zbiór relacji: R1 (A, C, E), R2 (A, B) i R3 (C, D), który spełnia BCNF.

Należy również zauważyć, że w tym przypadku zależność funkcjonalna jest zachowana, ale normalizacja do BCNF nie gwarantuje tego.

Mam nadzieję, że to pomoże.

+3

Twoje wyjaśnienie i krok po kroku iteracja była doskonała. Dziękuję –

+0

Pamiętaj, że musisz przechowywać zależności funkcjonalne wzdłuż 'R', ponieważ musisz analizować krotkę' (R ', Σ') 'w każdej iteracji. Zatem 'S' powinno wyglądać tak:' S = [(R_1, Σ_1); (R_2, Σ_2); ...; (R_n, Σ_n)} '. Polecam również zaktualizować 'R'' w ten sposób' R '= X (R' - Y) '. – Pengxer

1

1NF -> 2NF -> 3NF -> BCNF

Według danej FD ustawić "ace" formy klawisz. Najwyraźniej R (A, B, C, D, E) nie ma wartości 2NF. Rozkład 2NF daje R1 (A, B), R2 (C, D) i R3 (A, C, E). ta dekompozycja rozłożone relacje są w 3NF, a także w BCNF.