Eu me deparei com um problema de design de banco de dados que está fora do meu alcance, e meu guru do DBA preferencial está fora de campo.
Em essência, eu tenho uma tabela com a seguinte chave primária (PK por brevidade):
child_id integer
parent_id integer
date datetime
child_id
e parent_id
são chaves estrangeiras para tabelas de entidades. A tabela "filho" em si também contém uma chave estrangeira para a tabela "pai", e eis que cada uma child_id
sempre faz referência à mesma parent_id
que o esperado pela tabela acima. Na verdade, acontece que há algum código extra mantendo os dois em sincronia.
O que faz esse novato de normalização super entusiasmado dizer "Devo remover a redundância!"
Decomponho o seguinte:
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
E eis que, quando uno esses caras da maneira natural, recupero a tabela original. É o meu entendimento que torna este 5NF.
No entanto, agora percebo que há uma regra de negócios oculta.
Normalmente, as datas associadas a um determinado child_id
devem ser um subconjunto das datas associadas ao correspondente parent_id
. Você pode ver que a primeira tabela impõe essa regra.
Minha decomposição não impõe a regra, porque você pode adicionar livremente à Tabela 1 até que as datas fiquem muito grandes.
O que me leva aqui, com as seguintes perguntas:
Esta decomposição é 5NF? Embora eu diga que permite anomalias de inserção, também parece seguir o exemplo do Wiki, que segue este guia . A frase (ênfase minha) "podemos reconstruir todos os fatos verdadeiros a partir de uma forma normalizada que consiste em três tipos de registros separados" me dá uma pausa especial, pois, não importa a quantidade de lixo que eu bombeie
Table_1
, a junção natural ainda a ignora.Supondo que eu não goste desta decomposição (eu não). Reconheço livremente que a solução prática é deixar a tabela e o código como estão. Mas, em teoria, existe uma maneira de decompor e / ou adicionar restrições de modo que eu me afaste da primeira tabela e preserve minhas regras de negócios?