Php 有26个外键的MySQL表的替代方案吗
我有一个InnoDB MySQL数据库,其中的一个表需要能够通过外键连接到其他26个表中的一个。每条记录一次只能连接到这26条记录中的一条。该表可能包含不超过10000条记录。有没有其他方法可以做到这一点Php 有26个外键的MySQL表的替代方案吗,php,mysql,Php,Mysql,我有一个InnoDB MySQL数据库,其中的一个表需要能够通过外键连接到其他26个表中的一个。每条记录一次只能连接到这26条记录中的一条。该表可能包含不超过10000条记录。有没有其他方法可以做到这一点 -- ----------------------------------------------------- -- Table `db_mydb`.`tb_job` -- ----------------------------------------------------- CREAT
-- -----------------------------------------------------
-- Table `db_mydb`.`tb_job`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `db_mydb`.`tb_job` (
`job_id` INT(11) NOT NULL AUTO_INCREMENT ,
// Removed 26 other fields that the table requires
`job_foreignkey_a_id` INT(11) NULL DEFAULT NULL ,
`job_foreignkey_b_id` INT(11) NULL DEFAULT NULL ,
`job_foreignkey_c_id` INT(11) NULL DEFAULT NULL ,
// Removed the other 23 foreign keys fields that are the same
PRIMARY KEY (`job_id`) ,
CONSTRAINT `fka_tb_job_tb`
FOREIGN KEY (`job_foreignkey_a_id` )
REFERENCES `db_mydb`.`tb_foreignkey_a` (`foreignkey_a_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkb_tb_job_tb`
FOREIGN KEY (`job_foreignkey_b_id` )
REFERENCES `db_mydb`.`tb_foreignkey_b` (`foreignkey_b_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkc_tb_job_tb`
FOREIGN KEY (`job_foreignkey_c_id` )
REFERENCES `db_mydb`.`tb_foreignkey_c` (`foreignkey_c_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
// Removed the other 23 foreign keys constraints that are the same
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
CREATE INDEX `fka_tb_job_tb` ON `db_mydb`.`tb_job` (`job_foreignkey_a_id` ASC) ;
CREATE INDEX `fkb_tb_job_tb` ON `db_mydb`.`tb_job` (`job_foreignkey_b_id` ASC) ;
CREATE INDEX `fkc_tb_job_tb` ON `db_mydb`.`tb_job` (`job_foreignkey_c_id` ASC) ;
// Removed the other 23 foreign keys indexes that are the same
这就是一般外键的问题,MySQL和friends往往不支持。有两种方法可以做到这一点 正如您所做的,第一个是可为空的外键,每种类型一个外键 另一个,如Django的
内容类型
,是有一个联接表,每一行都有一个行id和一个指定要查找的表的字段。然后,您的代码必须根据字段的内容制定SQL查询。它运行良好,但有局限性:
第一种方法的缺点是膨胀,但它带来了普通FK的优点,即引用完整性和SQL连接等,这两种方法都非常有价值。使用第二种方法无法获取这些值。取决于您是否要维护外键约束,您可以有一个表,该表通过键或表类型引用其中一个表。问题是您将失去外键约束。当然,如果您可以创建基于函数的约束,那么它就可以为您工作。或者可以使用触发器强制执行关系。基于函数的约束在mysql中不可用。是的,您可以这样做。这两个答案在稍微不同的背景下说明了基本原则
如果这些信息不足以让您继续,请给我留言,我会尝试进一步扩展此答案。不,我认为没有其他方法。为什么您希望保留每种类型的工作,即fka、fkb,。。。在不同的桌子上?