Как разложить отношение в BCNF?
Предположим, у нас есть отношение, где:
Пациент определяет врача, больница определяет врача, а врач определяет больницу. Как бы мы разложили это на BCNF?
{Доктор, Пациент}, {Пациент, Больница} или
{Доктор, Больница}, {Пациент, Больница} или
{Доктор, Больница}, {Доктор, Пациент}
В моем понимании в отношении, это должно быть 3NF, и если X → Y выполняется в R, одно из следующего должно выполняться для каждой зависимости в отношении:X → Y тривиально функционально зависимый X является суперключем R.
Значит, {Доктор, Больница}, {Доктор, Пациент} будет правильным выбором?
1 ответ
Во-первых, я думаю, что вы неправильно поняли цифру. Используемая в нем запись обычно интерпретируется как описание следующих двух функциональных зависимостей:
Patient, Hospital → Doctor (1)
Doctor → Hospital (2)
Функциональная зависимость (1) означает, что каждому пациенту в определенной больнице назначается уникальный врач, а (2) означает, что каждый врач работает в уникальной больнице. В вашей интерпретации вместо этого каждая больница однозначно определяет врача, то есть в любой больнице есть только один врач!
Итак, учитывая приведенную выше интерпретацию, давайте посмотрим, есть ли отношение в BCNF. Отношение находится в BCNF, если каждый определитель является (супер) ключом, и ясно, что зависимость:
Doctor → Hospital
нарушает это условие, поскольку Доктор не является суперключем (то есть он не определяет все атрибуты). На самом деле это отношение имеет два возможных ключа: (пациент, больница) и (пациент, врач).
Итак, разложение этого отношения в BCNF выглядит следующим образом:
R1 <(Doctor, Hospital), { Doctor → Hospital }>
R2 <(Doctor, Patient), { }>
(так что вы правы в своем предположении).
Обратите внимание, однако, что это разложение имеет неприятное свойство: потеря функциональной зависимости! На самом деле, зависимость:
Patient, Hospital → Doctor
теряется, то есть не применяется в результирующей базе данных. Это означает, что можно вставить информацию о пациенте с врачом, которого нет в больнице, в которой находится пациент!
В заключение отметим, что, поскольку Doctor является основным атрибутом (то есть он принадлежит ключу-кандидату), исходное отношение уже находится в 3NF.