PostgreSQL JSONB 完全ガイド!JSONとの違いと初心者に最適な選び方
生徒
「PostgreSQLというデータベースを勉強中なのですが、『JSON』とか『JSONB』という言葉が出てきました。これって何のことですか?」
先生
「いいところに気づきましたね。データベース(データを保存する箱)には、普通は『名前』や『年齢』のように決まった項目を作って保存しますが、JSONを使うと『自由な形式のメモ』のようにデータを詰め込めるんです。」
生徒
「メモですか!でも、JSONとJSONBの2種類あるのがややこしいです。どちらを使えばいいんでしょうか?」
先生
「結論から言うと、今はほとんどの場面で『JSONB』が選ばれます。今日は、なぜJSONBが便利なのか、そして最新の便利な機能についても、パソコンを触ったことがない方にもわかるように解説しますね。」
1. データベースの基本:JSONとは何?
まず、「データベース」とは、たくさんの情報を整理して保管するための電子的な棚のようなものです。 通常のデータベースは、エクセルの表のように「1行目は名前、2行目は電話番号」と、入れる場所がキッチリ決まっています。
しかし、世の中には「人によって持っている情報がバラバラ」なデータもあります。 例えば、オンラインショップの商品情報です。 「服」ならサイズや色が必要ですが、「パソコン」ならCPUやメモリの容量が必要です。 これらをすべて一つの表に収めようとすると、項目が多すぎて整理が大変になります。
そこで登場するのがJSON(ジェイソン)です。
JSONは「キー(項目の名前)」と「値(中身)」をセットにして、
{"商品名": "Tシャツ", "サイズ": "L", "色": "白"}
のように、自由にデータを記述できる形式のことです。
PostgreSQLというデータベースソフトは、このJSON形式をそのまま保存できる特別な機能を持っています。
2. JSONとJSONBの違いを徹底解説
PostgreSQLには、JSONデータを扱うために「JSON型」と「JSONB型」の2つの種類が用意されています。 名前は似ていますが、中身はかなり違います。
JSON型:書いたままを保存する「生データ」
JSON型は、あなたが入力した文字をそのままテキストとして保存します。 入力した時のスペースや改行、項目の順番もそのまま残ります。 これを「プレーンテキスト保存」と呼びます。 保存するスピードは速いのですが、後から「特定のデータだけ取り出す」ときには、毎回文字を解析し直さなければならないため、動作が少し遅くなります。
JSONB型:賢く整理して保存する「バイナリ形式」
末尾に付いている「B」は「Binary(バイナリ)」の頭文字です。 これは、コンピュータが読みやすい形式にデータを変換して保存するという意味です。 保存する時に少しだけ加工の手間がかかりますが、その代わり「検索がめちゃくちゃ速い」という大きなメリットがあります。 また、余計な空白をカットしてくれるので、効率的に保存できます。
| 特徴 | JSON型 | JSONB型 |
|---|---|---|
| 保存の仕組み | 書いたそのまま(テキスト) | 効率的な形式に変換(バイナリ) |
| 処理スピード | 少し遅い | 非常に速い |
| インデックス(索引) | 使えない | 使える(高速検索が可能) |
| 基本の選び方 | 特殊な理由がない限り使わない | こちらが推奨! |
3. JSONBを使ってデータを操作してみよう
それでは、実際にJSONBを使った簡単な例を見てみましょう。 例えば、顧客の趣味を自由に登録できる「users」という表を作ったとします。
id | name | info (JSONB形式)
---+----------+--------------------------------------
1 | 田中太郎 | {"city": "東京", "hobby": "テニス"}
2 | 佐藤花子 | {"city": "大阪", "hobby": "料理"}
3 | 鈴木一郎 | {"city": "北海道", "hobby": "キャンプ"}
4 | 高橋愛美 | {"city": "福岡", "hobby": "映画鑑賞"}
この表から、「趣味(hobby)」が「料理」の人だけを探す魔法の言葉(SQL)を書いてみます。
->> という記号は、JSONデータの中から特定の項目を取り出すための専用の道具です。
SELECT name, info->>'hobby' AS hobby
FROM users
WHERE info->>'hobby' = '料理';
実行結果は以下のようになります。
name | hobby
----------+-------
佐藤花子 | 料理
このように、複雑な設定を後から自由に追加できるのがJSONBの魅力です。 初心者の方は、まずは「JSONBを使えば、後から項目が増えても安心!」と覚えておけば間違いありません。
4. 複雑な計算をスッキリ書く「CTE(共通テーブル式)」
次に、PostgreSQLのもう一つの強力な武器であるCTE(共通テーブル式)について説明します。 難しい言葉に聞こえますが、要するに「長い命令を、一時的なメモとして保存しておく機能」のことです。
料理に例えると、いきなりカレーを作るのではなく、「まずはジャガイモを切っておく」「次に肉を炒めておく」という下準備のステップを分けて書けるようになります。 これにより、後で見返したときに「何をしているのか」が非常に分かりやすくなります。
ここでは、まず「販売データ」という表から、売上の合計を計算してみましょう。
id | item_name | price | quantity
---+-----------+-------+---------
1 | リンゴ | 150 | 10
2 | バナナ | 100 | 5
3 | リンゴ | 150 | 2
4 | ミカン | 80 | 20
5 | バナナ | 100 | 10
CTEを使うときは WITH という言葉を使います。
以下のコードでは、まず商品ごとの合計売上を計算し、その後に1,000円以上の売上がある商品だけを抽出しています。
WITH sales_summary AS (
SELECT item_name, SUM(price * quantity) AS total_sales
FROM sales
GROUP BY item_name
)
SELECT *
FROM sales_summary
WHERE total_sales >= 1000;
実行結果は以下のようになります。
item_name | total_sales
-----------+------------
リンゴ | 1800
バナナ | 1500
ミカン | 1600
もしCTEを使わなければ、一つの長い文章の中に命令を詰め込む必要があり、読み解くのがとても大変になってしまいます。 CTEは、SQLをきれいに整理整頓するための大切なテクニックです。
5. データの変化を捉える「ウィンドウ関数」
最後に紹介するのがウィンドウ関数です。 これは、全体の合計を出しつつ、個別のデータも並べて表示したい、という「わがまま」を叶えてくれる機能です。
通常の「集計(GROUP BY)」を使うと、個別のデータは消えてしまい、合計値だけの短い表になってしまいます。 しかし、ウィンドウ関数を使えば、名簿の横に「クラス全員の平均点」を並べて表示するようなことができます。
ここでは、テストの点数表を使って、「自分の点数」と「全員の平均点」を同時に表示してみましょう。
id | student_name | score
---+--------------+-------
1 | 太郎 | 80
2 | 花子 | 95
3 | 一郎 | 70
4 | 良子 | 85
5 | 健二 | 60
OVER() という言葉を使うのが、ウィンドウ関数の特徴です。
SELECT
student_name,
score,
AVG(score) OVER() AS average_score
FROM exam_results;
実行結果は以下のようになります。
student_name | score | average_score
--------------+-------+---------------
太郎 | 80 | 78
花子 | 95 | 78
一郎 | 70 | 78
良子 | 85 | 78
健二 | 60 | 78
自分の点数を見ながら、平均より高いか低いかが一目で分かりますね。 ウィンドウ関数は、ランキングを作ったり(1位、2位...と番号を振る)、前月比の売上を出したりするときにも非常に重宝します。
6. 高度な機能を使いこなすための第一歩
ここまで、PostgreSQLの強力な3つの機能「JSONB」「CTE」「ウィンドウ関数」を見てきました。 初心者のうちは、「こんな便利な道具があるんだな」と知っておくだけで十分です。
データベースは、最初は難しく感じるかもしれません。 しかし、基本的には「たくさんのカード(データ)を、いかに楽に、正確に整理するか」というパズルに近い感覚で楽しめます。 今回紹介した機能は、そのパズルを解くための強力なヒントになります。
もし、これからシステム開発やデータ分析に挑戦したいと考えているなら、PostgreSQLは最高のパートナーになってくれるはずです。 少しずつ、実際に命令を書いて試しながら、データの扱い方をマスターしていきましょう。