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?
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 columnaa
y el id mayor en la columnab
, evitando el almacenamiento de coincidencias inversas. Además, el índice únicomatches_a_b_uidx
asegura que no haya duplicados al imponer una restricción única en la combinación de las columnasa
yb
. En general, este diseño de esquema implementa de manera efectiva la lógica de emparejamiento deseada para almacenar coincidencias entre usuarios.