Разница между 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) может и зависит от атрибута, который является не суперкей (т. е. другой частичный ключ/простой атрибут или даже не простой атрибут).
здесь
- A премьер-атрибут является атрибутом, найденным в ключ кандидата, и
- A кандидат является минимальным суперключом для этого отношения, и
- 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 требует (кроме тривиального случая), что для каждой функциональной зависимости
Для случая (1), 3NF заботится.
Для случая (3), 2NF заботится.
Для случая (2) мы находим использование BCNFX -> Y
(FD), X должен быть супер-ключом.
Если вы просто рассмотреть любые ФД, то у нас три случая - (1) X и Y не премьер, (2) и изначальной (3) х и y-премьер-не премьер, отбросив (бессмысленный) х non-премьер и Г-Прайм.