sql-server-2008 - una - el usuario no tiene permiso para modificar la base de datos
Cómo implementar asociaciones polimórficas en una base de datos existente (1)
Puede usar la Opción 1 pero sin una clave alternativa sustituta adicional.
En cambio, extienda la Clave principal existente (de cada entidad), con una columna EntityType
(digamos CHAR(1)
, que sería E
para Eventos, P
para Personas, D
para 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.
( EntityType
es solo una tabla de referencia auxiliar, con 3 filas):
Las assiociaciones polimórficas (AP) son bastante complicadas para un requisito de base de datos relativamente simple: deje 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.
En esta pregunta, Mark hizo un excelente trabajo mostrando tres enfoques comunes para implementar PA. Quiero utilizar el enfoque de la tabla base, que se describe con más detalle en una respuesta igualmente excelente de Bill Karwin .
Un ejemplo concreto se vería así:
Las claves primarias de las entidades se refieren a valores clave idénticos en la tabla base y la tabla de comentarios se refiere a la tabla base, por lo que se observa la integridad referencial. 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: ¿y si quiero introducir PA con integridad referencial en una base de datos existente que tenga entidades que generen sus propias claves primarias que se solapen mutuamente?
Hasta ahora, veo dos opciones:
Opción 1:
Cada entidad conserva su propia clave principal pero también obtiene una clave alternativa.
Me gusta:
- Cerca del enfoque recomendado.
- La mesa base es estable.
Disgusto:
- Las entidades existentes deben ser modificadas.
- Es difícil encontrar la entidad propietaria de un comentario.
Opcion 2:
Cada entidad tiene su propia columna de clave externa en la tabla base. Esto se parece al enfoque de columnas múltiples de Mark.
Me gusta:
- Entidades existentes no afectadas
- Fácil de encontrar la entidad propietaria de un comentario.
Disgusto:
- Columnas dispersas
- La tabla base no es estable: necesita modificación cuando se introduce una nueva entidad con PA.
Me inclino por 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?