Я натрапив на проблему дизайну бази даних, яка не входить до моєї ліги, і мій гуру DBA до DBA не працює на пожежних навчаннях.
По суті, у мене є таблиця з наступним первинним ключем (ПК для стислості):
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
, природне приєднання все одно його ігнорує.Припустимо, мені не подобається цей розпад (мені не подобається). Я вільно визнаю, що практичним рішенням є залишити таблицю та код таким, яким вони є. Але, теоретично, чи існує спосіб розкласти та / або додати обмеження таким чином, щоб я відійшов від першої таблиці та зберіг правила своєї справи?