Если у меня есть таблица в MySQL, представляющая базовый класс, и у меня есть набор таблиц, представляющих поля в производных классах, каждая из которых ссылается на базовую таблицу с внешним ключом, есть ли способ заставить MySQL навязать взаимно-однозначное отношение между производной таблицей и базовой таблицей, или это должно быть сделано в коде?
На примере следующей быстрой 'n' грязной схемы, есть ли способ получить MySQL, чтобы гарантировать, что строки в product_cd и product_dvd не могут использовать один и тот же product_id? Есть ли лучший способ спроектировать схему, чтобы база данных могла обеспечить соблюдение этого отношения, или это просто невозможно?
CREATE TABLE IF NOT EXISTS `product` (
`product_id` int(10) unsigned NOT NULL auto_increment,
`product_name` varchar(50) NOT NULL,
`description` text NOT NULL,
PRIMARY KEY (`product_id`)
) ENGINE = InnoDB;
CREATE TABLE `product_cd` (
`product_cd_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`product_id` INT UNSIGNED NOT NULL ,
`artist_name` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( `product_cd_id` ) ,
INDEX ( `product_id` )
) ENGINE = InnoDB;
ALTER TABLE `product_cd` ADD FOREIGN KEY ( `product_id` )
REFERENCES `product` (`product_id`)
ON DELETE RESTRICT ON UPDATE RESTRICT ;
CREATE TABLE `product_dvd` (
`product_dvd_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`product_id` INT UNSIGNED NOT NULL ,
`director` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( `product_dvd_id` ) ,
INDEX ( `product_id` )
) ENGINE = InnoDB;
ALTER TABLE `product_dvd` ADD FOREIGN KEY ( `product_id` )
REFERENCES `product` (`product_id`)
ON DELETE RESTRICT ON UPDATE RESTRICT ;
@ Skliwz , не могли бы вы предоставить более подробную информацию о том, как можно использовать триггеры для обеспечения соблюдения этого ограничения с помощью предоставленной схемы?
@ Боес , это звучит великолепно. Как это работает в ситуациях, когда у вас есть ребенок от ребенка? Например, если мы добавили product_movie и сделали product_dvd дочерним по отношению к product_movie? Будет ли кошмаром сопровождения сделать так, чтобы проверочное ограничение для product_dvd учитывало также все дочерние типы?