Eu tenho uma mesa representando filmes. Os campos são:
id (PK), title, genre, runtime, released_in, tags, origin, downloads
.
Meu banco de dados não pode ser poluído por linhas duplicadas, portanto, desejo impor exclusividade. O problema é que filmes diferentes podem ter o mesmo título ou até os mesmos campos, exceto tags
e downloads
. Como impor exclusividade?
Pensei em duas maneiras:
- faça todos os campos, exceto
downloads
a chave primária. Eu estou me mantendo dedownloads
fora, pois é JSON e provavelmente afetará o desempenho. - mantenha apenas
id
como chave primária, mas adicione uma restrição exclusiva a todas as outras colunas (exceto, novamentedownloads
).
Li essa pergunta que é muito parecida, mas não entendi bem o que devo fazer. Atualmente, esta tabela não está relacionada a nenhuma outra tabela, mas no futuro poderia ser.
No momento, tenho pouco menos de 20.000 registros, mas espero que o número cresça. Não sei se isso é um pouco relevante para o problema.
Edição: Eu modifiquei o esquema e aqui está como eu criaria a tabela:
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)
);
Também adicionei a timestamp
coluna, mas isso não é um problema, pois não vou tocá-la. Por isso, será sempre automático e único.