Разница между 3NF и BCNF в простых терминах (должна быть в состоянии объяснить 8-летнему ребенку) - PullRequest
142 голосов
/ 09 декабря 2011

Я прочитал цитату: данные зависят от ключа [1NF], всего ключа [2NF] и только от ключа [3NF] .

Однако у меня возникают проблемы с пониманием 3.5NF или BCNF, как они называются.Вот что я понимаю:

  • BCNF строже, чем 3NF
  • левая сторона любого FD в таблице должна быть суперключом (или, по крайней мере, ключом-кандидатом)

Так почему же некоторые таблицы 3NF отсутствуют в BCNF?Я имею в виду, что цитата 3NF явно говорит «ничего, кроме ключа», что означает, что все атрибуты зависят исключительно от первичного ключа.В конце концов, первичным ключом является ключ-кандидат, пока он не будет выбран в качестве нашего первичного ключа.

Если что-то не так в отношении моего понимания, пожалуйста, исправьте меня и спасибо за любую помощь, которую вы можете предоставить.

Ответы [ 6 ]

155 голосов
/ 09 декабря 2011

Ваша пицца может иметь ровно три вида начинки:

  • один тип сыра
  • один тип мяса
  • один тип овощей

Итак, мы заказываем две пиццы и выбираем следующие начинки:

Pizza    Topping     Topping Type
-------- ----------  -------------
1        mozzarella  cheese
1        pepperoni   meat
1        olives      vegetable
2        mozzarella  meat
2        sausage     cheese
2        peppers     vegetable

Подождите секунду, моцарелла не может быть одновременно и сыром, и мясом!И колбаса - не сыр!

Мы должны предотвратить подобные ошибки, чтобы моцарелла всегда была сыром.Мы должны использовать для этого отдельную таблицу, поэтому мы записываем этот факт только в одном месте.

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

Это было объяснение, которое может понять восьмилетний ребенок.Вот более техническая версия.

BCNF действует иначе, чем 3NF, только при наличии нескольких перекрывающихся ключей-кандидатов.

Причина заключается в том, что функциональная зависимость X -> Yконечно, если Y является подмножеством X.Таким образом, в любой таблице, которая имеет только один ключ-кандидат и находится в 3NF, она уже находится в BCNF, потому что нет столбца (ни ключевого, ни неключевого), который функционально зависит от чего-либо, кроме этого ключа.

Посколькукаждая пицца должна иметь ровно по одному типу начинки, мы знаем, что (пицца, тип начинки) является ключом-кандидатом.Мы также интуитивно знаем, что данный топпинг не может принадлежать разным типам одновременно.Таким образом (Pizza, Topping) должен быть уникальным и, следовательно, также является ключом-кандидатом.Итак, у нас есть два перекрывающихся ключа-кандидата.

Я показал аномалию, в которой мы пометили моцареллу как неправильный тип начинки.Мы знаем, что это неправильно, но правило, которое делает это неправильно, - это зависимость Topping -> Topping Type, которая не является допустимой зависимостью для BCNF для этой таблицы.Это зависимость от чего-то другого, кроме целого ключа-кандидата.

Итак, чтобы решить эту проблему, мы берем Topping Type из таблицы Pizzas и делаем его неключевым атрибутом в таблице Toppings.

85 голосов
/ 09 декабря 2011

Тонкое различие заключается в том, что 3NF различает ключевые и неключевые атрибуты (также называемые не простые атрибуты), тогда как BCNF нет.

Это лучше всего объяснить с помощью Определение Заниоло 3NF, которое эквивалентно кодсу Кодда:

Отношение R находится в 3NF тогда и только тогда, когда каждое нетривиальное FD (X-> A) удовлетворяется R по крайней мере ОДНОиз следующих условий:

(a) X - это суперключ для R, или

(b) A - ключевой атрибут для R

BCNF требует (а), но не рассматривает (б) как особый случай.Другими словами, BCNF требует, чтобы каждый нетривиальный определитель представлял собой суперключ, даже если его зависимые атрибуты являются частью ключа.

Отношение R находится в BCNF, если для каждого нетривиального FD (X->A) удовлетворяется R, выполняется следующее условие:

(a) X - это суперключ для R

BCNF, следовательно, является более строгим.

Разницанастолько тонким, что то, что многие люди неофициально называют 3NF, на самом деле является BCNF.Например, вы заявили здесь, что 3NF означает «данные зависят от ключа [s] ... и ничего, кроме ключа [s]», но это действительно неформальное описание BCNF, а не 3NF.3NF можно более точно описать как « неключевые данные зависит от ключей ... и только от ключей».

Вы также заявили:

в цитате 3NF явно сказано «ничего, кроме ключа», что означает, что все атрибуты зависят исключительно от первичного ключа.

Это упрощение.3NF и BCNF и все обычные формы касаются всех возможных ключей и / или суперключей, а не только одного "первичного" ключа.

23 голосов
/ 28 октября 2015

Разница между BCNF и 3NF

Использование определения BCNF

Если и только если для каждой из его зависимостей X → Y выполнено хотя бы одно из следующих условий :

  • X → Y - тривиальная функциональная зависимость (Y ⊆ X), или
  • X - суперключ для схемы R

и определение 3NF

Если и только если для каждой из его функциональных зависимостей X → A выполняется хотя бы одно из следующих условий:

  • X содержит A (то есть X → A - тривиальная функциональная зависимость) или
  • X - суперключ, или
  • Каждый элемент A-X, установленная разность между A и X, является основным атрибутом (то есть каждый атрибут в A-X содержится в некотором ключе-кандидате)

Мы видим следующее различие в простых терминах:

  • В BCNF : каждый частичный ключ (основной атрибут) может только зависеть от суперключа,

тогда

  • В 3NF : частичный ключ (основной атрибут) может также зависеть от атрибута, который не суперключ (т.е. другой частичный ключ / простой атрибут или даже не простой атрибут).

Где

  1. A простой атрибут - это атрибут, найденный в ключе-кандидате, а
  2. A ключ-кандидат - минимальный суперключ для этого отношения, а
  3. A superkey - это набор атрибутов переменной отношения, для которого он считает, что во всех отношениях, назначенных этой переменной, нет двух различных кортежей (строк), которые имеют те же значения для атрибутов в этом наборе. Эквивалентно суперключ также может быть определен как набор атрибутов схемы отношений, от которых функционально зависят все атрибуты схемы. (Суперключ всегда содержит ключ-кандидат / ключ-кандидат всегда является подмножеством суперключа. Вы можете добавить любой атрибут в отношение, чтобы получить один из суперключей.)

То есть, никакое частичное подмножество (любое нетривиальное подмножество, кроме полного набора) ключа-кандидата не может быть функционально зависимым от чего-либо, кроме суперключа.

Таблица / отношение, отсутствующее в BCNF, подвержено аномалиям, таким как аномалии обновления, упомянутые в примере пиццы другим пользователем. К сожалению,

  • BNCF не может быть всегда может быть получено , в то время как
  • 3NF всегда можно получить .

3NF против BCNF Пример

Пример различия в настоящее время можно найти в " 3NF таблица не соответствует BCNF (нормальная форма Бойса-Кодда) " в Википедии, где следующая таблица соответствует 3NF, но не BCNF, потому что "Теннисный корт" (атрибут частичного ключа / простого) зависит от «Типа скорости» (атрибут частичного ключа / простого, который является , а не суперключем), и эту зависимость мы можем определить, задавая клиентам базы данных, теннисный клуб:

Сегодняшние заказы на теннисный корт ( 3NF, не 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

Superkeys таблицы:

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

Проблема 3NF : Атрибут частичного ключа / простого «Суд» зависит от чего-то другого, кроме суперключа. Вместо этого он зависит от частичного ключа / простого атрибута «Тип тарифа». Это означает, что пользователь должен вручную изменить тип ставки, если мы обновим суд, или вручную изменить суд, если вы хотите применить изменение ставки.

  • Но что, если пользователь обновит корт, но не помнит, чтобы увеличить ставку? Или что, если в суде применяется неверный тип ставок?

(В техническом плане мы не можем гарантировать, что функциональная зависимость "Тип ставки" -> "Суд" не будет нарушена.)

Решение BCNF : Если мы хотим тo поместив приведенную выше таблицу в BCNF, мы можем разложить данное отношение / таблицу на следующие два отношения / таблицы (при условии, что мы знаем, что тип тарифа зависит только от статуса суда и членства, что мы могли бы узнать, спросив клиентов нашего База данных владельцев теннисного клуба):

Типы тарифов ( BCNF и более слабый 3NF, что подразумевается BCNF)

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

Сегодняшние заказы на теннисный корт ( BCNF и более слабый 3NF, что подразумевается 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

Проблема решена : Теперь, если мы модернизируем корт, мы можем гарантировать, что тип ставки будет отражать это изменение, и мы не можем взимать неправильную цену за корт.

(В техническом плане мы можем гарантировать, что функциональная зависимость «Тип ставки» -> «Суд» не будет нарушена.)

4 голосов
/ 13 февраля 2013

Все хорошие ответы. Проще говоря, [BCNF] Никакой частичный ключ не может зависеть от ключа.

Т.е. никакое частичное подмножество (т. Е. Любое нетривиальное подмножество, кроме полного набора) ключа-кандидата не может быть функционально зависимым от некоторого ключа-кандидата.

3 голосов
/ 03 октября 2016

Ответы ‘ smartnut007 ’, ‘ Билл Карвин ’ и ‘ sqlvogel ’ превосходны. И все же позвольте мне взглянуть на это интересно.

Ну, у нас есть простые и не простые ключи.

Когда мы фокусируемся на том, как не простые числа зависят от простых чисел, мы видим два случая:

Непростые числа могут быть зависимыми или нет .

  • При зависимости: мы видим, что они должны зависеть от полного ключа-кандидата. Это 2NF .
  • Когда не зависимо: может быть отсутствие зависимости или транзитивная зависимость

    • Даже не транзитивная зависимость: Не уверен, что теория нормализации решает эту проблему.
    • При транзитивной зависимости: Это считается нежелательным. Это 3NF .

А как насчет зависимостей между простыми числами?

Теперь вы видите, что мы не рассматриваем отношения зависимости между простыми числами 2-м или 3-м NF. Кроме того, такая зависимость, если таковая имеется, нежелательна, и поэтому у нас есть одно правило для ее решения. Это BCNF .

Обращаясь к примеру из поста Билла Карвина здесь, вы заметите, что и ' Topping ', и ' Topping Type ' простые. ключи и имеют зависимость. Если бы они не были простыми числами с зависимостью, тогда 3NF вступил бы в игру.

Примечание:

Определение BCNF очень общее и не различает атрибуты между простым и не простым. Тем не менее, вышеуказанный способ мышления помогает понять, как некоторые аномалии просачиваются даже после 2-й и 3-й NF.

Расширенная тема: отображение общего BCNF на 2NF и 3NF

Теперь, когда мы знаем, что BCNF предоставляет общее определение без ссылки на какие-либо простые / непростые атрибуты, давайте посмотрим, как связаны BCNF и 2/3 NF. Во-первых, BCNF требует (кроме тривиального случая), что для каждой функциональной зависимости X -> Y (FD) X должен быть суперключом. Если вы просто рассмотрите любой FD, то у нас есть три случая - (1) оба X и Y не просты, (2) оба просты и (3) X просты и Y не просты, отбрасывая (бессмысленный) случай X не -прайм и Y простые. Для случая (1), 3NF заботится о. Для случая (3), 2NF заботится о. Для случая (2) мы находим использование BCNF

2 голосов
/ 17 декабря 2018

Это старый вопрос с ценными ответами, но я все еще был немного смущен, пока не нашел реальный пример, показывающий проблему с 3NF.Может быть, не подходит для 8-летнего ребенка, но надеюсь, что это поможет.

Завтра я встретлю учителей моей старшей дочери на одном из этих ежеквартальных собраний родителей / учителей.Вот как выглядит мой дневник (имена и комнаты были изменены):

Teacher   | Date             | Room
----------|------------------|-----
Mr Smith  | 2018-12-18 18:15 | A12 
Mr Jones  | 2018-12-18 18:30 | B10 
Ms Doe    | 2018-12-18 18:45 | C21 
Ms Rogers | 2018-12-18 19:00 | A08 

В каждой комнате только один учитель, и они никогда не двигаются.Если вы посмотрите, вы увидите, что: (1) для каждого атрибута Teacher, Date, Room, у нас есть только одно значение в строке.(2) суперключами являются: (Teacher, Date, Room), (Teacher, Date) и (Date, Room), а ключи-кандидаты, очевидно, (Teacher, Date) и (Date, Room).

(Teacher, Room) не являются суперключем, потому что яЯ закончу таблицу в следующем квартале, и у меня может быть такая строка (мистер Смит не двигался!):

Teacher  | Date             | Room
---------|------------------| ----
Mr Smith | 2019-03-19 18:15 | A12

Что мы можем сделать вывод?(1) является неформальной, но правильной формулировкой 1NF.Из (2) мы видим, что нет «не простого атрибута»: 2NF и 3NF предоставляются бесплатно.

Мой дневник 3NF.Хорошо!Нет. Не совсем, потому что никакой разработчик моделей данных не примет это в схеме БД.Атрибут Room зависит от атрибута Teacher (опять же, учителя не двигаются!), Но схема не отражает этот факт.Что бы сделал нормальный разработчик данных?Разделите таблицу на две части:

Teacher   | Date
----------|-----------------
Mr Smith  | 2018-12-18 18:15
Mr Jones  | 2018-12-18 18:30
Ms Doe    | 2018-12-18 18:45
Ms Rogers | 2018-12-18 19:00

И

Teacher   | Room
----------|-----
Mr Smith  | A12
Mr Jones  | B10
Ms Doe    | C21
Ms Rogers | A08

Но 3NF не имеет дело с зависимостями простых атрибутов. В этом проблема: 3NF-соответствия недостаточно для обеспечения проектирования схемы звуковой таблицы при некоторых обстоятельствах.

С BCNF вам не важно, если атрибутявляется основным атрибутом или нет в правилах 2NF и 3NF.Для каждой нетривиальной зависимости (подмножества, очевидно, определяются их надмножествами), детерминант является полным суперключом. Другими словами, ничто не определяется чем-то, кроме полного суперключа (исключая тривиальные FD).(См. Другие ответы для формального определения).

Как только Room зависит от Teacher, Room должно быть подмножеством Teacher (это не так) или Teacher должно бытьсупер ключ (это не тот случай в моем дневнике, но тот случай, когда вы разбили таблицу).

Подводя итог: BNCF более строгий, но, на мой взгляд, легче понять, чем 3NF:

  • в большинстве случаев BCNF идентичен 3NF;
  • в других случаях BCNF - это то, что вы думаете / надеетесь на 3NF.
...