sql >> Base de Datos >  >> RDS >> Mysql

MySQL - Restricciones condicionales de clave foránea

Está intentando hacer un diseño que se llama Asociaciones polimórficas . Es decir, la clave externa puede hacer referencia a filas en cualquiera de varias tablas relacionadas.

Pero una restricción de clave externa debe hacer referencia exactamente a una tabla. No puede declarar una clave externa que haga referencia a diferentes tablas según el valor en otra columna de sus Comments mesa. Esto violaría varias reglas del diseño de bases de datos relacionales.

Una mejor solución es hacer una especie de "supertabla" a la que se haga referencia en los comentarios.

CREATE TABLE Commentable (
  id SERIAL PRIMARY KEY
);

CREATE TABLE Comments (
  comment_id SERIAL PRIMARY KEY,
  foreign_id INT NOT NULL,
  ...
  FOREIGN KEY (foreign_id) REFERENCES Commentable(id)
);

Cada uno de sus tipos de contenido se consideraría un subtipo de esta supertabla. Esto es análogo al concepto orientado a objetos de una interfaz .

CREATE TABLE BlogPosts (
  blogpost_id INT PRIMARY KEY, -- notice this is not auto-generated
  ...
  FOREIGN KEY (blogpost_id) REFERENCES Commentable(id)
);

CREATE TABLE UserPictures (
  userpicture_id INT PRIMARY KEY, -- notice this is not auto-generated
  ...
  FOREIGN KEY (userpicture_id) REFERENCES Commentable(id)
);

Antes de poder insertar una fila en BlogPosts o UserPictures , debe insertar una nueva fila en Commentable para generar una nueva ID de pseudoclave. Luego puede usar esa identificación generada a medida que inserta el contenido en la tabla de subtipo respectiva.

Una vez que haga todo eso, puede confiar en las restricciones de integridad referencial.