Pregunta

Quiero una biyección entre el par (etiqueta 1, etiqueta 2) y 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?
     );

Quiero ninguna referencia tales como:

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

En otras palabras, quiero que la referencia sea única desde (etiqueta 1, etiqueta 2) a las etiquetas (tag_id), no es único (tag1, la etiqueta 2).

¿Fue útil?

Solución

Esto podría ser más parecido a lo que busca:

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

Hacer 'tag_id' la clave principal significa que sólo puede tener una entrada con un determinado 'tag_id', y que las búsquedas en base a 'tag_id' van a ser rápido.

El índice de 'question_id' mejorará la velocidad de búsqueda basada en 'question_id', que es lo que creo que estaba tratando de hacer con el original PRIMARIA Definición de teclas. Si realmente desea que el (tag_id, question_id) par a ser único, como lo ha tenido, a continuación, una solución única (tag_id, question_id) en allí, pero yo diría que debe dejar tag_id como la clave principal.

La restricción de unicidad sobre (etiqueta 1, etiqueta 2) impide que la correspondencia inversa de tener duplicados.

Aquí están algunos ejemplos de lo que puede funcionar:

Obras:

1 -> (x, y)

2 -> (x, z)

falla (tag_id es una clave principal, y por lo tanto es único):

1 -> (x, y)

1 -> (y, x)

falla (el par (etiqueta 1, etiqueta 2) no es única):

1 -> (x, y)

2 -> (x, y)

Sin embargo, el par (x, y) no es igual al par (y, x). No estoy seguro de cómo atrapar esa singularidad restricción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top