2009-08-17 7 views
1

Je veux une bijection entre la paire (tag1, tag2) et tag_id.Postgres: Référence unique de A à B

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

Je ne veux pas référence tel que:

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

En d'autres termes, je veux que la référence soit unique à partir (balise1, tag2) TAGS (tag_id), pas UNIQUE (balise1, tag2).

Répondre

3

Cela pourrait être plus comme ce que vous cherchez:

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

Faire 'tag_id la clé primaire signifie que vous ne pouvez avoir une entrée avec une donnée « tag_id », et que les recherches basées sur' tag_id 'sera rapide. L'index sur 'question_id' améliorera la vitesse de recherche en fonction de 'question_id', ce que je pense que vous essayiez de faire avec votre définition PRIMARY KEY originale. Si vous voulez vraiment que la paire (tag_id, question_id) soit unique, comme vous l'aviez, ajoutez un UNIQUE (tag_id, question_id), mais je dirais que vous devriez laisser tag_id comme clé primaire.

La contrainte d'unicité sur (tag1, tag2) empêche le mappage inverse d'avoir des doublons.

Voici quelques exemples de ce qui peut fonctionner:

Travaux:

1 -> (x, y)

2 -> (x, z)

ne réussit pas (tag_id est une clé primaire, et est donc unique):

1 -> (x, y)

1 - > (Y, x)

échoue (la paire (tag1, tag2) est pas unique):

1 -> (x, y)

2 -> (x, y)

Cependant, la paire (x, y) n'est pas égale à la paire (y, x). Je ne suis pas sûr de savoir comment attraper cette contrainte d'unicité.

+0

Typo? "Works: 1 -> (x, y) 2 -> (x, y)", "échoue (la paire (tag1, tag2) n'est pas unique): 1 -> (x, y) 2 -> (x, y) " –

+0

Merci, je l'ai mis à jour de manière appropriée, et a corrigé le formatage. – Jonathan