Las bases de datos relacionales no están construidas para manejar esta situación perfectamente. Debe decidir qué es lo más importante para usted y luego hacer sus compensaciones. Tienes varios objetivos:
- Mantener la tercera forma normal
- Mantener integridad referencial
- Mantenga la restricción de que cada cuenta pertenece a una corporación o persona física.
- Preserve la capacidad de recuperar datos de manera simple y directa
El problema es que algunos de estos objetivos compiten entre sí.
Solución de subtipificación
Puede elegir una solución de subtipificación en la que cree un supertipo que incorpore corporaciones y personas. Este supertipo probablemente tendría una clave compuesta de la clave natural del subtipo más un atributo de partición (por ejemplo customer_type
). Esto está bien en lo que respecta a la normalización y le permite hacer cumplir la integridad referencial, así como la restricción de que las corporaciones y las personas se excluyan mutuamente. El problema es que esto hace que la recuperación de datos sea más difícil, porque siempre tiene que bifurcarse customer_type
cuando se une la cuenta al titular de la cuenta. Esto probablemente significa usar UNION
y tener muchos SQL repetitivos en su consulta.
Solución de dos claves extranjeras
Puede elegir una solución en la que mantenga dos claves extranjeras en la tabla de su cuenta, una para la corporación y otra para la persona. Esta solución también le permite mantener integridad referencial, normalización y exclusividad mutua. También tiene el mismo inconveniente de recuperación de datos que la solución de subtipado. De hecho, esta solución es igual que la solución de subtipado, excepto que llega al problema de bifurcar su lógica de unión "antes".
Sin embargo, muchos modeladores de datos considerarían esta solución inferior a la solución de subtipado debido a la forma en que se aplica la restricción de exclusividad mutua. En la solución de subtipado, utiliza claves para imponer la exclusividad mutua. En las dos soluciones de clave externa, utiliza una CHECK
restricción. Conozco algunas personas que tienen un sesgo injustificado contra las restricciones de verificación. Estas personas preferirían la solución que mantiene las restricciones en las claves.
Solución de atributos de particionamiento "desnormalizados"
Hay otra opción en la que mantiene una sola columna de clave externa en la tabla de la cuenta de cheques y usa otra columna para indicarle cómo interpretar la columna de clave externa (RoKa'sOwnerTypeID
columna). Esto esencialmente elimina la tabla de supertipo en la solución de subtipado al desnormalizar el atributo de partición en la tabla secundaria. (Tenga en cuenta que esto no es estrictamente "desnormalización" según la definición formal, porque el atributo de partición es parte de una clave primaria). Esta solución parece bastante simple ya que evita tener una tabla adicional para hacer más o menos lo mismo y reduce el número de columnas de clave externa a uno. El problema con esta solución es que no evita la ramificación de la lógica de recuperación y, además, no le permite mantener la integridad referencial declarativa . Las bases de datos SQL no tienen la capacidad de administrar una sola columna de clave externa para una de varias tablas principales.
Solución de dominio de clave primaria compartida
Una forma en que las personas a veces se ocupan de este problema es usar un solo grupo de ID para que no haya confusión para una ID dada si pertenece a un subtipo u otro. Esto probablemente funcionaría de manera bastante natural en un escenario bancario, ya que no va a emitir el mismo número de cuenta bancaria tanto para una corporación como para una persona física. Esto tiene la ventaja de evitar la necesidad de un atributo de partición. Puede hacer esto con o sin una tabla de supertipo. El uso de una tabla de supertipo le permite usar restricciones declarativas para imponer la unicidad. De lo contrario, esto debería hacerse cumplir procesalmente. Esta solución está normalizada, pero no le permitirá mantener la integridad referencial declarativa a menos que mantenga la tabla de supertipo. Todavía no hace nada para evitar una lógica de recuperación compleja.
Por lo tanto, puede ver que no es realmente posible tener un diseño limpio que siga todas las reglas, al mismo tiempo que simplifica la recuperación de sus datos. Tienes que decidir dónde van a ser tus compensaciones.
OwnerTypeID
en laChecquingAccount
mesa, con1=Corporation
y2=NaturalPerson
? De esa manera solo necesita unoOwnerID
en laChecquingAccount
tabla, que puede indexar junto conOwnerTypeID
.