О терминологии
Вы говорите:
У меня есть определитель a,b -> c,d
Это неверная терминология.a,b -> c,d
является функциональной зависимостью (иногда сокращенно от FD), которая имеет определитель a,b
(иногда называемый левой стороной (LHS) FD) и определитель c,d
(иногда называемый правой стороной, RHS, FD).Эта терминология используется, поскольку значения атрибутов a,b
однозначно определяют значения атрибутов c,d
.
О ключе
Информация, которая:
(a, b) является первичным ключом
может быть неактуальным при нормализации отношения, когда у вас достаточно информации о функциональных зависимостях.Из этих зависимостей вы можете вычислить, которые являются ключами-кандидатами : набор атрибутов, который однозначно определяет все атрибуты отношения, и поэтому вы не можете удалить из них какой-либо атрибут, сохраняя это свойство (другими словами, минимальные наборыатрибутов, который однозначно определяет все атрибуты отношения).Информация о первичном ключе может быть релевантной, когда у вас есть только частичная информация о функциональных зависимостях, которые содержатся в отношении, но в вашем случае информация обо всех (возможных) ключах может быть получена из функциональных зависимостей.
В вашем примере, например, есть три ключа-кандидата:
1. a, b
2. a, c
3. a, d
Вы можете проверить этот факт, вычислив закрытие атрибутов ключа-кандидата, чтобы увидеть, содержит ли он все атрибуты.Например, давайте попробуем вычислить замыкание a,d
(называемое a,d *
):
1. a,d * = a,d
2. a,d * = a,d,b (since a, d -> b)
3. a,d * = a,d,b,c (since a, b -> c, d)
Так что a,d
является ключом-кандидатом (который также является суперключом, то есть набором атрибутов, которыеопределяет все атрибуты отношения).
О BCNF
Существуют различные определения BCNF.Используя, например, вторую, которую вы процитировали, все три зависимости имеют определитель, который является ключом-кандидатом (и, следовательно, суперключом), и поэтому отношение находится в BCNF.