やあ、最近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はただの文字列保存領域じゃなくて、強力なデータモデリングのツールに変わるはずだ。
また何か具体的なユースケースで詰まったら聞いてくれ。現場からは以上!
コメント