2012-03-21 3 views
2

임 MySQL의 네 개의 테이블 간의 관계를 만들려고 :만들기 관계

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

테이블 내가 삽입을 시도 할 때, 나는 'mainnodes에서 레코드를 선택할 수 있습니다'tagrelationship '참조'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; 

이 잘 실행하지만 난뿐만 아니라 모두 '하위 노드'테이블에서 레코드를 선택할 수 있어요.

어떻게이 작업을 수행 할 수 있습니까?

감사

답변

1

문제는 두 번째 NODEID 제약은 첫째을 덮어이다.

이것은 당신이 만들 찾고 있습니다 다형성 관계, 그래서 여전히 데이터베이스의 외래 키 제약 조건을 활용 한 가지 가능한 솔루션은 nodes처럼 mainnodessubnodes 모두라는 것을 다형성 "상위 테이블"을 사용하는 것입니다

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, 
...) 

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 표는 단지 ​​상위 테이블, nodes를 참조 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 노드 테이블에 인덱스를 추가하면 다음과 같은 경고 메시지가 나타납니다. 인덱스 PRIMARY와 NODE_ID가 같고 그 중 하나가 제거 될 수 있습니다. 여전히 괜찮습니까? – Robert

+0

@ 로버트, 내 실수. 예, PRIMARY 인덱스 만 있으면됩니다. 내 대답이 업데이트되었습니다. –

+0

문제 없습니다. 내 접근 방식이 이제는 어떤 방식 으로든 작동하지 않을지 확신 할 수 없습니다. 기본적으로 Umbraco 내에서 사용자 정의 컨텐츠 섹션을 설정하려고합니다. 당신이 경험이 있지만, 경우에 확실하지 에 다음과 같은 순서로 3 개 테이블에 레코드를 추가 나타나는 기본 노드/문서 생성 기본적 때 umbraconode cmscontent cmsdocument 가 그런 다음 'tagsrelationship'테이블이를 참조를 'umbraconode'테이블. umbraco 자습서에서는 사용자 지정 콘텐츠 노드에 대해 하나의 테이블을 만들었으며 위의 테이블을 전혀 참조하지 않았습니다. 날씨가 위의 3 개 테이블에 연결되어야하는지 확실하지 않습니다. – Robert

관련 문제