PostgreSQL JSONB - JSON 数组 vs JSON 对象性能

PostgreSQL JSONB - JSON Array vs JSON Object performance

每个对象(实例)对每个用户都有自己的隐私设置。这些设置是通过对象 table 行中的 privacy JSONB field 定义的。我很好奇哪种方式对性能更好?或者更好的方法?

解释:

案例一——使用数组(注意:第一个key是User ID)

privacy: {
  "2": ["read","write"],
  "8": ["read"]
}
SELECT * FROM "tasks" WHERE (privacy -> '2' ? 'read')

案例二 - 使用对象(在术语上不确定,对我来说它更像是散列)

privacy: {
  "2": {"read":true, "write":true},
  "8": {"read":true, "write":false}
}
SELECT * FROM "tasks" WHERE (privacy -> '2' -> 'read' = true)

欢迎提出任何建议。

据我所知,如果您只询问 select 查询,您可以在 privacy 列上创建一个 gin 索引(参见 8.14.4. jsonb Indexing) ,所以基本上以下查询在性能方面应该是相同的:

-- create index
CREATE INDEX privacy_idx ON tasks USING gin (privacy);

SELECT * FROM tasks WHERE privacy -> '2' ? 'read'
SELECT * FROM tasks WHERE privacy @> {"read": true}

可能在大小方面只有一个区别,因为内部 jsonb 数组只包含每个元素的 WJB_ELEM 和 jsonb 对象 - 每个元素的 WJB_KEY + WJB_VALUE