2012-03-21 104 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