Пара первичных ключей уникальна в обоих направлениях - PullRequest
0 голосов
/ 22 октября 2018

Вот моя проблема:

Я хочу создать отношения между двумя элементами одного типа.

По сути, у меня есть таблица 'tag', и я хочу установить отношения между тегами.

Я создал таблицу 'tag_relations'.В этой таблице каждая строка будет представлять одно отношение.Он будет состоять из 2 атрибутов: tag_id (который является идентификатором тега, связанного с отношением) и отношения (который является идентификатором тега, связанного с первым тегом, представленным тегом tag_id).

Iустановите первичный ключ моей таблицы tag_relations в качестве пары этих двух атрибутов.

Вот как я создал свою таблицу:

CREATE TABLE `tag_relation` (
  `tag_id` int(11) NOT NULL,
  `relation` int(11) NOT NULL,
  PRIMARY KEY (`tag_id`,`relation`),
  KEY `relation` (`relation`),
  CONSTRAINT `tag_relation_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tag` (`id`),
  CONSTRAINT `tag_relation_ibfk_2` FOREIGN KEY (`relation`) REFERENCES `tag` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Мой вопрос: как я могу убедиться,, если у меня уже есть пара (1,2) в моей таблице (поэтому тег 1 связан с тегом 2), я не смогу вставить пару (2,1) (поскольку это отношение уже существует неявно).

Я вынужден создать триггер?

Заранее спасибо

1 Ответ

0 голосов
/ 22 октября 2018

Некоторые базы данных поддерживают индексы для выражений.Начиная с 5.7, MySQL генерирует столбцы с индексами.Это позволяет вам:

alter table tag_relation add tag1 generated always as (least(tag1, relation));
alter table tag_relation add tag2 generated always as (greatest(tag1, relation));

create unique index unq_tag_relation_tag1_tag2 on tag_relation(tag1, tag2);

В более ранних версиях вам понадобится триггер insert (и, возможно, update) для обеспечения целостности данных.

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