Postgres:从A到B的唯一引用

时间:2009-08-17 17:23:22

标签: postgresql reference bijection

我想在对(tag1,tag2)和tag_id之间进行双射。

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)

换句话说,我希望REFERENCE是唯一的FROM(tag1,tag2)TO标签(tag_id),而不是UNIQUE(tag1,tag2)。

1 个答案:

答案 0 :(得分: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)

然而,对(x,y)不等于对(y,x)。我不确定如何捕捉这种唯一性约束。