Разница между 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: частичный ключ (основной атрибут) может также зависеть от атрибута, который не суперключ ( т.е. другой частичный ключ / основной атрибут или даже неосновной атрибут).
Где
- первичный атрибут - это атрибут, найденный в потенциальном ключе, и
- ключ-кандидат - это минимальный суперключ для этого отношения, и
- суперключ - это набор атрибутов переменной отношения, для которой он утверждает, что во всех отношениях, присвоенных этой переменной, нет двух отдельных кортежей (строк), которые имеют одинаковые значения для атрибутов в этом наборе. Эквивалентно суперключ также может быть определен как набор атрибутов схемы отношения, на которой все атрибуты схемы функционально зависимы. (Суперключ всегда содержит ключ-кандидат / ключ-кандидат всегда является подмножеством суперключа. Вы можете добавить любой атрибут в отношение, чтобы получить один из суперключей.)
То есть, никакое частичное подмножество (любое нетривиальное подмножество, кроме полного набора) ключа-кандидата не может функционально зависеть от чего-либо, кроме суперключа.
Таблица / отношение, не входящие в BCNF, подвержены аномалиям, таким как аномалии обновления, упомянутые в примере с пиццей другим пользователем. К несчастью,
- BNCF не всегда может быть получен, в то время как
- всегда можно получить.
Пример 3NF и BCNF
Пример различия в настоящее время можно найти в "Таблица 3NF не соответствует BCNF (Boyce– Нормальная форма Кодда) "в Википедии, где следующая таблица соответствует 3NF, но не BCNF, потому что" Теннисный корт "(частичный ключевой / главный атрибут) зависит от" Типа ставки "(частичный ключевой / главный атрибут, который < em> not суперключ), что является зависимостью, которую мы могли бы определить, спросив клиентов базы данных, теннисный клуб:
Сегодняшние заказы на теннисные корты (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
Проблема решена. Теперь, если мы обновим суд, мы можем гарантировать, что тип ставки будет отражать это изменение, и мы не сможем назначить неправильную цену за суд.
(Технически мы можем гарантировать, что функциональная зависимость «Тип ставки» -> «Суд» не будет нарушена.)
person
AGéoCoder
schedule
27.10.2015