Przeczytałem cytat: dane zależą od klucza [1NF], całego klucza [2NF] i nic oprócz klucza [3NF] .
Jednak mam problem ze zrozumieniem 3.5NF lub BCNF, jak to się nazywa. Oto co rozumiem:
- BCNF jest bardziej rygorystyczny niż 3NF
- lewa strona dowolnego FD w tabeli musi być superkluczem (lub przynajmniej kluczem kandydującym)
Dlaczego więc jest tak, że niektóre tabele 3NF nie znajdują się w BCNF? Mam na myśli, że cytat 3NF wyraźnie mówi „tylko klucz”, co oznacza, że wszystkie atrybuty zależą wyłącznie od klucza podstawowego. W końcu klucz podstawowy jest kluczem kandydującym, dopóki nie zostanie wybrany jako nasz klucz podstawowy.
Jeśli do tej pory coś jest nie w porządku, popraw mnie i dziękuję za wszelką pomoc, jakiej możesz udzielić.
database
relational-database
database-normalization
3nf
Arnab Datta
źródło
źródło
Odpowiedzi:
Twoja pizza może mieć dokładnie trzy rodzaje dodatków:
Zamawiamy więc dwie pizze i wybieramy następujące dodatki:
Chwileczkę, mozzarella nie może być jednocześnie serem i mięsem! A kiełbasa to nie ser!
Musimy zapobiegać tego rodzaju błędom, aby mozzarella zawsze była serem. Powinniśmy użyć do tego osobnej tabeli, więc zapisujemy ten fakt tylko w jednym miejscu.
To było wyjaśnienie, które ośmiolatek mógłby zrozumieć. Oto bardziej techniczna wersja.
BCNF działa inaczej niż 3NF tylko wtedy, gdy istnieje wiele nakładających się kluczy kandydujących.
Powodem jest to, że zależność funkcjonalna
X -> Y
jest oczywiście prawdziwa, jeśliY
jest podzbioremX
. Tak więc w każdej tabeli, która ma tylko jeden klucz kandydujący i znajduje się w 3NF, znajduje się już w BCNF, ponieważ nie ma kolumny (ani klucza, ani nieklucza), która jest funkcjonalnie zależna od czegokolwiek poza tym kluczem.Ponieważ każda pizza musi mieć dokładnie jeden z każdego rodzaju polewy, wiemy, że (Pizza, rodzaj polewy) jest kluczem kandydującym. Wiemy też intuicyjnie, że dany topping nie może należeć jednocześnie do różnych typów. Tak więc (Pizza, Topping) musi być niepowtarzalna i dlatego jest również kluczem kandydującym. Mamy więc dwa nakładające się klucze kandydatów.
Pokazałem anomalię, w której oznaczyliśmy mozarellę jako niewłaściwy rodzaj polewy. Wiemy, że to jest złe, ale regułą, która czyni to błędnym, jest zależność,
Topping -> Topping Type
która nie jest poprawną zależnością dla BCNF dla tej tabeli. Jest to zależność od czegoś innego niż cały klucz kandydata.Aby rozwiązać ten problem, usuwamy typ toppingu z tabeli Pizze i ustawiamy go jako atrybut niebędący kluczem w tabeli Toppings.
źródło
Subtelna różnica polega na tym, że 3NF rozróżnia atrybuty kluczowe i niekluczowe (zwane również atrybutami innymi niż główne ), podczas gdy BCNF nie.
Najlepiej można to wyjaśnić, używając definicji 3NF Zaniolo , która jest równoważna z definicją Codda:
BCNF wymaga (a), ale nie traktuje (b) jako własnego przypadku specjalnego. Innymi słowy, BCNF wymaga, aby każdy nietrywialny wyznacznik był superkluczem, nawet jego atrybuty zależne są częścią klucza.
Dlatego BCNF jest bardziej rygorystyczny.
Różnica jest tak subtelna, że to, co wielu ludzi określa nieformalnie jako 3NF, jest w rzeczywistości BCNF. Na przykład, napisałeś tutaj, że 3NF oznacza „dane zależą od klucza [ów]… i nic poza kluczem [s]”, ale jest to naprawdę nieformalny opis BCNF, a nie 3NF. 3NF można dokładniej opisać jako „ dane niekluczowe zależą od kluczy… i tylko od kluczy”.
Stwierdziłeś również:
To nadmierne uproszczenie. 3NF i BCNF oraz wszystkie formularze normalne dotyczą wszystkich kluczy kandydujących i / lub superkluczy, a nie tylko jednego klucza „podstawowego”.
źródło
Różnica między BCNF i 3NF
Korzystanie z definicji BCNF
Wtedy i tylko wtedy, gdy dla każdej z jego zależności X → Y zachodzi przynajmniej jeden z następujących warunków :
i definicję 3NF
Wtedy i tylko wtedy, gdy dla każdej z jego zależności funkcjonalnych X → A zachodzi przynajmniej jeden z poniższych warunków:
W prostych słowach widzimy następującą różnicę:
natomiast
Gdzie
Oznacza to, że żaden częściowy podzbiór (dowolny nietrywialny podzbiór z wyjątkiem pełnego zestawu) klucza kandydującego nie może być funkcjonalnie zależny od czegokolwiek innego niż superklucz.
Tabela / relacja nie w BCNF podlega anomaliom, takim jak anomalie aktualizacji wspomniane w przykładzie pizzy przez innego użytkownika. Niestety,
Przykład 3NF kontra BCNF
Przykład różnicy można obecnie znaleźć pod adresem „ Tabela 3NF niezgodna z BCNF (normalna forma Boyce-Codda) ” w Wikipedii, gdzie poniższa tabela spełnia wymagania 3NF, ale nie BCNF, ponieważ „Tennis Court” (częściowy atrybut klucza / pierwszego) zależy na "Rate Type" (częściowy atrybut klucza / prime, który nie jest superkluczem), który jest zależnością, którą możemy określić, pytając klientów bazy danych, klub tenisowy:
Dzisiejsze rezerwacje kortów tenisowych ( 3NF, nie BCNF )
Superklucze stołu to:
Problem 3NF : częściowy atrybut klucza / numeru głównego „Court” zależy od czegoś innego niż superklucz. Zamiast tego jest zależny od częściowego klucza / atrybutu głównego „Typ stawki”. Oznacza to, że użytkownik musi ręcznie zmienić typ stawki, jeśli aktualizujemy kort lub ręcznie zmienić kort, jeśli chce zastosować zmianę stawki.
(Z technicznego punktu widzenia nie możemy zagwarantować, że zależność funkcjonalna „Typ stawki” -> „Sąd” nie zostanie naruszona.)
Rozwiązanie BCNF : Jeśli chcemy umieścić powyższą tabelę w BCNF, możemy zdekomponować podaną relację / tabelę na następujące dwie relacje / tabele (zakładając, że wiemy, że typ stawki zależy tylko od sądu i statusu członkostwa, które moglibyśmy dowiedz się pytając klientów naszej bazy danych, właścicieli klubu tenisowego):
Typy stawek ( BCNF i słabszy 3NF, co jest implikowane przez BCNF)
Dzisiejsze rezerwacje kortów tenisowych ( BCNF i słabszy 3NF, co sugeruje BCNF)
Problem rozwiązany : Teraz, jeśli zaktualizujemy kort, możemy zagwarantować, że typ stawki będzie odzwierciedlał tę zmianę i nie możemy naliczyć niewłaściwej ceny za sąd.
(Z technicznego punktu widzenia możemy zagwarantować, że zależność funkcjonalna „Typ stawki” -> „Sąd” nie zostanie naruszona.)
źródło
Wszystkie dobre odpowiedzi. Mówiąc prostym językiem [BCNF] Żaden klucz częściowy nie może zależeć od klucza.
tj. żaden częściowy podzbiór (tj. dowolny nietrywialny podzbiór poza pełnym zestawem) klucza kandydującego nie może być funkcjonalnie zależny od jakiegoś klucza kandydującego.
źródło
Odpowiedzi udzielone przez „ smartnut007 ”, „ Bill Karwin ” i „ sqlvogel ” są doskonałe. Pozwólcie jednak, że przedstawię to z interesującej perspektywy.
Cóż, mamy klucze pierwsze i inne niż pierwsze.
Kiedy skupiamy się na tym, jak liczby inne niż liczby pierwsze zależą od liczb pierwszych, widzimy dwa przypadki:
Liczby inne niż liczby pierwsze mogą być zależne lub nie .
Gdy nie jest zależny: może istnieć zależność niezależna lub zależność przechodnia
A co z zależnościami między liczbami pierwszymi?
Teraz widzisz, nie zajmujemy się zależnością między liczbami pierwszymi przez 2. lub 3. NF. Dalsza taka zależność, jeśli taka istnieje, nie jest pożądana, dlatego mamy jedną regułę, która to rozwiązuje. To jest BCNF .
Odwołując się do przykładu z posta Billa Karwina , zauważysz, że zarówno „ Topping ”, jak i „ Topping Type ” są kluczami pierwszymi i mają zależność. Gdyby nie były liczbami pierwszymi i były zależne, wtedy włączyłby się 3NF.
Uwaga:
Definicja BCNF jest bardzo ogólna i nie rozróżnia atrybutów między liczbą pierwszą a inną. Jednak powyższy sposób myślenia pomaga zrozumieć, w jaki sposób pewna anomalia jest przenoszona nawet po 2 i 3 NF.
Temat zaawansowany: Mapowanie ogólnego BCNF na 2NF i 3NF
Teraz, gdy wiemy, że BCNF zapewnia ogólną definicję bez odniesienia do żadnych atrybutów głównych / innych niż pierwsze, zobaczmy, jak BCNF i 2/3 NF są powiązane.
Po pierwsze, BCNF wymaga (poza trywialnym przypadkiem), że dla każdej zależności funkcjonalnej
X -> Y
(FD) X powinien być superkluczem. Jeśli weźmiemy pod uwagę dowolną FD, mamy trzy przypadki - (1) Zarówno X, jak i Y nie są pierwsze, (2) Zarówno pierwsze, jak i (3) X pierwsze i Y nie są pierwsze, odrzucając (bezsensowne) przypadki X nie -pierwsza i Y pierwsza.W przypadku (1) zajmie się 3NF.
W przypadku (3) zajmie się 2NF.
W przypadku (2) znajdujemy użycie BCNF
źródło
To stare pytanie z cennymi odpowiedziami, ale nadal byłem nieco zdezorientowany, dopóki nie znalazłem przykładu z życia, który pokazuje problem z 3NF. Może nie nadaje się dla 8-letniego dziecka, ale mam nadzieję, że pomoże.
Jutro spotkam się z nauczycielami mojej najstarszej córki na jednym z tych kwartalnych spotkań rodziców / nauczycieli. Oto jak wygląda mój pamiętnik (nazwy i pokoje zostały zmienione):
Na pokój przypada tylko jeden nauczyciel i nigdy się nie ruszają. Jeśli spojrzeć, zobaczysz, że: (1) dla każdego atrybutu
Teacher
,Date
,Room
mamy tylko jedną wartość rzędu. (2) Super-klucze to:(Teacher, Date, Room)
,(Teacher, Date)
a(Date, Room)
klawisze i kandydujące są oczywiście(Teacher, Date)
i(Date, Room)
.(Teacher, Room)
nie jest superkluczem, ponieważ uzupełnię tabelę w następnym kwartale i mogę mieć wiersz taki jak ten (Pan Smith się nie poruszył!):Co możemy wywnioskować? (1) to nieformalne, ale poprawne sformułowanie 1NF. Z punktu (2) widzimy, że nie ma „atrybutu innego niż pierwszy”: 2NF i 3NF są podawane bezpłatnie.
Mój pamiętnik to 3NF. Dobry! Nie. Niezupełnie, ponieważ żaden projektant danych nie zaakceptowałby tego w schemacie bazy danych.
Room
Atrybut jest zależny odTeacher
atrybutu (znowu: nauczyciele nie ruszać!), Ale schemat nie odzwierciedla ten fakt. Co zrobiłby rozsądny projektant danych? Podziel tabelę na dwie części:I
Ale 3NF nie zajmuje się zależnościami atrybutów głównych. Na tym polega problem: zgodność 3NF nie wystarczy, aby w pewnych okolicznościach zapewnić prawidłowy projekt schematu tabeli.
W przypadku BCNF nie ma znaczenia, czy atrybut jest atrybutem głównym, czy nie w regułach 2NF i 3NF. Dla każdej nietrywialnej zależności (podzbiory są oczywiście określane przez ich nadzbiory) wyznacznikiem jest kompletny superklucz. Innymi słowy, nic nie jest określone przez coś innego niż kompletny super klucz (z wyłączeniem trywialnych FD). (Zobacz inne odpowiedzi dla formalnej definicji).
Tak szybko, jak
Room
zależyTeacher
,Room
musi być podzbioremTeacher
(tak nie jest) lubTeacher
musi być super kluczem (tak nie jest w moim dzienniku, ale tak jest, gdy dzielisz stół).Podsumowując: BNCF jest bardziej rygorystyczne, ale moim zdaniem łatwiejsze do ogarnięcia niż 3NF:
źródło