当涉及许多键或元素时,JSON对象比数组更适合测试包含或存在,因为与数组不同,它们在内部针对搜索进行了优化,并且不需要线性搜索。
我没有在postgresql中使用json或jsonb。我计划使用int[]
来实现一个集合,方法是使用ANY检查值是否在列表中。现在我正在考虑使用jsonb。是否可以在数组中添加一个值,或者这可能是一个昂贵的操作?如何添加元素? (select '["a", "b"]'::jsonb || '["c", "d"]'::jsonb)
似乎是一个错误)可疑的大小将在5到10K之间(4字节)。
答案 0 :(得分:2)
文档暗示您可以将21412,32356,754432
之类的集存储为以下jsonb对象:
{"21412": null, "32356": null, "754432": null}
请注意,我们已将整数转换为必须为字符串的对象中的键。因此,如果将上述对象存储在表s
中类型为jsonb
的{{1}}列中,则可以搜索包含该值的所有行,如下所示: / p>
t
可以按如下方式添加元素:
SELECT * FROM t WHERE s ? 3523::text;
但请注意,上述内容可能是糟糕的主意。这不是您应该如何在关系数据库中存储集合。例如,请考虑这一点:每次向集合添加元素(无论是SELECT jsonb_set(s, array[35232::text], 'null'::jsonb)
FROM t
WHERE .......;
,jsonb
还是其他)时,都必须重写整行。这将花费integer[]
时间在插入所需的时间之上。另一个问题是,涉及来自set列的值的连接将更加困难。因此,实现集合的正确方法是为每个集合创建一个额外的表并为每个集合元素添加一行。