2012-03-21 157 views
2

我试着在MySQL中创建四个表之间的关系:创建关系

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

表“tagrelationship”引用“mainnodes”所以,当我尝试插入,我可以选择从“mainnodes记录'表,但是我希望能够从'子节点'表中选择。

我试图像这样建立的表结构为“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; 

此执行很好,但我只能够从“子节点”表中选择记录不能同时使用。

我该如何做到这一点?

感谢

回答

1

问题是你的第二个NODEID约束是覆盖第一个。

这是您想创建一个多态的关系,所以一个可能的解决方案,仍然需要在数据库中的外键约束的优点是使用多态“超表”两个mainnodessubnodes,被称为像nodes

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可以参考过去两年的限制,并使用你的应用程序代码来强制约束。

+0

感谢您的回复。将索引添加到节点表时,出现以下警告: 索引PRIMARY和NODE_ID似乎相同,其中一个索引可能会被删除。 这还好吗? – Robert 2012-03-21 01:03:07

+0

@Robert,哎呀我的错。是的,应该只有PRIMARY索引。更新了我的答案。 – 2012-03-21 01:09:27

+0

没问题。我不确定我的方法现在会以任何方式工作。基本上我试图在Umbraco中设置一个自定义内容部分。 不知道,如果你有这方面的经验,但基本上,当它创建它似乎增加了记录,按以下顺序3个表默认节点/ DOC: umbraconode cmscontent cmsdocument 那么“tagsrelationship”表引用'umbraconode'表。 在umbraco教程中,他们为自定义内容节点创建了一张表,他们根本没有参考上述表格。 不确定的天气表应该与上面3张表相关联。 – Robert 2012-03-21 02:24:19