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

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

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

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

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

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

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, потому что нет столбца (ключевого или неключевого), который функционально зависит от чего-либо, кроме этого ключа.

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

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

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


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

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

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

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

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

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

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

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

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

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

вы заявил:

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

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


разница между 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: частичный ключ (атрибут prime) может и зависит от атрибута, который является не суперкей (т. е. другой частичный ключ/простой атрибут или даже не простой атрибут).

здесь

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

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

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

  • изданию bncf не может всегда быть получены, а
  • 3NF всегда быть получены.

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

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

сегодняшние бронирования теннисных кортов (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НФ проблема: Частичный ключ / атрибут prime "Court" зависит от чего-то другого, чем суперкей. Вместо этого он зависит от атрибута partial key/prime "Rate Type". Это означает, что пользователь должен вручную изменить тип ставки при обновлении суда или вручную изменить суд, если требуется применить изменение ставки.

  • но что, если пользователь обновляет суд, но не помнит, чтобы увеличить скорость? Или что, если к 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], никакой частичный ключ не может зависеть от ключа.

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


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

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

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

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

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

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

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

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

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

Примечание:

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

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

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

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

Для случая (1), 3NF заботится.

Для случая (3), 2NF заботится.

Для случая (2) мы находим использование BCNF