Я наткнулся на проблему с дизайном базы данных, которая выходит за рамки моей лиги, и мой гуру DBA выключен в пожарных учениях.
По сути, у меня есть таблица со следующим первичным ключом (PK для краткости):
child_id integer
parent_id integer
date datetime
child_id
и parent_id
являются внешними ключами таблиц сущностей. Сама «дочерняя» таблица также содержит внешний ключ к «родительской» таблице, и вот, каждая из них child_id
всегда ссылается на то же, parent_id
что и ожидаемая таблица выше. На самом деле, оказывается, есть какой-то дополнительный код, поддерживающий синхронизацию двух.
Что заставляет этого сверхъестественного новичка по нормализации говорить: «Я должен вместо этого удалить избыточность!»
Я разлагаю на следующее:
Table_1 PK:
child_id integer
date datetime
Table_2 PK:
parent_id integer
date datetime
Table_3: (already exists)
child_id integer PRIMARY KEY
parent_id integer FOREIGN KEY
И вот, когда я естественным образом присоединяюсь к этим парням, я возвращаю исходный стол. Это мое понимание, что делает это 5NF.
Однако теперь я понимаю, что есть скрытое бизнес-правило.
Обычно даты, связанные с данным, child_id
должны быть подмножеством дат, связанных с соответствующим parent_id
. Вы можете видеть, что первая таблица применяет это правило.
Моя декомпозиция не применяет правило, потому что вы можете свободно добавлять в таблицу 1, пока даты не станут слишком большими.
Что приводит меня сюда со следующими вопросами:
Это разложение 5NF? Хотя я бы сказал, что он допускает аномалии вставки, он также, похоже, следует примеру Wiki, который сам следует этому руководству . Фраза (выделение мое) «мы можем восстановить все истинные факты из нормализованной формы, состоящей из трех отдельных типов записей», дает мне особую паузу, поскольку независимо от того, сколько мусора я закачиваю
Table_1
, естественное соединение все равно игнорирует его.Предположим, мне не нравится это разложение (мне не нравится). Я свободно признаю, что практическим решением является оставить таблицу и код такими, какие они есть. Но, теоретически, есть ли способ разложить и / или добавить ограничения, чтобы я ушел от первой таблицы и сохранил свои бизнес-правила?