我有questions
和answers
的表格,每个表格都有一个主键id
。
表votes
具有以下结构:
CREATE TABLE `answers` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
//whatever
PRIMARY KEY (`id`)
)
CREATE TABLE `questions` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
//whatever
PRIMARY KEY (`id`)
)
CREATE TABLE `votes` (
`item_model` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
`item_id` int(10) NOT NULL,
`vote` int(1) NOT NULL,
KEY `item_id_model` (`item_model`,`item_id`)
)
The index on votes consists of 2 columns:
item_model: string - can have one of 2 values: 'Question' or 'Answer'
item_id: integer - references the question or answer's id
如何在votes
上添加外键约束以引用表questions
和answers
上的ID。有没有办法通过组合两个变量来组成唯一引用(item_model
和item_id
)?
或者我选择的投票结构是不良做法,这意味着我应该创建两个数据透视表answer_vote
和question_vote
?
答案 0 :(得分:1)
作为第一个问题的答案......
不可以,将两列(item_model,item_id)
组合成一个引用两个可能表的外键约束,具体取决于item_model
的值。
你可以保留设计。就目前的实现而言,只是不可能像那样声明一个FOREIGN KEY约束。
就替代设计而言,考虑的一种可能性是定义两个单独的列,一个作为FK到question
,另一个作为FK到answer
id int COMMENT 'the vote id'
item_model ENUM('Question','Answer')
question_id int NULL COMMENT 'FK ref question.id'
answer_id int NULL COMMENT 'FK ref answer.id'
vote TINYINT
然后我们可以声明两个单独的外键约束。
如果你想强制执行一个规则,即当item_model是'问题'时,answer_id应为NULL并且应该填充question_id(非NULL),那么可以在BEFORE INSERT和BEFORE UPDATE触发器中强制执行。