两列上的MySQL外键:整数AND字符串

时间:2017-03-08 01:30:15

标签: mysql foreign-keys foreign-key-relationship

我有questionsanswers的表格,每个表格都有一个主键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上添加外键约束以引用表questionsanswers上的ID。有没有办法通过组合两个变量来组成唯一引用(item_modelitem_id)?

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

1 个答案:

答案 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触发器中强制执行。