Разложение, которое не сохраняет функциональную зависимость - PullRequest
4 голосов
/ 15 ноября 2011

Когда разложение BCNF не может сохранить функциональную зависимость ... Я пытаюсь понять это, скажем, R = (V, W, X, Y, Z)

Ответы [ 4 ]

6 голосов
/ 26 июля 2013

Взято из Проектирование базы данных и теория отношений :

R = (S, J, T)

{S, J} -> {T}
{T} -> {J}

Это не в BCNF, так как T -> J выполняется, а T не является ключом.

Разложение на R1 = (T, J) и R2 = (T, S) с ключами {T} и {T, S} соответственно. приводит к BCNF.

Однако зависимость {S, J} -> {T} потеряна.

1 голос
/ 18 августа 2014

R (a b c d e) с FDs {A-> B, AC-> D, BD-> E}. В этом отношении AC является ключом-кандидатом, и это отношение не в 2NF, так как не простое B частично зависит от ключа (AC). Чтобы преобразовать это отношение в bcnf, разложите его на два отношения: R1 (a b) {a-> b} key = a R2 (a c d e) {ac-> de} ключ = a Оба R1 и R2 находятся в bcnf, так как каждый определитель является ключом, но они не сохраняют зависимость, так как bd-> e потеряно.

1 голос
/ 16 ноября 2011

Точка разложения BCNF заключается в исключении функциональных зависимостей, которые не вида key -> everything else

Так что если в таблице есть FD, скажем, A -> B, такой, что A не является ключом, это означает, что вы храните избыточные данные в вашей таблице. В результате вы создаете новую таблицу со столбцами A и B, ключом которой является A, а затем удаляете B из исходной таблицы.

В результате этого изменения вы больше не будете страдать от аномалий удаления, и вам не придется обновлять несколько строк только для того, чтобы внести изменения в отношение A -> B.

Итак, для тривиального, наивного примера, допустим, у вас есть таблица сотрудников со столбцами:

 employeeId   name   jobTitle    salary

Предположим, что jobTitle -> salary то есть каждый с одинаковым названием должности всегда получает одинаковую зарплату. Предположим, что jobTitle «разработчика» приравнивается к зарплате в 90 000 долларов. Если у вас есть 20 разработчиков в вашей базе данных, было бы глупо хранить одно и то же избыточное значение в $ 90 000 для каждой строки. Таким образом, вы удаляете столбец окладов из таблицы сотрудников и создаете новую таблицу окладов с:

 jobTitle_[key]   salary

Затем, чтобы получить зарплату сотруднику, вы смотрите ее в таблице зарплат.

0 голосов
/ 18 мая 2013
Schema R=(V,W,X,Y,Z)

Functional dependencies:

V,W -> X
Y,Z -> X
  W -> Y

Разложите в BCNF, и вы увидите, что все FD не могут быть сохранены в одном разложении.

...