小编rub*_*bik的帖子

将所有列标记为主键是否合理?

我有一张代表电影的表。这些字段是:
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)

postgresql database-design primary-key unique-constraint

9
推荐指数
2
解决办法
575
查看次数

在 PostgreSQL 中压缩序列

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)

postgresql primary-key sequence gaps-and-islands

9
推荐指数
1
解决办法
2590
查看次数

MongoDB:用于匹配元素都包含在指定数组中的数组的运算符

$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字段包含所有指定值的文档,这不是我想要的。

我需要的可能吗?

mongodb operator

4
推荐指数
1
解决办法
6663
查看次数

实时性远大于“EXPLAIN ANALYZE”的执行时间(索引扫描)

我想根据 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)我也尝试了 …

postgresql performance query-performance

3
推荐指数
1
解决办法
7578
查看次数