es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

SQL: La forma correcta de crear pares únicos de claves foráneas.

Supongamos que tenemos esta lógica de “emparejamiento”, donde queremos almacenar los emparejamientos entre usuarios. Creé este esquema para la tabla y quiero asegurarme de que esta es la forma correcta de almacenar esa información.

CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY,
    name VARCHAR (255) NOT NULL UNIQUE
);

CREATE TABLE IF NOT EXISTS matches (
    id INTEGER PRIMARY KEY,
    a INTEGER NOT NULL CHECK (a < b) REFERENCES users (id),
    b INTEGER NOT NULL CHECK (a < b) REFERENCES users (id),
    frequency INTEGER NOT NULL DEFAULT 0
);

CREATE UNIQUE INDEX IF NOT EXISTS matches_ab_uidx ON matches (a, b);

Quiero asegurarme de que no haya duplicados de emparejamientos, por lo que si a=1 y b=2, no podemos tener a=2 y b=1, ya que son iguales. Además, no puede haber emparejamientos consigo mismos.

¿Es correcta esta verificación de duplicados CHECK (a < b) para estructurar este tipo de lógica?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, la restricción CHECK (a < b) es la forma correcta de asegurar que no haya duplicados de coincidencias y que una coincidencia consigo mismo no se almacene en la tabla. Esta restricción asegura que el id menor se almacene siempre en la columna a y el id mayor en la columna b, evitando el almacenamiento de coincidencias inversas. Además, el índice único matches_a_b_uidx asegura que no haya duplicados al imponer una restricción única en la combinación de las columnas a y b. En general, este diseño de esquema implementa de manera efectiva la lógica de emparejamiento deseada para almacenar coincidencias entre usuarios.

Comments are closed.