我正在设计一个 postgres 数据库,其中有一个表,该表有一个 jsonb 类型的列。我希望此列是唯一的。表中不需要有两个具有完全相同 json 配置的对象。总的来说,对于未保存在数据库中的每个重复项,这将为我节省大约 5 分钟的计算时间。我知道在字典方面存在 json 唯一性的风险(无法保证键的顺序),但我认为一个好的 json 编码器可以缓解这个问题。
我担心的是数据库性能。我想确保我们尽一切可能确保插入不会因为 jsonb 上的这种唯一性约束而变得非常慢。与 varchar 或 int 上的唯一性相比,jsonb 上的唯一性约束有多糟糕?我们说的是毫秒、秒还是分钟?
我研究过哈希索引,它听起来确实是我实现最佳性能所需的全部功能。但是。只有 B 树类型的索引才是唯一,这很奇怪。为什么?
我将忽略“为什么”的问题。查看 pgsql-hackers 档案;它都是开源的。
您需要一个 B 树索引来实现唯一约束。
将索引直接放在 JSON 列上不是一个选择,因为 JSON 值很容易超过 B 树索引条目允许的最大值。
您可以在 JSON 列的哈希上创建唯一索引。假设数据类型为
jsonb
(您不必担心属性的顺序),则可能是总是存在着少量的误报哈希冲突的风险......