PostgreSQL JSONB - JSON 数组 vs JSON 对象性能
PostgreSQL JSONB - JSON Array vs JSON Object performance
每个对象(实例)对每个用户都有自己的隐私设置。这些设置是通过对象 table 行中的 privacy JSONB field
定义的。我很好奇哪种方式对性能更好?或者更好的方法?
解释:
- ID 为 2 的用户可以读写对象
- ID为8的用户只能读取该对象
- SQL 查询:获取 ID 为 2 的用户可以读取的记录(假设任务 table)
案例一——使用数组(注意:第一个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
。
每个对象(实例)对每个用户都有自己的隐私设置。这些设置是通过对象 table 行中的 privacy JSONB field
定义的。我很好奇哪种方式对性能更好?或者更好的方法?
解释:
- ID 为 2 的用户可以读写对象
- ID为8的用户只能读取该对象
- SQL 查询:获取 ID 为 2 的用户可以读取的记录(假设任务 table)
案例一——使用数组(注意:第一个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
。