Різниця між BCNF та 3NF
Використання визначення BCNF
Якщо і тільки якщо для кожної з її залежностей X → Y, принаймні одна з таких умов виконується :
- X → Y - тривіальна функціональна залежність (Y ⊆ X), або
- X - це супер ключ для схеми R
та визначення 3NF
Якщо і лише тоді, коли для кожної з її функціональних залежностей X → A виконується принаймні одна з таких умов:
- X містить A (тобто X → A - тривіальна функціональна залежність), або
- X - це суперлюдина, або
- Кожен елемент AX, задана різниця між A і X, є основним атрибутом (тобто кожен атрибут в AX міститься в якомусь ключі-кандидата)
Ми бачимо таку різницю простими словами:
- У BCNF : Кожен частковий ключ (основний атрибут) може залежати лише від супер ключа ,
тоді як
- У 3NF : Частковий ключ (основний атрибут) також може залежати від атрибута, який не є надключовим ключем (тобто іншого атрибута часткового ключа / проста чи навіть атрибута, який не є простим).
Де
- Простий атрибут - це атрибут, знайдений у ключовому ключі та
- А Ключ кандидат є мінімальним суперключ для цього відносини, і
- Суперключ являє собою набір атрибутів змінних відносин , для яких вона вважає , що в усіх відношеннях , привласнених цього змінний, немає два різних кортежів (рядків) , які мають однакові значення атрибутів в цьому set.Equivalently суперключ може також визначається як набір атрибутів схеми відношень, від яких функціонально залежать усі атрибути схеми. (Супер ключ завжди містить ключ-кандидат / кандидат-ключ - це завжди підмножина супер-ключа. Ви можете додати будь-який атрибут у відношенні, щоб отримати один із супер-ключів.)
Тобто, жоден частковий підмножина (будь-яке нетривіальне підмножина, крім повного набору) ключа-кандидата не може бути функціонально залежним від будь-якого, крім супер-ключа.
Таблиця / співвідношення, що не знаходиться в BCNF, піддається таким аномаліям, як аномалії оновлення, згадані у прикладі піци іншим користувачем. На жаль,
- ЦНБФ НЕ завжди виходить , в той час як
- Завжди можна отримати 3NF .
Приклад 3NF проти BCNF
Приклад різниці на даний момент можна знайти на " таблиці 3NF, що не відповідає BCNF (нормальна форма Бойса-Кодда) " у Вікіпедії, де в наступній таблиці зустрічається 3NF, але не BCNF, оскільки "Тенісний корт" (частковий ключ / основний атрибут) залежить на "Тип тарифу" (частковий атрибут "ключ" / "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
Проблема 3NF : Частковий атрибут "key" / prime "Court" залежить від чогось іншого, ніж надбудова. Натомість це залежить від часткового атрибута key / prime "Тип тарифу". Це означає, що користувач повинен змінити тип тарифу вручну, якщо ми оновимо суд, або вручну змінити суд, якщо хоче застосувати зміну ставки.
- Але що робити, якщо користувач модернізує суд, але не пам’ятає про підвищення тарифу? Або що робити, якщо неправильний тип ставки застосовується до суду?
(У технічному плані ми не можемо гарантувати, що функціональна залежність "Тип ставки" -> "Суд" не буде порушена.)
Розчин 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
Проблема вирішена : Якщо ми модернізуємо суд, ми можемо гарантувати, що тип ставки відобразить цю зміну, і ми не можемо стягувати неправильну ціну за суд.
(У технічному плані ми можемо гарантувати, що функціональна залежність "Тип ставки" -> "Суд" не буде порушена.)