Me topé con un problema de diseño de base de datos que está fuera de mi alcance, y mi gurú de DBA está en simulacros de incendio.
En esencia, tengo una tabla con la siguiente clave primaria (PK por brevedad):
child_id integer
parent_id integer
date datetime
child_id
y parent_id
son claves foráneas para las tablas de entidad. La tabla "secundaria" en sí también contiene una clave foránea para la tabla "principal", y he aquí, cada una child_id
siempre hace referencia a la misma parent_id
que la tabla anterior. De hecho, resulta que hay un código adicional que mantiene los dos sincronizados.
Lo que hace que este principiante de normalización demasiado entusiasta diga "¡Debería eliminar la redundancia en su lugar!"
Me descompongo a lo siguiente:
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
Y he aquí, cuando me uno a estos tipos juntos de forma natural, recupero la tabla original. Es mi entendimiento lo que hace que este 5NF.
Sin embargo, ahora me doy cuenta de que hay una regla comercial oculta.
Normalmente, las fechas asociadas con un determinado child_id
deben ser un subconjunto de las fechas asociadas con el correspondiente parent_id
. Puede ver que la primera tabla impone esta regla.
Mi descomposición no impone la regla, porque puede agregarla libremente a la Tabla 1 hasta que las fechas sean demasiado grandes.
Lo que me lleva aquí, con las siguientes preguntas:
¿Es esta descomposición 5NF? Si bien diría que permite anomalías de inserción, también parece seguir el ejemplo de Wiki, que en sí mismo sigue esta guía . La frase (énfasis mío) "podemos reconstruir todos los hechos verdaderos a partir de una forma normalizada que consta de tres tipos de registros separados" me da una pausa especial, ya que no importa la cantidad de basura que bombeo
Table_1
, la unión natural todavía lo ignora.Supongamos que no me gusta esta descomposición (no me gusta). Reconozco libremente que la solución práctica es dejar la tabla y el código como están. Pero, en teoría, ¿hay alguna forma de descomponer y / o agregar restricciones de manera que me salga de la primera tabla y conserve mis reglas comerciales?