映画を表すテーブルがあります。フィールドは次のとおり
id (PK), title, genre, runtime, released_in, tags, origin, downloads
です。
重複する行によってデータベースを汚染することはできないため、一意性を強制したいと思います。問題は、異なる映画が同じタイトルを持つ可能性があることです、または同じフィールドを除くtags
とdownloads
。一意性を強制する方法は?
私は2つの方法を考えました:
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
列も追加しましたが、触れないので問題ありません。そのため、常に自動で一意になります。