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

3
每个对象(实例)都有其自己的每个用户的隐私设置。这些设置通过对象表行中的privacy JSONB字段来定义。我想知道哪种方式更好,特别是在性能方面?或者是否有更好的方法?
说明:
  • ID为2的用户可以读取和写入对象
  • ID为8的用户只能读取对象
  • SQL查询:获取ID为2的用户可以读取的记录(假设为tasks表)
  • 情况一 - 使用数组(注意:第一个键是用户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)
    

    欢迎提出任何建议。


    你能展示一些使用这些数据的例子吗?我认为答案可能取决于此。 - erthalion
    我已经添加了SQL查询。 - Nikos
    1个回答

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


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接