Mam stolik przedstawiający filmy. Pola są:
id (PK), title, genre, runtime, released_in, tags, origin, downloads.
Moja baza danych nie może zostać zanieczyszczona przez zduplikowane wiersze, dlatego chcę wymusić unikalność. Problem polega na tym, że różne filmy mogą mieć ten sam tytuł lub nawet te same pola, z wyjątkiem tagsi downloads. Jak egzekwować wyjątkowość?
Myślałem o dwóch sposobach:
- utwórz wszystkie pola oprócz
downloadsklucza podstawowego. Trzymam się zdownloadsdaleka, ponieważ jest to JSON i prawdopodobnie wpłynie to na wydajność. - zachowaj tylko
idjako klucz podstawowy, ale dodaj unikalne ograniczenie do wszystkich pozostałych kolumn (oprócz, znowu,downloads).
Przeczytałem to pytanie, które jest bardzo podobne, ale nie bardzo rozumiałem, co powinienem zrobić. Obecnie ta tabela nie jest powiązana z żadnymi innymi tabelami, ale w przyszłości może być.
W tej chwili mam nieco mniej niż 20 000 rekordów, ale spodziewam się, że liczba ta wzrośnie. Nie wiem, czy to ma jakiś związek z tym problemem.
EDYCJA: Zmodyfikowałem schemat i oto jak utworzę tabelę:
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)
);
Dodałem również timestampkolumnę, ale nie stanowi to problemu, ponieważ jej nie dotknę. Zawsze będzie więc automatyczny i niepowtarzalny.