我有一张代表电影的表。这些字段是:
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 …Run Code Online (Sandbox Code Playgroud) 我id serial PRIMARY KEY在 PostgreSQL 表中有一个列。id因为我删除了相应的行,所以缺少许多s。
现在我想通过重新启动序列并以保留id原始id顺序的方式重新分配s来“压缩”表。是否可以?
例子:
id | data
----+-------
1 | hello
2 | world
4 | foo
5 | bar
Run Code Online (Sandbox Code Playgroud)
id | data
----+-------
1 | hello
2 | world
3 | foo
4 | bar
Run Code Online (Sandbox Code Playgroud)
我尝试了 StackOverflow answer 中建议的内容,但没有奏效:
# alter sequence t_id_seq restart;
ALTER SEQUENCE
# update t set id=default;
ERROR: duplicate key value violates unique constraint t_pkey
DETAIL: Key …Run Code Online (Sandbox Code Playgroud) 在$all操作者选择的文件,其中一个字段的值是包含所有指定元素的数组。
在我的情况下,我需要相反的内容:选择文档的运算符,其中字段的值是一个数组,其元素都包含在指定的数组中。
例如,考虑以下集合:
{"name": 1, "vals": ["A", "B"]}
{"name": 2, "vals": ["D", "C"]}
{"name": 3, "vals": ["A", "D"]}
Run Code Online (Sandbox Code Playgroud)
我想选择其vals字段包含值的所有文档["A", "B", "D"];也就是说,文档 1 和 3(不是 2,因为指定的数组中不包含“C”)。
我不能使用{vals: {$all: ["A", "B", "D"]}},也不能{vals: ["A", "B", "D"]}因为这两个操作选择其vals字段包含所有指定值的文档,这不是我想要的。
我需要的可能吗?
我想根据 ID 获取最多 100 行。id 是表的主键。
我编写的查询如下所示:
select * from table where id = any ($1);
Run Code Online (Sandbox Code Playgroud)
其中$1被插值为 ids 数组。
使用时EXPLAIN ANALYZE我得到以下计划(解释链接):
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.43..44.98 rows=17 width=553) (actual time=100.048..834.209 rows=17 loops=1)
-> Index Scan using instagram_id_index_1000 on profiles_1000 (cost=0.43..44.98 rows=17 width=553) (actual time=100.046..834.163 rows=17 loops=1)
Index Cond: (id = ANY ('{34491540,28977916,33241270,33609141,31043380,29364420,30247037,33311491,36267571,32886281,32366574,32569254,33038689,31089076,29416100,30455309,31570597}'::integer[]))
Planning time: 424.512 ms
Execution time: 834.280 ms
(5 rows)
Run Code Online (Sandbox Code Playgroud)
当我实际执行它时(使用\timing),我得到的结果在 2-5 秒范围内!我真的无法接受如此糟糕的表现。EXPLAIN ANALYZE首先提供的执行时间就已经很长了。
一些上下文:
1)数据库是本地的,所以没有网络延迟
2)我查询的表是物化视图
3)我也尝试了 …