У мене є таблиця із фільмами. Поля:
id (PK), title, genre, runtime, released_in, tags, origin, downloads
.
Мою базу даних не можна забруднювати дублюючими рядками, тому я хочу надати унікальність. Проблема полягає в тому, що різні фільми можуть мати однакову назву, або навіть однакові поля, за винятком tags
і downloads
. Як нав'язати унікальність?
Я думав про два способи:
- зробити всі поля, крім
downloads
первинного ключа. Я тримаюсь позадуdownloads
, оскільки це JSON, і це, мабуть, вплине на продуктивність. - зберігайте лише
id
як основний ключ, але додайте унікальне обмеження для всіх інших стовпців (крім, знову ж такиdownloads
).
Я прочитав це питання, яке дуже схоже, але я не зовсім зрозумів, що мені робити. В даний час ця таблиця не пов'язана з будь-якими іншими таблицями, але в майбутньому це може бути.
На даний момент у мене трохи менше 20 000 записів, але я очікую, що кількість зросте. Я не знаю, чи це дещо стосується цього питання.
EDIT: Я змінив схему, і ось як я створив таблицю:
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
стовпчик, але це не проблема, оскільки я його не торкаюся. Тож він завжди буде автоматичним та унікальним.