Tengo una mesa que representa películas. Los campos son:
id (PK), title, genre, runtime, released_in, tags, origin, downloads
.
Mi base de datos no puede contaminarse con filas duplicadas, por lo que quiero imponer unicidad. El problema es que diferentes películas podrían tener el mismo título, o incluso los mismos campos, excepto tags
y downloads
. ¿Cómo hacer cumplir la singularidad?
Pensé en dos formas:
- hacer todos los campos excepto
downloads
la clave primaria. Me mantengodownloads
alejado ya que es JSON y probablemente afectará el rendimiento. - mantenga solo
id
como clave principal, pero agregue una restricción única con todas las otras columnas (excepto, nuevamente,downloads
).
Leí esta pregunta que es muy similar, pero no entendí bien qué debería hacer. Actualmente esta tabla no está relacionada con ninguna otra tabla, pero en el futuro podría estarlo.
Por el momento tengo un poco menos de 20,000 registros, pero espero que el número crezca. No sé si esto es algo relevante para el problema.
EDITAR: modifiqué el esquema y así es como crearía la tabla:
CREATE TABLE movies (
id serial PRIMARY KEY,
title text NOT NULL,
runtime smallint NOT NULL CHECK (runtime >= 0),
released_in smallint NOT NULL CHECK (released_in > 0),
genres text[] NOT NULL default ARRAY[]::text[],
tags text[] NOT NULL default ARRAY[]::text[],
origin text[] NOT NULL default ARRAY[]::text[],
downloads json NOT NULL,
inserted_at timestamp NOT NULL default current_timestamp,
CONSTRAINT must_be_unique UNIQUE(title,runtime,released_in,genres,tags,origin)
);
También agregué la timestamp
columna, pero eso no es un problema ya que no lo tocaré. Por lo tanto, siempre será automático y único.