Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL - Vincoli di chiave esterna condizionali

Stai tentando di realizzare un progetto chiamato Associazioni polimorfiche . Cioè, la chiave esterna può fare riferimento a righe in una qualsiasi delle numerose tabelle correlate.

Ma un vincolo di chiave esterna deve fare riferimento esattamente a una tabella. Non puoi dichiarare una chiave esterna che fa riferimento a tabelle diverse a seconda del valore in un'altra colonna dei tuoi Comments tavolo. Ciò violerebbe diverse regole di progettazione di database relazionali.

Una soluzione migliore è creare una sorta di "supertabella" a cui fanno riferimento i commenti.

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)
);

Ciascuno dei tuoi tipi di contenuto sarebbe considerato un sottotipo di questa supertable. Questo è analogo al concetto orientato agli oggetti di un'interfaccia .

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)
);

Prima di poter inserire una riga in BlogPosts o UserPictures , devi inserire una nuova riga in Commentable per generare un nuovo ID pseudochiave. Quindi puoi utilizzare l'ID generato mentre inserisci il contenuto nella rispettiva tabella dei sottotipi.

Una volta fatto tutto ciò, puoi fare affidamento sui vincoli di integrità referenziale.