12

Assiociations polimórficos (PA) es bastante exigente para un requisito de base de datos relativamente simple: permitir que varias tablas tengan registros secundarios en una tabla compartida. El ejemplo clásico es una sola tabla con registros de comentarios que se aplican a diferentes entidades no necesariamente afines.Cómo implementar asociaciones polimórficas en una base de datos existente

En this question Mark hizo un excelente trabajo mostrando tres enfoques comunes para implementar las PA. Quiero utilizar el enfoque de la tabla base, que se describe con más detalle en un igualmente excelente answer by Bill Karwin.

Un ejemplo concreto se vería así:

enter image description here

las claves primarias de las entidades se refieren a los valores de clave idénticas en la tabla base y la tabla de comentario se refiere a la tabla de base, la integridad de modo referencial es observado. La parte crucial aquí es que las claves principales de las tablas de entidades tienen dominios distintos. Se generan creando un nuevo registro en la tabla base y copiando su clave generada a la clave primaria de la entidad.

Ahora mi pregunta: ¿Qué ocurre si quiero introducir PA con integridad referencial en una base de datos existente que tiene entidades que generan sus propias claves primarias que se solapan mutuamente?

Hasta ahora, veo dos opciones:

Opción 1:

Option 1

Cada entidad mantiene su propia clave primaria, pero también recibe una clave alternativa.

igual:

  • Cerca del enfoque recomendado.
  • La tabla base es estable.

No me gusta:

  • entidades existentes deben ser modificadas.
  • Es difícil encontrar la entidad propietaria de un comentario.

Opción 2:

Option 2

Cada entidad tiene su propia columna de clave externa de la tabla base. Esto se parece al enfoque de columnas múltiples de Mark.

igual:

  • entidades existentes no afectada.
  • Fácil de encontrar la entidad propietaria de un comentario.

No me gusta:

  • Las columnas dispersas
  • tabla base no es estable: necesita ser modificado cuando se introduce una nueva entidad con PA

Me apoyo a la opción 1, posiblemente con un campo "EntityName" en la tabla Base para búsqueda bidireccional. Qué opción sería mejor. ¿O hay otro enfoque, incluso mejor?

+0

Opción 1 sería más fácil de mantener. Si tiene que seguir agregando columnas a su tabla base, será una molestia y requerirá mucho mantenimiento debido a divisiones de página, punteros y demás. – JNK

+0

@JNK Buen punto, es importante tener en cuenta el impacto del almacenamiento físico. –

+0

Puede usar la Opción 1 pero no con una Clave alternativa sustituta adicional. La nueva clave alternativa puede ser la clave principal existente (de cada entidad), extendida con una columna 'EntityType' (digamos' CHAR (1) ', que sería' E' para Eventos, 'P' para Personas,' D' para Productos) –

Respuesta

9

Puede utilizar la Opción 1 pero sin una clave alternativa suplente.

En cambio, extienden la clave principal existente (de cada entidad), con una columna EntityType (digamos CHAR(1), eso sería E para Eventos, P para las personas, D de los productos).

El compuesto (EntityId, EntityType) se convertirá entonces en la clave principal de la tabla Entity y los compuestos correspondientes en las otras 3 tablas de subtipos.

(El EntityType es sólo un auxilary, tabla de referencia, con 3 filas):

Polymorphic_Associations

Cuestiones relacionadas