una secundaria restricción puede optimizar lentas indice fila falla externa error encontrado consultas columnas clave agregar actualizar mysql database postgresql polymorphic-associations

mysql - optimizar - no se puede agregar o actualizar una fila secundaria falla una restricción de clave externa



¿Clave extranjera para una de muchas tablas? (4)

La forma habitual de establecer una restricción de clave externa es elegir a qué tabla apuntará la clave externa.

Estoy teniendo una relación polimórfica entre 1 tabla y un conjunto de tabla.

Eso significa que esta tabla tendrá una relación con una de esas tablas en el conjunto.

p.ej.

images: person_id, person_type subordinates: id, col1, col2...col9 products: id, colA, colB...colZ

En el ejemplo anterior, si person_type es "subordinados", person_id debe ser una clave foránea para subordinates.id y lo mismo ocurre con los productos.

Entonces me pregunto, ¿es posible tener una clave externa para una de muchas tablas, o tienes que establecer específicamente a qué tabla apunta cuando asignas una?

Esta pregunta es para MySQL y PostgreSQL.

Gracias


Por definición, una clave externa debe apuntar a una clave primaria o candidata en la tabla uno-y-uno-primario-solo está disponible en un DBMS típico. Es mejor tener una sola tabla de "personas" y tener tablas relacionadas con esto, por ejemplo, con la información del gerente.


Una clave externa solo puede apuntar a una sola tabla.

Me parece que lo que realmente quería hacer aquí es crear una identificación para padres en su mesa de personas. Los subordinados tendrían una identificación de padres apuntando a sus gerentes. Si un subordinado necesita tener varios administradores, se puede crear una tabla de unión separada con 2 columnas, cada una de las cuales contiene una identificación de persona, una es el subordinado y la otra es uno de los administradores.

Si desea restringir quién podría asignarse al campo parentid, esto podría hacerse con una restricción de verificación.


Una columna es solo un marcador de posición para un valor. Una restricción de clave externa significa que los datos almacenados dentro de esa columna solo pueden ser un valor que coincida con la columna de la tabla definida en la restricción. Las restricciones de clave externa son por tabla ...

No hay nada que le impida definir múltiples restricciones de clave externa en una columna. Pero esto significa que el único valor que se permite almacenar serán los valores que ya existen en todas las demás tablas relacionadas con el exterior. IE: TABLE_1 tiene los valores 1 y 2, TABLE_2 tiene los valores 2 y 3 - TABLE_3 tiene relaciones de clave foránea definidas para las tablas 1 y 2 en la columna col de TABLE_3 ... El único valor válido que puedo insertar en TABLE_3.col es 2, porque es en ambas tablas (suponiendo que col no es nulable).


No, una restricción de clave externa siempre hace referencia exactamente a una tabla padre.

Esta pregunta aparece con frecuencia. Estas son algunas de mis respuestas anteriores:

Para obtener más información sobre asociaciones polimórficas, vea mi presentación Modelos prácticos orientados a objetos en SQL o mi libro, SQL Antipatterns: Cómo evitar las trampas de la programación de bases de datos .