Postgres JSONB唯一约束

时间:2019-08-08 14:09:03

标签: postgresql database-performance jsonb unique-constraint postgresql-9.5

我有一张桌子,如下表。

create table person {
  firstname varchar,
  lastname varchar,
  person_info jsonb,
  ..
}

我对名字+姓氏已经有唯一的约束。我最近发现person_info jsonb中总是存在一些不同之处。我想通过person_info jsonb进行唯一标识。

我应该将person_info作为唯一约束的一部分来添加firstname + lastname + person_info吗?这样的实施会对性能产生影响吗?我听说当数据数量增加时,JSONB不利于索引。

我正在考虑在不同的字段中使用存储person_info哈希值,并将此新的哈希值字段组合为唯一索引的一部分。

如果能从专家那里得到一些帮助,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

这似乎是一个错误的想法。

主键应该是不变的,并且唯一地标识一个表行。

名字不好,因为

  • 不同的人可以使用相同的名字

  • 名称可以更改

这可能就是为什么您倾向于添加其他信息以真正标识每一行的原因。

除非您具有唯一地标识每个人的某些不可变属性(例如,社会保障nubmer),否则应为该表生成一个人工主键

ALTER TABLE person
   ADD id bigint
      GENERATED ALWAYS AS IDENTITY
      PRIMARY KEY;

可以为jsonb编制索引,但是由于索引条目的大小受到限制,因此您会遇到长值问题,并且如果超出限制,则会出现错误。

我建议您可能要索引的任何属性不是存储在jsonb中,而是存储在常规表列中。

答案 1 :(得分:0)

JSONB索引恕我直言是指能够对二进制JSON而不是整个块中的字段进行索引的功能。另请注意,键顺序未保留!因此,如果您可以使用完全相同的数据但顺序不同的两个json获得两个不同的哈希值。相反,如果您可以找到哪些json字段具有唯一性,则可以直接将它们用于索引。

也可以看看this page