【実務・中級編】 JSONB操作関数 – PostgreSQL

やあ、最近PostgreSQLのJSONBを触ってる?
「NoSQLを使えばいいんじゃないか?」なんて議論が聞こえてくることもあるけれど、PostgreSQLのJSONBは、ちゃんと使いこなせば「リレーショナルDBの堅牢さ」と「ドキュメントDBの柔軟性」のいいとこ取りができる最強の武器になるんだ。

今日は、現場で「これを知っているだけで実装の速さが段違いになる」というJSONB操作関数たちを、僕の実務的な視点からサクッと解説していくね。

—

1. JSONBを「組み立てる」:`jsonb_build_object` と `jsonb_object_agg`

まず、アプリ側にデータを返すとき、SQLでゴリゴリ整形したい場面って多いよね。

`jsonb_build_object`

これは単純明快。「このカラムとこのカラムをまとめてJSONにしたい」という時に使う。

SELECT jsonb_build_object(
‘user_id’, id,
‘profile’, jsonb_build_object(‘name’, name, ‘email’, email)
) FROM users;

ネスト構造も直感的に書けるのがいいところ。複雑な結合をする前に、ビューでこの形を作っておくとアプリ側のコードがめちゃくちゃ綺麗になるよ。

`jsonb_object_agg`

これは集計関数。グループ化した結果をJSONオブジェクトにぶち込みたい時に使うんだけど、これを知っていると集計クエリが劇的に進化する。

SELECT user_id, jsonb_object_agg(key_name, value)
FROM user_preferences
GROUP BY user_id;

これを使えば、わざわざアプリ側でループを回してマッピングしなくても、DBから取り出した時点で完成されたJSON構造が手に入る。パフォーマンス的にも、アプリ側のコード量削減にもかなり貢献するはずだ。

—

2. JSONBを「分解する」:`jsonb_array_elements`

逆に、JSONの配列の中身をテーブルのように展開したい時はこれ。

SELECT user_id, item->>’name’ as item_name
FROM orders,
jsonb_array_elements(items) as item;

`FROM`句に直接関数を置くのがコツだね。これを使えば、JSONの中に埋め込まれた複雑な配列データでも、通常のテーブルと同じ感覚でWHERE句をかけたり集計したりできる。正規化しきれない柔軟なデータを扱う時の必殺技だよ。

—

3. JSONBを「いじる」:`jsonb_set` と `jsonb_strip_nulls`

ここからはデータ更新の話。

`jsonb_set`

JSONの一部だけを書き換えたい時に使うんだけど、注意点がある。第4引数の `true` だ。これがないと、対象のキーが存在しない場合に何も更新されない。基本は `true` を入れて「なければ作る」という挙動にするのが現場の定石だね。

UPDATE products
SET attributes = jsonb_set(attributes, ‘{color}’, ‘”red”‘, true)
WHERE id = 123;

`jsonb_strip_nulls`

これ、地味だけどめちゃくちゃ便利。JSONの中に値が `null` のキーが散らかってると、アプリ側で判定ロジックを書くのが面倒になるでしょ? これを通せば不要なキーを一掃できる。クリーンなAPIを作るための仕上げとして最強だ。

SELECT jsonb_strip_nulls(attributes) FROM products;

—

実践的なアドバイス:インデックスを忘れずに

最後に一つだけ、エンジニアとして忠告しておきたいことがある。
JSONBは便利だけど、闇雲に使うとクエリの速度が死ぬ。特定のキーで検索をかけるなら、必ず「GINインデックス」を検討すること。

— 特定のキーに対するインデックス
CREATE INDEX idx_products_attr_color ON products USING GIN ((attributes->’color’));

JSONBをただの「ゴミ箱」にしてしまうのは素人。「検索性を担保した構造化ストレージ」として扱うのが、PostgreSQLエンジニアの作法だよ。

—

どうかな? これらを使いこなせば、JSONBはただの文字列保存領域じゃなくて、強力なデータモデリングのツールに変わるはずだ。

また何か具体的なユースケースで詰まったら聞いてくれ。現場からは以上!

コメント

タイトルとURLをコピーしました