Внешний ключ на основе другого столбца - PullRequest
0 голосов
/ 14 мая 2018

У меня есть одна база данных со следующими таблицами: Comments, Articles, Videos, Songs, Games, Books с отношениями один-ко-многим между Comments и другими ( Статья, видео, песня ... может иметь много комментариев). У меня есть ассоциативная таблица CommentBelongsTo с тремя столбцами comment_id, page_type, page_id), например, если page_type = 'article' и page_id = 1, означает, что комментарий относится к статье с id = 1. Вопрос как я могу установить page_id в качестве внешнего ключа в зависимости от page_type? Или есть лучший дизайн стола?

1 Ответ

0 голосов
/ 17 мая 2018

Следующая структура таблицы может решить проблему

DROP TABLE IF EXISTS `test`.`article`;
CREATE TABLE  `test`.`article` (
  `idArticle` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Name` varchar(45) NOT NULL DEFAULT '',
  PRIMARY KEY (`idArticle`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `test`.`games`;
CREATE TABLE  `test`.`games` (
  `idGames` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL DEFAULT '',
  PRIMARY KEY (`idGames`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `test`.`comments`;
CREATE TABLE  `test`.`comments` (
  `idComments` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `a_id` int(10) unsigned DEFAULT NULL,
  `g_id` int(10) unsigned DEFAULT NULL,
  `Comment` varchar(45) NOT NULL DEFAULT '',
  PRIMARY KEY (`idComments`),
  KEY `FK_Comments_1` (`a_id`),
  KEY `FK_Comments_2` (`g_id`),
  CONSTRAINT `FK_Comments_1` FOREIGN KEY (`a_id`) REFERENCES `article` (`idArticle`),
  CONSTRAINT `FK_Comments_2` FOREIGN KEY (`g_id`) REFERENCES `games` (`idGames`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

insert into article values (1,'A1');
insert into comments values (1,1,null,'A1 comment')
insert into games values (1,'G1');
insert into comments values (1,null,1,'G1 comment')

select * from comments where a_id<>'NULL';

Чтобы получить комментарии для определенного типа

...