【问题标题】:Merging columns and jsonb object array into a single jsonb column将列和 jsonb 对象数组合并到单个 jsonb 列中
【发布时间】:2016-11-25 03:58:18
【问题描述】:

我有一张桌子visitors(id, email, first_seen, sessions, etc.)

还有另一个表trackings(id, visitor_id, field, value),用于存储用户提供的自定义数据。

我想查询这些并将访问者数据列和跟踪合并到一个名为 data 的列中

例如,假设我有两个跟踪

(id: 3, visitor_id: 1, field: "orders_made", value: 2)
(id: 4, visitor_id: 1, field: "city", value: 'new york')

和一个访客

(id: 1, email: 'hello@gmail.com, sessions: 5)

我希望结果的形式是

(id: 1, data: {email: 'hello@gmail.com', sessions: 5, orders_made: 2, city: 'new york'})

使用 Postgres 9.4 完成此任务的最佳方法是什么?

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    我首先要说跟踪是个坏主意。如果您没有太多要跟踪的内容,则只需存储 json 即可;这就是它的目的。如果您有很多事情要跟踪,那么随着时间的推移,您会对跟踪的性能变得非常不满意。

    首先你需要一个来自追踪的 json 对象:

    -- WARNING: Behavior of this with duplicate field names is undefined!
    SELECT json_object(array_agg(field), array_agg(value)) FROM trackings WHERE ...
    

    为访问者获取 json 相对容易:

    SELECT row_to_json(email, sessions) FROM visitors WHERE ...;
    

    我建议你不要把所有这些都挤在一起。如果您有一个名为电子邮件的字段会发生什么?而是:

    SELECT row_to_json((SELECT 
      (
    SELECT row_to_json(email, sessions) FROM visitors WHERE ...
      ) AS visitor
      , (
    SELECT json_object(array_agg(field), array_agg(value)) FROM trackings WHERE ...
      ) AS trackings
    ));
    

    【讨论】:

    • 嗨,为什么这种存储跟踪的方式不好?我是这样认为的,您通常如何在关系上下文中完成此操作
    猜你喜欢
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    相关资源
    最近更新 更多