PostgreSQLのJSONBとは?特徴と使いどころを初心者向けに徹底解説!
生徒
「先生、データベースって普通はエクセルのように縦と横の表で管理しますよね?でも最近『JSONB』という言葉を聞きました。これは一体何ですか?」
先生
「JSONBは、一言で言うと『一つの枠の中に、メモ帳のように自由な形式でデータを詰め込める魔法のポケット』のような機能です。普通の表形式では収まりきらない、複雑な情報を扱うのが得意なんですよ。」
生徒
「魔法のポケット!普通の表と何が違うんでしょうか。パソコンの操作に自信がない私でも使いこなせますか?」
先生
「もちろんです。例えば、人によって持っている趣味の数が違ったり、スマートフォンの機種によって設定項目がバラバラだったりすることってありますよね。JSONBを使えば、そうしたバラバラなデータもスッキリと保存できるんです。一緒に見ていきましょう。」
1. PostgreSQLのJSONBとは何か?
データベースの世界で有名な「PostgreSQL(ポストグレスキューエル)」には、**JSONB(ジェイソン・ビー)**という非常に強力な機能があります。 まず「JSON(ジェイソン)」とは、コンピュータが読み書きしやすいデータの書き方のルールのことです。そして「B」は「Binary(バイナリ)」の略で、コンピュータがより高速に処理できるように、データを特殊な形式にギュッと圧縮して保存することを意味します。
通常のデータベース(リレーショナルデータベース)では、あらかじめ「名前」「年齢」「住所」といった項目(列)をカッチリと決めておく必要があります。しかし、現実の世界では「人によって持っているデータが違う」という場面がよくあります。 例えば、あるお客さんは「好きな食べ物」の情報を持っているけれど、別のお客さんは「ペットの名前」の情報を持っている、といった具合です。
JSONBを使えば、こうした**「項目がバラバラなデータ」を一箇所にまとめて保存**でき、さらに後から高速に検索することができるようになります。
2. JSONBの特徴とメリット
JSONBがなぜこれほどまでに注目されているのか、その主な特徴を3つに分けて解説します。
**① 柔軟性が非常に高い**
通常の表(テーブル)では、新しい項目を追加したいときに「表の形を作り直す」という大変な作業が必要です。しかしJSONBなら、新しい項目が増えてもそのまま保存できます。まるで、中身に合わせて形が変わる柔軟な収納ボックスのようです。
**② 検索スピードが速い**
PostgreSQLには「JSON」という似た形式もありますが、JSONBはデータを保存する際に中身を解析して効率よく整理します。そのため、大量のデータの中から「趣味がキャンプの人だけを探す」といった検索を、一瞬で行うことができるのです。これを「インデックスを貼る」と言ったりします。
**③ 重複をなくして整理してくれる**
JSONBは、同じ名前の項目が複数あった場合、最後のものを優先して一つにまとめてくれます。また、余分な空白なども取り除いてくれるので、データの管理がとても綺麗になります。
3. JSONBの使いどころ:どんな時に使う?
「何でも自由に保存できるなら、全部JSONBでいいじゃないか」と思うかもしれませんが、実は使いどころが肝心です。
**活用例1:ネットショップの商品スペック**
テレビなら「画面サイズ」「解像度」、冷蔵庫なら「容量」「ドア数」、服なら「サイズ」「素材」など、商品によって必要な情報は全く異なります。これらを一つの表で管理するのは大変ですが、JSONBなら商品ごとに異なるスペックを自由に入れられます。
**活用例2:ユーザーの設定情報**
アプリの「通知をオンにするか」「背景は何色にするか」といった設定は、人によってこだわりが違います。また、将来的に新しい設定項目が増えることも多いです。こうした「将来変わるかもしれない設定」を保存するのにJSONBは最適です。
4. 実際にJSONBを使ってみよう!
それでは、具体的な例を見てみましょう。今回は「顧客名簿」の中に、人によって内容が異なる「詳細プロフィール」をJSONBで保存してみます。
まずは、データを入れる前の「customers(顧客)」テーブルの状態です。
id | name | info
---+----------+------------------------------------------------------------
1 | 山田太郎 | {"city": "東京", "hobby": "登山"}
2 | 佐藤花子 | {"city": "大阪", "pet": "猫", "age": 25}
3 | 鈴木一郎 | {"city": "北海道", "hobby": "写真", "camera": "一眼レフ"}
上記の「info」という項目がJSONB形式です。人によって「hobby(趣味)」があったり「pet(ペット)」があったりと、バラバラなのがわかりますね。 では、ここから「趣味が登山の人の名前」を取り出すSQLを書いてみます。
-- JSONBの中身を検索する魔法の記号「->>」を使います
SELECT name
FROM customers
WHERE info ->> 'hobby' = '登山';
**解説:**
`info ->> 'hobby'` という部分は、「infoという箱の中にある『hobby』という文字を取り出してください」という意味です。
実行結果は以下のようになります。
name
----------
山田太郎
5. データの追加と更新
次に、新しいお客さんを追加してみましょう。今度は「好きな食べ物」という新しい情報を含めてみますが、表の形を変える必要はありません。
INSERT INTO customers (id, name, info)
VALUES (4, '田中次郎', '{"city": "福岡", "food": "ラーメン", "hobby": "釣り"}');
実行後のテーブルは、以下のようになります。
id | name | info
---+----------+------------------------------------------------------------
1 | 山田太郎 | {"city": "東京", "hobby": "登山"}
2 | 佐藤花子 | {"city": "大阪", "pet": "猫", "age": 25}
3 | 鈴木一郎 | {"city": "北海道", "hobby": "写真", "camera": "一眼レフ"}
4 | 田中次郎 | {"city": "福岡", "food": "ラーメン", "hobby": "釣り"}
田中さんのデータだけ「food」という項目がありますが、エラーにならずに保存できています。これがJSONBの柔軟さです。
6. JSONBを使う時の注意点
とても便利なJSONBですが、初心者の方が気を付けるべきポイントがいくつかあります。
まず一つ目は、**「何でもかんでもJSONBに入れないこと」**です。例えば、全てのお客さんに共通して必要な「名前」や「メールアドレス」などは、普通の項目(カラム)として作成したほうが、入力ミスを防げますし、データの管理がしやすくなります。
二つ目は、**「データの書き間違い」**です。JSONBは自由な反面、コンピュータは「hobby」と「Hobby」を別のものとして扱います。手入力でデータを保存する場合、大文字小文字を間違えると検索に引っかからなくなってしまうので、注意が必要です。
三つ目は、**「計算が必要なデータ」**についてです。もし「年齢」を使って「平均年齢を計算したい」といった場合は、JSONBの中に年齢を入れるよりも、普通の数字の項目として保存したほうが計算がずっと速くなります。
7. 応用編:特定の項目だけを書き換える
最後に、すでに保存されているJSONBデータの一部だけを変更する方法を紹介します。例えば、佐藤花子さんの年齢を「25」から「26」に変更したい場合です。
-- jsonb_setという機能を使って中身の一部を更新します
UPDATE customers
SET info = jsonb_set(info, '{age}', '26')
WHERE name = '佐藤花子';
**解説:**
`jsonb_set` は、「箱の中の指定した場所(今回はage)の値を、新しい値(26)に置き換えてください」という命令です。
実行後のテーブルを確認してみましょう。
id | name | info
---+----------+------------------------------------------------------------
1 | 山田太郎 | {"city": "東京", "hobby": "登山"}
2 | 佐藤花子 | {"city": "大阪", "pet": "猫", "age": 26}
3 | 鈴木一郎 | {"city": "北海道", "hobby": "写真", "camera": "一眼レフ"}
4 | 田中次郎 | {"city": "福岡", "food": "ラーメン", "hobby": "釣り"}
佐藤花子さんの「age」がしっかりと「26」に変わっていますね。他の「city」や「pet」の情報はそのまま残っています。このように、一部だけを賢く操作できるのもJSONBの大きな魅力です。
いかがでしたでしょうか。JSONBは一見難しそうに見えますが、「整理整頓がされた、何でも入る便利な引き出し」だと考えれば、ぐっと身近に感じられるはずです。 PostgreSQLの強力な機能を使いこなして、より柔軟で便利なデータベース作りに挑戦してみてくださいね。