我有一张代表电影的桌子。字段是:
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
专栏,但这不是问题,因为我不会碰它。因此,它将始终是自动且独特的。