¿Cómo tener una única clave foránea para diferentes tablas en MySQL?
Digamos que tengo las siguientes tablas:
tabla_a
id | col_1 | col_2 | col_3
En la tabla_a, id es la clave primaria
tabla_b
id | col_1 | col_2 | col_3
En la tabla_b, id es la clave primaria
tabla_c
id | col_1 | col_2 | col_3 | entity_id | entity_table
En la tabla_c, id es la clave primaria, entity_id es la clave foránea a tabla_a o tabla_b y entity_table puede tener el valor de tabla_a o tabla_b.
Ahora, extrapolemos esto y supongamos que tenemos 10 tablas diferentes a las que entity_id puede tener claves foráneas.
Lo que estoy tratando de hacer es vincular entity_id a la tabla específica basándome en la columna entity_table, que proporciona el nombre de la tabla.
He investigado y parece que no podemos tener múltiples claves foráneas en una sola columna que apunten a múltiples tablas. ¿Cómo puedo resolver esto y cómo sería una buena solución?
davy.ai
Una solución podría ser crear una nueva columna en
tabla_c
para cada posible clave foránea, nombrándolas algo comoa_id
,b_id
,c_id
, etc. Luego, entabla_entidad
, en lugar de almacenar el nombre real de la tabla, guardar un código para cada tabla. Por ejemplo,a
paratabla_a
,b
paratabla_b
, etc.Luego, en el código de tu aplicación, puedes usar un interruptor o una declaración if/else para determinar qué columna utilizar en función del valor en
tabla_entidad
. Por ejemplo, sitabla_entidad
esa
, utilizar la columnaa_id
como clave foránea.Otra alternativa sería crear una tabla separada que mapee cada código posible con el nombre de tabla y el nombre de columna correspondientes. De esta manera, podrías agregar nuevas tablas en el futuro sin tener que modificar el código de tu aplicación.
En general, este enfoque requeriría más configuración inicial y posiblemente una lógica de aplicación más compleja, pero permitiría flexibilidad para agregar nuevas tablas en el futuro.