2017-07-21 62 views
0

我有一個表:如何使字段默認值分配給jsonb字段?

CREATE TABLE inbound (-- broadcasts received from RTs 
    id SERIAL primary key, 
    ts TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), 
    rt VARCHAR(10) NOT NULL, 
    region region NOT NULL, 
    channel channel NOT NULL, 
    payload jsonb, 
    messageid, -- denormalised 
    messagetype -- denormalised 
); 

有效載荷可能是:{"a":{"messageid":"ABC123"}}{"b":{"messageid":"ABC123"}}

我想要messageid字段總是包含有效載荷的對象messageid字段的值,不管它是否是一個ab

我想要messagetype要的ab一個enum值,反映了有效載荷的內容。

是否正常化JSON數據在Postgres中是正確的做法,還是我會更好地設置某種形式的數據視圖?

+1

爲什麼你需要'有效載荷'字段?它可以在查詢時建立。 –

+0

道歉,我沒有解釋清楚。有效負載通常包含一個* complex * JSON對象,其中只有一個頂級屬性,並且包含一個「messageid」。我想從JSON中挑選幾個有用的數據,以使查詢更簡單,更快捷。 – fadedbee

+1

如果數據結構化,請不要保留有效負載。使用正確的數據類型來創建所有字段。如果數據不是結構化的,我的意思是,如果你事先不知道它的結構,JSON只在數據庫中有用。 –

回答

1

請勿保留有效負載。改爲保存字段。假設這個模式:

create type messagetype as enum('a','b'); 
create table inbound (
    messageid text, 
    messagetype messagetype 
) 

當接收到有效載荷:

在請求時
with p (payload) as (values 
    ('{"a":{"messageid":"ABC123"}}'::jsonb), 
    ('{"b":{"messageid":"ABC123"}}') 
) 
insert into inbound (messagetype, messageid) 
select key::messagetype, value ->> 'messageid' 
from p, jsonb_each(payload) 

和:

select jsonb_build_object(messagetype, jsonb_build_object('messageid', messageid)) 
from inbound 
; 
     jsonb_build_object  
-------------------------------- 
{"a": {"messageid": "ABC123"}} 
{"b": {"messageid": "ABC123"}} 
1

我rarly與DB jsons工作,所以它不精片代碼,但它的作品。

select myjsonb#>concat('','{',jsonb_object_keys(myjsonb),'}','')::text[] 
    from (values ('{"a":{"messageid":"ABC123"}}'::jsonb), ('{"b": 
     {"messageid":"ABC123"}}'::jsonb)) a (myjsonb). 

如果所有你jsons因爲這些從例如作爲簡單(只有一對鍵值,並且只有2鍵可能的),那麼請不要將它們存儲爲jsons但如2個字段KEY_A和key_b或鍵和價值列。

+0

對不起,這是相反的,如果我正在尋找。我已經*有*有效載荷,但想要將單個頂級對象的'messageid'屬性和單個頂級對象的屬性名稱存儲爲「普通」字段,以使查詢變得更簡單和更快。 – fadedbee

相關問題