【问题标题】:PostgreSQL JSONB - JSON Array vs JSON Object performancePostgreSQL JSONB - JSON 数组与 JSON 对象的性能
【发布时间】:2016-02-02 15:47:16
【问题描述】:

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

解释:

  • ID 为 2 的用户可以读取和写入对象
  • ID 为 8 的用户只能读取对象
  • SQL 查询:获取 ID 为 2 的用户可以读取的记录(假设任务表)

案例一 - 使用数组(注意:第一个键是用户 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)

欢迎提出任何建议。

【问题讨论】:

  • 你能举几个例子吗?你是如何使用这些数据的?我认为答案可能取决于此。
  • 我已经添加了 SQL 查询。

标签: postgresql jsonb


【解决方案1】:

据我所知,如果您只询问选择查询,您可以在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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多