如果json文檔具有剛性結構,最好將這些數據保存在常規表格中。我認爲這些對象包含許多鍵,包括一些必需的鍵。
以下函數檢查json數組(第一個參數)中的每個對象是否包含所有數組字符串作爲頂級密鑰(第二個參數)。
create or replace function jsonb_has_keys(jsonb, text[])
returns boolean language sql as $$
select bool_and(value ?& $2)
from jsonb_array_elements($1)
$$;
使用功能的檢查約束,例如:
create table test(
data jsonb check (jsonb_has_keys(data->'contacts', array['name', 'phone']))
);
insert into test values
('{
"contacts": [
{ "name": "a", "phone": "123" },
{ "name": "b", "tel": "456" }
]
}'::jsonb);
ERROR: new row for relation "test" violates check constraint "test_data_check"
DETAIL: Failing row contains ({"contacts": [{"name": "a", "phone": "123"}, {"tel": "456", "nam...).
如果你有這樣一個定義的結構,那你爲什麼不規範的數據模型? –
@a_horse_with_no_name這只是一個例子。我用例中的文檔不是嚴格的結構。規範化是可能的,但它需要2-3個與它相關的實體的中間表(我當前的數據庫使用這種形式,但我認爲查詢當前形式需要多次連接,所以json可能更適合)。 – shawon191