- Нека са дадени следните релация и детерминанти:
- R(a,b,c,d)
- a,c -> b,d
- a,d -> b
- За да бъде релацията в BCNF, всички валидни детерминанти трябва да са кандидат ключове. В релацията R, a,c->b,d е използваната детерминанта, което покрива първата от тях.
- a,d->b определя a,d като първичен ключ, който определя b. Този ключ обаче не определя c. Следователно това не е кандидат ключ и R не е в BCNF.
Пример 1 2 възможни ключа - DB(Patno,PatName,appNo,time,doctor)
- Детерминанти:
- Patno -> PatName
- Patno,appNo -> Time,doctor
- Time -> appNo
- Съществуват 2 варианта за избор на първичен ключ в 1НФ:
- DB(Patno,PatName,appNo,time,doctor) (пример 1a)
- DB(Patno,PatName,appNo,time,doctor) (пример 1b)
Пример 1а - DB(Patno,PatName,appNo,time,doctor)
- Няма повтарящи се групи – релацията е в 1НФ
- 2НФ – елиминира се частичната зависимост:
- DB(Patno,appNo,time,doctor)
- R1(Patno,PatName)
- 3НФ – няма транзитивни зависимости
- Проверяваме за BCNF.
BCNF всеки детерминант е кандидат ключ - DB(Patno,appNo,time,doctor)
- R1(Patno,PatName)
- Детерминантите кандидат ключове ли са?
- Patno -> PatName Patno съществува в DB, а PatName - не, следователно не е приложим.
- Patno,appNo -> Time,doctor всички LHS и RHS присъстват, следователно е приложим. Кандидат ключ ли е? Patno,appNo Е ключа, следователно е и кандидат ключ.
- Time -> appNo Time присъства, appNo - също, следователно е приложим. Кандидат ключ ли е? Ако е, трябва да променим DB:
- DB(Patno,appNo,time,doctor) Това не работи, следователно релацията не е в BCNF.
Сподели с приятели: |