J'ai une table représentant des films. Les champs sont les suivants :
id (PK), title, genre, runtime, released_in, tags, origin, downloads
.
Ma base de données ne peut pas être polluée par des lignes dupliquées, je souhaite donc appliquer l'unicité. Le problème est que différents films peuvent avoir le même titre, voire les mêmes champs sauf tags
et downloads
. Comment imposer l'unicité?
J'ai pensé à deux façons:
- faire tous les champs sauf
downloads
la clé primaire. Je me retiensdownloads
car c'est JSON et cela aura probablement un impact sur les performances. - conserver uniquement
id
comme clé primaire, mais ajouter une contrainte unique à toutes les autres colonnes (sauf, encore une foisdownloads
).
J'ai lu cette question qui est très similaire, mais je ne comprenais pas très bien quoi faire. Actuellement, ce tableau n'est lié à aucun autre tableau, mais pourrait l'être à l'avenir.
Pour le moment, j'ai un peu moins de 20 000 disques, mais je m'attends à ce que ce nombre augmente. Je ne sais pas si cela est quelque peu pertinent pour la question.
EDIT: J'ai modifié le schéma et voici comment je créerais la table:
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)
);
J'ai également ajouté la timestamp
colonne, mais ce n'est pas un problème car je n'y toucherai pas. Ce sera donc toujours automatique et unique.