68 votes

MySQL - Contraintes de clés étrangères conditionnelles

J'ai suivi 'commentaires' table dans mon application:

l'idée de ce tableau est de stocker des commentaires pour diverses parties de mon application - il peut stocker des commentaires pour le blog c'est à dire:

image utilisateur:

et ainsi de suite.

maintenant, y a-t-il un moyen de forcer foreign KEY contrainte sur ces données?

c'est-à-dire quelque chose comme ça dans le tableau des commentaires:

122voto

Bill Karwin Points 204877

Vous êtes en essayant de faire un design qui est appelé Polymorphes Associations. C'est la clé étrangère peut faire référence à des lignes dans un de plusieurs tables liées.

Mais une contrainte de clé étrangère doit faire référence à une seule table. Vous ne pouvez pas déclarer une clé étrangère qui fait référence à des tables différentes en fonction de la valeur d'une autre colonne de votre Comments table. Cela violerait plusieurs règles de base de données relationnelle de la conception.

Une meilleure solution est de faire une sorte de "supertable" qui est référencé par les commentaires.

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

Chacun de vos types de contenu serait considéré comme un sous-type de ce supertable. Ceci est analogue à l'orientée objet concept d'une interface.

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

Avant de vous pouvez insérer une ligne dans BlogPosts ou UserPictures, vous devez insérer une nouvelle ligne d' Commentable pour générer un nouveau pseudokey id. Ensuite, vous pouvez l'utiliser id généré lorsque vous insérez le contenu à chaque sous-type de table.

Une fois que vous faites tout cela, vous pouvez compter sur les contraintes d'intégrité référentielle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X