2009-08-17 3 views
1

Я хочу биекцию между парой (tag1, tag2) и tag_id.Postgres: Уникальная ссылка от A до B

CREATE TABLE tags (
     question_id INTEGER NOT NULL, 
     tag_id SERIAL NOT NULL, 
     tag1 VARCHAR(20), 
     tag2 VARCHAR(20), 
     PRIMARY KEY(question_id, tag_id), 
     (tag1, tag2) UNIQUE references tags(tag_id)   #How? 
    ); 

Я не хочу никаких ссылок, таких как:

(PHP, Perl) points to 1 and 2, 
3 points to (C#, null) and (Python, Elinks) 

Другими словами, я хочу ССЫЛКА быть уникальным FROM (tag1, tag2) К тегов (tag_id), не единственна (tag1, tag2).

ответ

3

Это может быть больше, как то, что вы ищете:

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). Я не уверен, как поймать это ограничение уникальности.

+0

Typo? «Работы: 1 -> (x, y) 2 -> (x, y)», «Fails (пара (tag1, tag2) не является уникальной): 1 -> (x, y) 2 -> (x, y) " –

+0

Спасибо, я обновил его соответствующим образом и исправил форматирование. – Jonathan

Смежные вопросы