Разница между BCNF и 3NF
Использование определения BCNF
Если и только если для каждой из его зависимостей X → Y выполняется хотя бы одно из следующих условий :
- X → Y - тривиальная функциональная зависимость (Y ⊆ X), или
- X - суперключ для схемы R
и определение 3NF
Если и только если для каждой из его функциональных зависимостей X → A выполняется хотя бы одно из следующих условий:
- X содержит A (то есть X → A - тривиальная функциональная зависимость), или
- Х это суперключ, или
- Каждый элемент AX, установленная разница между A и X, является основным атрибутом (т. Е. Каждый атрибут в AX содержится в некотором ключе-кандидате).
Мы видим следующее различие в простых терминах:
- В BCNF : каждый частичный ключ (основной атрибут) может зависеть только от суперключа,
в то время как
- В 3NF : частичный ключ (первичный атрибут) также может зависеть от атрибута, который не является суперключем (то есть другой частичный ключ / первичный атрибут или даже не простой атрибут).
куда
- Основной атрибут - это атрибут, найденный в ключе-кандидате, и
- Ключ кандидат является минимальным суперключ для этого отношения, и
- Суперключ представляет собой набор атрибутов переменных отношений , для которых она считает , что во всех отношениях , присвоенных этого переменный, нет два различных кортежей (строк) , которые имеют одинаковые значения атрибутов в этом set.Equivalently суперключа может также быть определенным как набор атрибутов схемы отношений, от которых все атрибуты схемы являются функционально зависимыми. (Суперключ всегда содержит ключ-кандидат / ключ-кандидат всегда является подмножеством суперключа. Вы можете добавить любой атрибут в отношение, чтобы получить один из суперключей.)
То есть никакое частичное подмножество (любое нетривиальное подмножество, кроме полного набора) ключа-кандидата не может быть функционально зависимым от чего-либо, кроме суперключа.
Таблица / отношение не в 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
Суперключи стола:
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 : если мы хотим разместить вышеупомянутую таблицу в 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
Проблема решена : теперь, если мы модернизируем корт, мы можем гарантировать, что тип ставки будет отражать это изменение, и мы не можем взимать неправильную цену за корт.
(В техническом плане мы можем гарантировать, что функциональная зависимость «Тип ставки» -> «Суд» не будет нарушена.)