Frage

Ich möchte eine Bijektion zwischen dem Paar (tag1, tag2) und 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?
     );

Ich mag keinen Hinweis, wie:

(PHP, Perl) points to 1 and 2,
3 points to (C#, null) and (Python, Elinks)

Mit anderen Worten, ich möchte den Verweis aus (tag1, tag2) eindeutig sein TO-Tags (tag_id), nicht UNIQUE (tag1, tag2).

War es hilfreich?

Lösung

Dies könnte mehr wie das, was Sie suchen:

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)
);

Making ‚tag_id‘ der Primärschlüssel bedeutet, dass Sie nur einen Eintrag haben kann mit einem ‚tag_id‘ gegeben, und das Suchen basierend auf ‚tag_id‘ wird schnell sein.

Der Index auf ‚question_id‘ wird die Suchgeschwindigkeit basierend auf ‚question_id‘, verbessert das ist, was ich glaube, Sie versuchen, mit Ihrer ursprünglichen PRIMARY KEY-Definition zu tun. Wenn Sie wirklich das wollen (tag_id, question_id) Paar einzigartig sein, wie Sie es hatte, dann fügen Sie eine UNIQUE (tag_id, question_id) drin, aber ich würde sagen, dass Sie als Primärschlüssel verlassen tag_id sollte.

Die Einzigartigkeit constraint on (TAG1, tag2) verhindert, dass die umgekehrte Zuordnung von Dubletten aufweist.

Hier sind ein paar Beispiele dafür, was funktionieren kann:

Works:

1 -> (x, y)

2 -> (x, z)

schlägt fehl (tag_id ist ein Primärschlüssel, und deshalb ist einzigartig):

1 -> (x, y)

1 -> (y, x)

schlägt fehl (das Paar (tag1, tag2) ist nicht eindeutig):

1 -> (x, y)

2 -> (x, y)

jedoch das Paar (x, y) nicht gleich das Paar (y, x). Ich bin mir nicht sicher, wie dieser Einzigartigkeit Zwang zu fangen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top