Postgresの:AからBへの一意の参照
-
18-09-2019 - |
質問
私はペア(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が(TAG1、TAG2)UNIQUEない、タグ(TAG_ID)TO(TAG1、TAG2)から固有になりたい。
解決
このは、より多くのあなたが探しているもののようになります。
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」に関する指数は、私はあなたがあなたの元PRIMARY KEYの定義をどうしようとしていた何を考えている「question_id」に基づいて、検索速度を向上します。あなたが本当に(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)は、対(X、Y)に等しくありません。私はその一意性制約をキャッチするかどうかはわかりません。
所属していません StackOverflow