jsonドキュメントが堅牢な構造を持つ場合は、このデータを通常のテーブルに保存する方がよいでしょう。オブジェクトにはいくつかの必須キーを含む多くのキーが含まれていると仮定します。
次の関数は、json配列(第1引数)内の各オブジェクトに、すべての配列文字列が最上位キー(第2引数)として含まれているかどうかをチェックします。
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