2009-08-17 36 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) 

換句話說,我想提及從(TAG1,TAG2)特有的標籤(TAG_ID),而不是UNIQUE(標籤1,標籤2 )。

回答

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 - >(X,Y)

2 - >(X,Z)

失敗( TAG_ID是主鍵,因此是唯一的):

1 - >(X,Y)

1 - >(Y,X)

失敗(對(TAG1,TAG2)不是唯一的):

1 - >(X,Y)

2 - >(X,Y)

但是,pair(x,y)不等於pair(y,x)。我不知道如何捕捉這個唯一性約束。

+0

錯字? 「Works:1->(x,y)2 - >(x,y)」,「失敗(對(tag1,tag2)不是唯一的):1 - >(x,y)2 - > y)「 – 2009-08-17 18:36:40

+0

謝謝,我對它進行了適當更新,並修復了格式。 – Jonathan 2009-08-18 13:34:08

相關問題