2017-03-08 58 views
0

我有questionsanswers的表,每个表有一个主键id两列MySQL外键:整数和字符串

而且具有以下结构的表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添加一个外键约束引用的表questionsanswers的ID。有没有办法通过组合这两个变量来组成独特的参考(item_modelitem_id)?

或者是我选择的糟糕做法的结构,这意味着我应该创建两个数据透视表answer_votequestion_vote

+0

发布您当前的'SHOW CREATE TABLE'输出 – e4c5

回答

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 

然后我们可以声明两个单独的外键约束。

如果您希望执行answer_id应该为NULL的规则,并且在item_model为'Question'时应填充question_id(非NULL),那么可以在BEFORE INSERT和BEFORE UPDATE触发器中强制执行此规则。

+0

在您的替代解决方案中,item_model变得毫无用处了吗?你建议删除它还是它有一个我没有看到的目的? –

+1

在我提出的第一个选择中考虑,是的,存储'item_model'将是多余的,因为它可以从测试'question_id'或'answer_id'列是否被填充的条件派生。这绝对是多余的。它可能还有一些用处。如果没有好处,我会删除它。 (我们仍然需要触发器来执行一条规则,即只有一个'question_id'或'answer_id'可以填充,如果保留'item_model'列,触发器可以维护该列,根据哪个FK填充。 )拥有该列可能会使查询更简单。 – spencer7593