Ho un tavolo che rappresenta i film. I campi sono:
id (PK), title, genre, runtime, released_in, tags, origin, downloads
.
Il mio database non può essere inquinato da righe duplicate, quindi voglio rafforzare l'univocità. Il problema è che film diversi potrebbero avere lo stesso titolo o persino gli stessi campi tranne tags
e downloads
. Come applicare l'unicità?
Ho pensato a due modi:
- crea tutti i campi tranne
downloads
la chiave primaria. Sto tenendodownloads
fuori dal momento che è JSON e probabilmente avrà un impatto sulle prestazioni. - mantieni solo
id
come chiave primaria, ma aggiungi un vincolo univoco con tutte le altre colonne (tranne, di nuovo,downloads
).
Ho letto questa domanda che è molto simile, ma non ho capito bene cosa dovrei fare. Attualmente questa tabella non è correlata ad altre tabelle, ma in futuro potrebbe esserlo.
Al momento ho poco meno di 20.000 dischi, ma mi aspetto che il numero cresca. Non so se questo sia in qualche modo rilevante per il problema.
EDIT: ho modificato lo schema ed ecco come avrei creato la tabella:
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)
);
Ho anche aggiunto la timestamp
colonna, ma questo non è un problema in quanto non la toccherò. Quindi sarà sempre automatico e unico.