我有一张桌子,如下表。
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哈希值,并将此新的哈希值字段组合为唯一索引的一部分。
如果能从专家那里得到一些帮助,我将不胜感激。
答案 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