У меня есть таблица с фильмами. Поля:
id (PK), title, genre, runtime, released_in, tags, origin, downloads
.
Моя база данных не может быть загрязнена дублированными строками, поэтому я хочу обеспечить уникальность. Проблема в том, что разные фильмы могут иметь одинаковое название или даже одинаковые поля, кроме tags
и downloads
. Как обеспечить уникальность?
Я думал о двух способах:
- сделать все поля кроме
downloads
первичного ключа. Я избегаюdownloads
, потому что это JSON, и это, вероятно, повлияет на производительность. - оставьте только
id
первичный ключ, но добавьте уникальное ограничение ко всем остальным столбцам (кроме, опять жеdownloads
).
Я прочитал этот вопрос, который очень похож, но я не совсем понял, что мне делать. В настоящее время эта таблица не связана ни с какими другими таблицами, но в будущем может быть.
На данный момент у меня чуть меньше 20 000 записей, но я ожидаю, что их число будет расти. Я не знаю, имеет ли это какое-то отношение к проблеме.
РЕДАКТИРОВАТЬ: я изменил схему, и вот как я хотел бы создать таблицу:
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)
);
Я также добавил timestamp
колонку, но это не проблема, так как я не буду ее трогать. Так что это всегда будет автоматически и уникально.