【问题标题】:Creating Relationships between MySql tables在 MySql 表之间创建关系
【发布时间】:2012-04-05 12:19:13
【问题描述】:

我正在尝试在 MySql 中创建四个表之间的关系:

mainnodes (ID)
subnodes (ID)
tagrelationship (NODEID & TAGID)
tag (ID)

“tagrelationship”表引用“mainnodes”,因此当我尝试插入时,我可以从“mainnodes”表中选择记录,但我也希望能够从“subnodes”表中进行选择。

我已经尝试像这样为“tagrelationship”设置表结构:

CREATE  TABLE IF NOT EXISTS `database`.`tagrelationship` (
`NODEID` INT(11) NOT NULL ,
 `TAGID` INT(11) NOT NULL ,
PRIMARY KEY (`TAGID`, `NODEID`) ,
INDEX `TAGS_TAGRELATIONSHIP` (`TAGID` ASC) ,
INDEX `SUB_TAGRELATIONSHIP` (`NODEID` ASC) ,
CONSTRAINT `TAGS_AGRELATIONSHIP`
  FOREIGN KEY (`TAGID` )
  REFERENCES `database`.`tags` (`ID` )
  ON DELETE CASCADE,
CONSTRAINT `MAINNODES_CMSTAGRELATIONSHIP`
  FOREIGN KEY (`NODEID` )
  REFERENCES `database`.`mainnodes` (`ID` )
  ON DELETE CASCADE,
CONSTRAINT `SUBNODES_CMSTAGRELATIONSHIP`
  FOREIGN KEY (`NODEID` )
  REFERENCES `database`.`subnodes` (`ID` )
  ON DELETE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;

这执行得很好,但我只能从“子节点”表中选择记录,不能同时选择两者。

我怎样才能做到这一点?

谢谢

【问题讨论】:

    标签: mysql foreign-keys constraints indexing


    【解决方案1】:

    问题是您的第二个 NODEID CONSTRAINT 覆盖了第一个。

    这是您要创建的多态关系,因此仍然利用数据库的外键约束的一种可能解决方案是为mainnodessubnodes 使用多态“超级表”,称为@ 987654323@:

    CREATE  TABLE IF NOT EXISTS `database`.`nodes` (
    `ID` INT(11) NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`ID`))
    

    然后让您的每个“子表”使用外键约束引用它:

    CREATE  TABLE IF NOT EXISTS `database`.`mainnodes` (
    ...
    `NODEID` INT(11) NOT NULL,
    CONSTRAINT `MAINNODE_NODE_RELATIONSHIP`
      FOREIGN KEY (`NODEID` )
      REFERENCES `database`.`nodes` (`ID` )
      ON DELETE CASCADE,
    ...)
    
    CREATE  TABLE IF NOT EXISTS `database`.`subnodes` (
    ...
    `NODEID` INT(11) NOT NULL,
    CONSTRAINT `SUBNODE_NODE_RELATIONSHIP`
      FOREIGN KEY (`NODEID` )
      REFERENCES `database`.`nodes` (`ID` )
      ON DELETE CASCADE,
    ...)
    

    最后,您的tagrelationship 表可以只引用超级表nodes

    CREATE  TABLE IF NOT EXISTS `database`.`tagrelationship` (
    ...
    CONSTRAINT `TAGS_AGRELATIONSHIP`
      FOREIGN KEY (`TAGID` )
      REFERENCES `database`.`tags` (`ID` )
      ON DELETE CASCADE,
    CONSTRAINT `NODES_CMSTAGRELATIONSHIP`
      FOREIGN KEY (`NODEID` )
      REFERENCES `database`.`nodes` (`ID` )
      ON DELETE CASCADE,
    ...)
    

    一个简单但不太可靠的解决方案是简单地删除关于 NODEID 可以引用的内容的最后两个约束,并使用您的应用代码来强制执行该约束。

    【讨论】:

    • 感谢您的回复。当我将索引添加到节点表时,我收到以下警告:索引 PRIMARY 和 NODE_ID 似乎相等,其中一个可能会被删除。这还可以吗?
    • @Robert,我错了。是的,那里应该只有 PRIMARY 索引。更新了我的答案。
    • 没问题。我不确定我的方法现在是否会奏效。基本上我正在尝试在 Umbraco 中设置自定义内容部分。不确定您是否有经验,但基本上当它创建默认节点/文档时,它似乎按以下顺序将记录添加到 3 个表中: umbraconode cmscontent cmsdocument 然后“tagsrelationship”表引用“umbraconode”表。在 umbraco 教程中,他们为自定义内容节点创建了一个表,并且根本不引用上面的表。不确定该表是否应该链接到上面的 3 个表。
    • 对不起,我不熟悉 Umbraco。
    猜你喜欢
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 2022-01-23
    • 2019-01-03
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2013-07-01
    相关资源
    最近更新 更多