MySQL - À Condition Que Les Contraintes De Clé Étrangère
Je avoir la suite "commentaires" de la table de mon application:
comments
--------
id INT
foreign_id INT
model TEXT
comment_text TEXT
...
l'idée de ce tableau est de stocker les commentaires pour les différentes parties de mon application peut stocker des commentaires de blog je.e:
1|34|blogpost|lorem ipsum...
de l'utilisateur de l'image:
2|12|picture|lorem ipsum...
et ainsi de suite.
maintenant, est-il un moyen pour forcer la contrainte de CLÉ ÉTRANGÈRE sur ces données?
c'est à dire quelque chose comme ceci dans les commentaires de la table:
FOREIGN KEY (`foreign_id`) REFERENCES blogposts (`id`)
//but only when model='blogpost'
Vous devez vous connecter pour publier un commentaire.
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.
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'un interface.
Avant, vous pouvez insérer une ligne dans
BlogPosts
ouUserPictures
, vous devez insérer une nouvelle ligne pourCommentable
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.