I have following 'comments' table in my app:
comments
--------
id INT
foreign_id INT
model TEXT
comment_text TEXT
...
the idea of this table is to store comments for various parts of my app - it can store comments for blog post i.e:
1|34|blogpost|lorem ipsum...
user picture:
2|12|picture|lorem ipsum...
and so on.
now, is there a way to force FOREIGN KEY constraint on such data?
i.e. something like this in comments table:
FOREIGN KEY (`foreign_id`) REFERENCES blogposts (`id`)
//but only when model='blogpost'
You're attempting to do a design that is called Polymorphic Associations. That is, the foreign key may reference rows in any of several related tables.
But a foreign key constraint must reference exactly one table. You can't declare a foreign key that references different tables depending on the value in another column of your
Comments
table. This would violate several rules of relational database design.A better solution is to make a sort of "supertable" that is referenced by the comments.
Each of your content types would be considered a subtype of this supertable. This is analogous to the object-oriented concept of an interface.
Before you can insert a row into
BlogPosts
orUserPictures
, you must insert a new row toCommentable
to generate a new pseudokey id. Then you can use that generated id as you insert the content to the respective subtype table.Once you do all that, you can rely on referential integrity constraints.