2016-07-21 51 views
0

我有一個表visitors(id, email, first_seen, sessions, etc.)合併列和jsonb對象陣列成單個jsonb柱

和存儲定製,用戶提供的數據的另一個表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: '[email protected], sessions: 5) 

我想要結果的形式爲

(id: 1, data: {email: '[email protected]', sessions: 5, orders_made: 2, city: 'new york'}) 

使用Postgres 9.4完成這項工作的最佳方法是什麼?

回答

0

我會開始說跟蹤是一個壞主意。如果你沒有很多事情要跟蹤,只需要存儲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 
)); 
+0

嗨,爲什麼這種方式存儲跟蹤不好?我認爲這種方式通常會在關係上下文中實現 – Tarlen