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 tags
i downloads
. Jak egzekwować wyjątkowość?
Myślałem o dwóch sposobach:
- utwórz wszystkie pola oprócz
downloads
klucza podstawowego. Trzymam się zdownloads
daleka, ponieważ jest to JSON i prawdopodobnie wpłynie to na wydajność. - zachowaj tylko
id
jako 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ż timestamp
kolumnę, ale nie stanowi to problemu, ponieważ jej nie dotknę. Zawsze będzie więc automatyczny i niepowtarzalny.