1

ペア (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 を UNIQUE(tag1, tag2) ではなく FROM (tag1, tag2) TO tags(tag_id) で一意にしたいということです。

4

1 に答える 1

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」を持つエントリを 1 つしか持てず、「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) と等しくありません。その一意性制約をキャッチする方法がわかりません。

于 2009-08-17T18:12:33.640 に答える