Różnica między 3NF a BCNF w prostych słowach (musi być w stanie wyjaśnić 8-latkowi)

Przeczytałem cytat : Dane zależą od klucza [1NF], całego klucza [2NF] i nic poza kluczem [3NF] .

Jednak mam problem ze zrozumieniem 3.5 NF lub BCNF jak to się nazywa. Oto co rozumiem:

  • BCNF jest bardziej rygorystyczne niż 3NF
  • lewa strona dowolnego FD w tabeli musi być superkey (lub przynajmniej klucz kandydata)

Dlaczego więc jest tak, że niektóre tabele 3NF nie są w BCNF? Cytat z 3NF mówi wprost: "nic tylko klucz", co oznacza, że wszystkie atrybuty zależą wyłącznie od klucza podstawowego. Klucz główny jest w końcu kluczem kandydata, dopóki nie zostanie wybrany na nasz klucz główny.

Jeśli coś jest nie tak z moim dotychczasowym zrozumieniem, Proszę mnie poprawić i dziękuję za wszelką pomoc.

Author: Rajith Gun Hewage, 2011-12-09

5 answers

Twoja pizza może mieć dokładnie trzy rodzaje polew:

  • jeden rodzaj sera
  • jeden rodzaj mięsa
  • jeden rodzaj warzyw

Więc zamawiamy dwie pizze i wybieramy następujące dodatki:

Pizza    Topping     Topping Type
-------- ----------  -------------
1        mozzarella  cheese
1        pepperoni   meat
1        olives      vegetable
2        mozzarella  meat
2        sausage     cheese
2        peppers     vegetable
Zaraz, mozzarella nie może być zarówno serem, jak i mięsem! A kiełbasa to nie ser! Musimy zapobiegać tego rodzaju błędom, aby mozzarella była zawsze serem. Powinniśmy użyć do tego osobnej tabeli, więc piszemy w jednym miejscu.
Pizza    Topping
-------- ----------
1        mozzarella
1        pepperoni
1        olives
2        mozzarella 
2        sausage
2        peppers

Topping     Topping Type
----------  -------------
mozzarella  cheese
pepperoni   meat
olives      vegetable
sausage     meat
peppers     vegetable

To było wyjaśnienie, które ośmiolatek może zrozumieć. Oto bardziej techniczna wersja.

BCNF działa inaczej niż 3NF tylko wtedy, gdy istnieje wiele nakładających się kluczy kandydatów.

Powodem jest to, że zależność funkcyjna X -> Y jest oczywiście prawdziwa, jeśli Y jest podzbiorem X. Tak więc w każdej tabeli, która ma tylko jeden klucz kandydata i jest w 3NF, jest już w BCNF, ponieważ nie ma kolumny (klucz lub nie-klucz), który jest funkcjonalnie zależny od niczego poza tym kluczem.

Ponieważ każda pizza musi mieć dokładnie jedną z każdego rodzaju polewy, wiemy, że (Pizza, Rodzaj polewy) jest kluczem kandydata. Wiemy też intuicyjnie, że dana polewa nie może należeć do różnych typów jednocześnie. Tak więc (Pizza, polewa) musi być unikalny i dlatego jest również kluczem kandydata. Więc mamy dwa nakładające się na siebie klucze kandydatów.

Pokazałem anomalię, w której oznaczyliśmy mozarellę jako złą Typ toppingowy. Wiemy, że jest to błędne, ale regułą, która czyni to błędem jest zależność Topping -> Topping Type, która nie jest poprawną zależnością dla BCNF dla tej tabeli. To zależność od czegoś innego niż cały klucz kandydata.

Więc aby to rozwiązać, bierzemy Typ Topping ze stołu pizzy i uczynimy go nie-kluczowym atrybutem w tabeli Toppingów.

 144
Author: Bill Karwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-15 17:07:38

Subtelna różnica polega na tym, że 3NF rozróżnia atrybuty key i non-key (zwane również atrybutami non-prime), podczas gdy bcnf nie.

Jest to możliwe dzięki definicji 3NF Zaniego, która jest równoważna Codd:

Relacja, R, jest w 3NF iff dla każdego nietrywialnego FD (X->A) spełnionego przez R spełniony jest co najmniej jeden z następujących warunków:

(a) X jest superkey dla R, lub

B) A jest kluczowym atrybutem dla R

BCNF wymaga (a), ale nie traktuje (b) jako specjalnego przypadku. Innymi słowy BCNF wymaga, aby każdy nietrywialny wyznacznik był superkeyem, nawet jego zależne atrybuty były częścią klucza.

Relacja, R, jest w bcnf iff dla każdego nietrywialnego FD (X->A) spełnionego przez R spełniony jest następujący warunek:

(a) X jest superkeyem dla R

BCNF jest więc bardziej rygorystyczny.

Różnica jest tak subtelne, że to, co wielu ludzi nieformalnie opisuje jako 3NF, jest w rzeczywistości BCNF. Na przykład, stwierdziłeś tutaj, że 3NF oznacza " dane zależą od klucza[s]... i nic poza kluczem [s]", ale to tak naprawdę nieformalny opis BCNF, a nie 3NF. 3NF można dokładniej opisać jako " Dane niekluczowe zależą od kluczy... i tylko klucze".

Napisałeś także:

Cytat 3NF mówi wprost "nic poza kluczem", co oznacza, że wszystkie atrybuty zależą wyłącznie na głównym kluczu.

To uproszczenie. 3NF i BCNF oraz wszystkie normalne formy dotyczą WSZYSTKICH kluczy kandydujących i / lub superkeys, a nie tylko jednego" podstawowego " klucza.

 78
Author: sqlvogel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-03 21:07:16

Różnica między BCNF i 3NF

Używając definicji BCNF

wtedy i tylko wtedy, gdy dla każdej z jej zależności X → Y, posiada przynajmniej jeden z następujących warunków:

  • X → Y jest trywialną zależnością funkcyjną (Y ⊆ X) lub
  • x jest super kluczem do schematu R

I definicja 3NF

wtedy i tylko wtedy, gdy dla każdej z jego zależności funkcyjnych X → a, co najmniej jeden z następujących warunków posiada:

  • x Zawiera A (tzn. X → A jest trywialną zależnością funkcyjną), lub
  • X jest superkey lub
  • Każdy element A-X, różnica zestawu między A i X, jest atrybutem pierwszym (tzn. każdy atrybut A-X jest zawarty w jakimś kluczu kandydującym)

Widzimy następującą różnicę, w prostych słowach:

  • W BCNF : każdy klucz częściowy (atrybut prime) Może tylko zależeć od superkey,

]}

  • W 3NF: klucz częściowy (atrybut prime) Możerównież zależeć od atrybutu, który jest nie superkey (tj. inny częściowy atrybut klucz / prime lub nawet atrybut nie-prime).

Gdzie

  1. a atrybut prime jest atrybutem znalezionym w kluczu kandydata i
  2. a klucz kandydata jest minimalnym superkeyem dla tej relacji, a
  3. A superkey jest zbiorem atrybutów zmiennej relacji, dla której utrzymuje, że we wszystkich relacjach przypisanych do tej zmiennej nie ma dwóch odrębnych krotek (wierszy), które mają takie same wartości dla atrybutów w tym zbiorze.Równoważnie superkey może być również zdefiniowany jako zbiór atrybutów schematu relacji, od którego wszystkie atrybuty schematu są funkcjonalnie zależne. (Klucz superkey zawsze zawiera klucz kandydata/klucz kandydata jest zawsze podzbiorem klucza superkey. Ty może dodać dowolny atrybut w relacji, aby uzyskać jeden z superkluczy.)

Oznacza to, że żaden częściowy podzbiór (dowolny Nie trywialny podzbiór z wyjątkiem pełnego zestawu) klucza kandydata nie może być funkcjonalnie zależny od niczego innego niż superkey.

Tabela/relacja nie w BCNF podlega anomaliom, takim jak anomalie aktualizacji wymienione w przykładzie pizza przez innego użytkownika. Niestety,

  • BNCF nie można zawsze otrzymać , while
  • 3NF zawsze można otrzymać.

3NF kontra Bcnf przykład

Przykład różnicy można obecnie znaleźć w" tabela 3NF nie spełniająca bcnf (Boyce–Codd normal form) "na Wikipedii, gdzie poniższa tabela spełnia 3NF, ale nie BCNF, ponieważ" kort tenisowy "(częściowy klucz/atrybut prime) zależy od" Rate Type " (częściowy klucz/atrybut prime, który jest , a nie superkey), która jest zależnością możemy określić za pomocą pytanie do klientów bazy danych, Klub tenisowy:

dzisiejsze Rezerwacje kortów tenisowych (3NF, nie BCNF )

Court   Start Time  End Time    Rate Type
------- ----------  --------    ---------
1       09:30       10:30       SAVER
1       11:00       12:00       SAVER
1       14:00       15:30       STANDARD
2       10:00       11:30       PREMIUM-B
2       11:30       13:30       PREMIUM-B
2       15:00       16:30       PREMIUM-A

Superklucze tabeli to:

S1 = {Court, Start Time}
S2 = {Court, End Time}
S3 = {Rate Type, Start Time}
S4 = {Rate Type, End Time}
S5 = {Court, Start Time, End Time}
S6 = {Rate Type, Start Time, End Time}
S7 = {Court, Rate Type, Start Time}
S8 = {Court, Rate Type, End Time}
ST = {Court, Rate Type, Start Time, End Time}, the trivial superkey

Problem z 3NF : Atrybut partial key / prime "Court" jest zależny od czegoś innego niż superkey. Zamiast tego jest on zależny od częściowego atrybutu key / prime "Rate Type". Oznacza to, że użytkownik musi ręcznie zmienić typ stawki, jeśli ulepszymy sąd, lub ręcznie zmienić sąd, jeśli chce zastosować zmianę stawki.

  • ale co, jeśli użytkownik ulepszy sąd, ale nie pamięta, aby zwiększyć stawkę? A co jeśli do sądu zostanie zastosowany niewłaściwy typ stawki?

(pod względem technicznym nie możemy zagwarantować, że zależność funkcjonalna "typu stopy" -> "sądu" nie zostanie naruszona.)

Rozwiązanie BCNF : Jeśli chcemy umieścić powyższą tabelę w BCNF możemy rozłożyć daną relację/tabelę na następujące dwie relacje / tabele (zakładając, że wiemy, że typ stawki zależy tylko od kortu i statusu członkostwa, które możemy odkryć pytając klientów naszej bazy danych, właścicieli klubu tenisowego): {]}

typy stawek (BCNF i słabszy 3NF, który jest implikowany przez BCNF)

Rate Type   Court   Member Flag
---------   -----   -----------
SAVER       1       Yes
STANDARD    1       No
PREMIUM-A   2       Yes
PREMIUM-B   2       No

dzisiejsze Rezerwacje kortów tenisowych (BCNF i słabszy 3NF, który jest implikowany przez BCNF)

Member Flag     Court     Start Time   End Time
-----------     -----     ----------   --------
Yes             1         09:30        10:30
Yes             1         11:00        12:00
No              1         14:00        15:30
No              2         10:00        11:30
No              2         11:30        13:30
Yes             2         15:00        16:30

Problem Rozwiązany : Teraz, jeśli ulepszymy sąd możemy zagwarantować, że typ stawki będzie odzwierciedlał tę zmianę i nie możemy pobierać niewłaściwej ceny za sąd.

(pod względem technicznym możemy zagwarantować, że funkcjonalna zależność "Typ stawki" - > "sąd" nie zostanie naruszona.)

 21
Author: AGéoCoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-17 08:44:29

Wszystkie dobre odpowiedzi. Mówiąc prostym językiem [BCNF] żaden klucz częściowy nie może zależeć od klucza.

Tzn. żaden podzbiór częściowy (tzn. żaden nie trywialny podzbiór z wyjątkiem pełnego zbioru ) klucza kandydata nie może być funkcjonalnie zależny od jakiegoś klucza kandydata.

 5
Author: smartnut007,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-13 17:38:03

Odpowiedzi użytkownika ' smartnut007', 'Bill Karwin " i " sqlvogel " są doskonałe. Pozwolę sobie jednak spojrzeć na to z ciekawej perspektywy.

Mamy klucze prime i non-prime.

Kiedy skupiamy się na tym, jak nie-pierwsze zależą od liczb pierwszych, widzimy dwa przypadki:

Non-primes mogą być zależne lub nie.

  • gdy są zależne: widzimy, że muszą zależeć od pełnego klucza kandydata. To jest 2NF .
  • Gdy nie jest zależna: nie może być-zależność lub zależność przechodnia

    • nawet zależność przechodnia: Nie wiem, jaka teoria normalizacji to rozwiązuje.
    • gdy jest zależna przejściowo: jest uważana za niepożądaną. To jest 3NF .

A co z zależnościami między liczbami pierwszymi?

Teraz widzisz, nie zajmujemy się relacją zależności między pierwsze przez 2. lub 3. NF. Dalsze takie zależności, jeśli w ogóle istnieją, nie są pożądane i dlatego mamy jedną regułę, aby się tym zająć. To jest BCNF .

Nawiązując do przykładu z Billa Karwina , zauważysz, że zarówno' Topping', jak i' topping Type ' są kluczami pierwszymi i mają zależność. Gdyby nie były primami z zależnością, to 3NF by zadziałało.

Uwaga:

The definicja BCNF jest bardzo ogólna i bez różnicowania atrybutów między prime i non-prime. Jednak powyższy sposób myślenia pomaga zrozumieć, w jaki sposób pewna anomalia jest perkolowana nawet po 2. i 3. NF.

Temat zaawansowany: mapowanie generycznego BCNF na 2NF i 3NF

teraz, gdy wiemy, że BCNF zawiera ogólną definicję bez odniesienia do jakichkolwiek atrybutów prime / non-prime, zobaczmy, jak BCNF i 2/3 NF są ze sobą powiązane.

Po pierwsze, bcnf wymaga (poza trywialny przypadek), że dla każdej zależności funkcyjnej X -> Y (FD), X powinien być super-kluczem. Jeśli weźmiemy pod uwagę dowolny FD, to mamy trzy przypadki-(1) zarówno X, jak i Y nie-prime, (2) zarówno prime, jak i (3) X prime i Y non-prime, odrzucając (bezsensowny) przypadek X non-prime i Y prime.

W przypadku (1), 3NF się tym zajmuje.

W przypadku (3), 2NF się tym zajmuje.

Dla case (2), znajdujemy użycie BCNF

 4
Author: KGhatak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-16 13:31:03