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


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

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

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

Так почему же тогда некоторые таблицы 3NF не находятся в BCNF? Я имею в виду, 3nf quote явно говорит "ничего, кроме ключа", что означает, что все атрибуты зависят исключительно от первичного ключа. Первичный ключ, в конце концов, является ключом-кандидатом, пока он не выбран в качестве нашего первичного ключа.

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

5 127

5 ответов:

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

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

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

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

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

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

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

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

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

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

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

Это лучше всего объяснить с помощью Zaniolo это из 3NF, что эквивалентно Codd:

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

(а) X является суперключ для Р, или

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

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

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

(а) X является суперключ для R

BCNF поэтому более строгий.

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

вы заявил:

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

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

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

используя определение BCNF

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

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

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

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

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

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

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

, тогда как

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

здесь

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

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

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

3nf против примера BCNF

пример разницы в настоящее время можно найти на "3nf таблица не соответствует BCNF (Boyce–Codd нормальная форма) " в Википедии, где встречается следующая таблица 3NF, но не BCNF, потому что" теннисный корт "(частичный ключ/простой атрибут) зависит от" типа ставки " (частичный ключ/простой атрибут, который не a superkey), который является зависимостью, которую мы могли бы определить, спросив клиентов базы данных, теннисного клуба:

сегодняшнее бронирование теннисного корта (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
в таблице:
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

в 3НФ проблема: Частичный ключ/премьер-атрибут "суда" зависит от чего-то другого, чем суперключ. Вместо этого он зависит от частичного ключа/простого атрибута "тип ставки". Это означает, что пользователь должен вручную изменить тип ставки, если мы обновляем суд, или вручную изменить суд, если вы хотите применить изменение ставки.

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

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

решение BCNF: Если мы хотим разместить приведенную выше таблицу в 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

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

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

все хорошие ответы. Говоря простым языком [BCNF], никакой частичный ключ не может зависеть от ключа.

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

ответы на ‘ smartnut007’,'Билл Karwin’ и ‘sqlvogel’ отличные. И все же позвольте мне взглянуть на это с интересной точки зрения.

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

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

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

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

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

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

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

ссылаясь на пример от Билл Karwin's сообщение здесь, вы заметите, что оба'топпинг’ и ‘Навершием Типа ' являются простыми ключами и имеют зависимость. Имел они были не простыми числами с зависимостью, тогда 3nf включился бы.

Примечание:

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

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

теперь, когда мы know 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