質問

私はペア(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)に等しくありません。私はその一意性制約をキャッチするかどうかはわかりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top