Создание отношений между таблицами MySql - PullRequest
2 голосов
/ 21 марта 2012

Я пытаюсь создать отношения между четырьмя таблицами в 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 Ответ

1 голос
/ 21 марта 2012

Проблема в том, что ваш второй NODEID CONSTRAINT перезаписывает первый.

Это полиморфное отношение, которое вы хотите создать, поэтому одно из возможных решений, которое все еще использует преимущества ограничений внешнего ключа базы данных, заключается в использованииполиморфный «supertable» для mainnodes и subnodes, называемый чем-то вроде nodes:

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

Затем пусть каждая из ваших «subtables» ссылается на это с помощью ограничения внешнего ключа:

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.и используйте код своего приложения, чтобы применить ограничение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...