Это может быть больше, как то, что вы ищете:
CREATE TABLE tags (
question_id INTEGER NOT NULL,
tag_id SERIAL NOT NULL,
tag1 VARCHAR(20),
tag2 VARCHAR(20),
PRIMARY KEY (tag_id),
INDEX (question_id),
UNIQUE (tag1, tag2)
);
Создание «tag_id» означает, что первичный ключ, который вы можете иметь только одну запись с заданной «tag_id», и что поиски на основе " tag_id 'будет быстрым.
Индекс «question_id» улучшит скорость поиска на основе «question_id», что, как я думаю, вы пытаетесь сделать с помощью вашего первоначального определения PRIMARY KEY. Если вы действительно хотите, чтобы пара (tag_id, question_id) была уникальной, как и у вас, добавьте туда UNIQUE (tag_id, question_id), но я бы сказал, что вы должны оставить tag_id в качестве первичного ключа.
Ограничение уникальности (tag1, tag2) предотвращает дублирование обратного сопоставления.
Вот несколько примеров того, что может работать:
работы:
1 -> (х, у)
2 -> (х, г)
терпит неудачу (tag_id является первичным ключом, и, следовательно, является уникальным):
1 -> (х, у)
1 - > (У, х)
завершается (пара (tag1, tag2) не является уникальным):
1 -> (х, у)
2 -> (х, у)
Однако пара (x, y) не равна паре (y, x). Я не уверен, как поймать это ограничение уникальности.
Typo? «Работы: 1 -> (x, y) 2 -> (x, y)», «Fails (пара (tag1, tag2) не является уникальной): 1 -> (x, y) 2 -> (x, y) " –
Спасибо, я обновил его соответствующим образом и исправил форматирование. – Jonathan