我想在对(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)。
答案 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)。我不确定如何捕捉这种唯一性约束。