sql >> Base de Datos >  >> RDS >> PostgreSQL

Restricciones de clave externa de asociación polimórfica. ¿Es esta una buena solución?

El mayor problema que tengo con INHERITS de PostgreSQL La implementación es que no puede establecer una referencia de clave externa a la tabla principal. Hay muchos de los casos en los que necesita hacer eso. Vea los ejemplos al final de mi respuesta.

La decisión de crear tablas, vistas o disparadores fuera de Rails es crucial. Una vez que decidas hacer eso, creo que también podrías usar la mejor estructura que puedas encontrar.

Durante mucho tiempo he usado una tabla principal base, imponiendo subtipos disjuntos usando claves foráneas. Esta estructura garantiza que solo puede existir una asociación y que la asociación se resuelve en el subtipo correcto en la tabla principal. (En la presentación de diapositivas de Bill Karwin sobre antipatrones SQL , este enfoque comienza en la diapositiva 46). Esto no requiere disparadores en los casos simples, pero generalmente proporciono una vista actualizable por subtipo y requiero código de cliente para usar las vistas. En PostgreSQL, las vistas actualizables requieren escribir disparadores o reglas. (Las versiones anteriores a la 9.1 requieren reglas).

En el caso más general, los subtipos disjuntos no tienen el mismo número o tipo de atributos. Por eso me gustan las vistas actualizables.

La herencia de tablas no es portátil, pero este tipo de estructura sí lo es. Incluso puedes implementarlo en MySQL. En MySQL, debe reemplazar las restricciones CHECK con referencias de clave externa a tablas de una fila. (MySQL analiza e ignora las restricciones CHECK).

No creo que tengas que preocuparte por la duplicación de datos. En primer lugar, estoy bastante seguro de que los datos no se duplican entre las tablas principales y las tablas heredadas. Simplemente aparece de esa manera. En segundo lugar, la duplicación o los datos derivados cuya integridad está completamente controlada por el dbms no son una píldora especialmente amarga de tragar. (Pero descontrolado la duplicación es.)

Piense un poco si las eliminaciones deben realizarse en cascada.