Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 有26个外键的MySQL表的替代方案吗_Php_Mysql - Fatal编程技术网

Php 有26个外键的MySQL表的替代方案吗

Php 有26个外键的MySQL表的替代方案吗,php,mysql,Php,Mysql,我有一个InnoDB MySQL数据库,其中的一个表需要能够通过外键连接到其他26个表中的一个。每条记录一次只能连接到这26条记录中的一条。该表可能包含不超过10000条记录。有没有其他方法可以做到这一点 -- ----------------------------------------------------- -- Table `db_mydb`.`tb_job` -- ----------------------------------------------------- CREAT

我有一个InnoDB MySQL数据库,其中的一个表需要能够通过外键连接到其他26个表中的一个。每条记录一次只能连接到这26条记录中的一条。该表可能包含不超过10000条记录。有没有其他方法可以做到这一点

-- -----------------------------------------------------
-- 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中不可用。

是的,您可以这样做。这两个答案在稍微不同的背景下说明了基本原则

使用MySQL,您需要用外键引用替换临界CHECK()约束。这在MySQL最常见的情况下不起作用,但在这个特定的应用程序中起作用


如果这些信息不足以让您继续,请给我留言,我会尝试进一步扩展此答案。

不,我认为没有其他方法。为什么您希望保留每种类型的工作,即fka、fkb,。。。在不同的桌子上?