0Pricing
SQL Academy · レッスン

JSONBとJSON:使い分け

適切な保存方法を選べるように、JSON(テキスト形式で空白を保持)とJSONB(バイナリ形式でインデックス化でき、キーを重複排除)の違いを理解します。

「JSONBとJSON:使い分け」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

PostgreSQLにおける2つのJSON型

  • JSON — 入力したテキストをそのまま保存する
  • JSONB — 分解されたバイナリ形式で、キーが重複排除され、インデックスを作成できる

JSON: テキスト保存

JSONは空白、キーの順序、重複したキーを保持します。読み取るたびに再解析が必要です。GINインデックスには対応していません。新しいコードで選ぶべき場面はほとんどありません。

INSERT INTO docs (data) VALUES ('{"a": 1, "a": 2}'::JSON);
SELECT data->'a' FROM docs;     -- whatever the parser picks

JSONB: バイナリ形式でインデックスに対応

JSONBには次の特徴があります。

  • 分解した状態で保存されるため、読み取り時の再解析が不要
  • 重複したキーは統合される(最後の値が優先される)
  • キーの順序は保持されない
  • GINインデックスに対応
  • 豊富なパス演算子に対応

JSONBの例

単純なイベントテーブルを作成します。

CREATE TABLE events (
  id BIGSERIAL PRIMARY KEY,
  ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  data JSONB NOT NULL
);

INSERT INTO events (data) VALUES
  ('{"type":"login","user_id":42,"ip":"1.2.3.4"}');

パス演算子

JSONBには豊富な演算子があります(次のレッスンで説明します)。

SELECT data->'user_id'   FROM events;       -- → JSONB
SELECT data->>'user_id'  FROM events;       -- → TEXT
SELECT data #>> '{user,name}' FROM events;  -- nested text path

包含

最も便利なJSONB演算子は@>(包含)です。

SELECT * FROM events WHERE data @> '{"type":"login"}';

-- Combined with a GIN index, this is fast even on billions of rows.

JSONBの等価性

2つのJSONB値は、内容が一致すれば等価です。キーの順序は関係ありません。

SELECT '{"a":1,"b":2}'::JSONB = '{"b":2,"a":1}'::JSONB;    -- TRUE

型の相互キャスト

自由にキャストできます。

SELECT '{"a":1}'::JSONB->'a';                -- 1 (as JSONB)
SELECT ('{"a":1}'::JSONB)->>'a';             -- '1' (as TEXT)
SELECT ('{"a":1}'::JSONB)->'a'::INT;          -- 1 (as INT after extraction)

JSONBを使わない場合

データの形が固定されている場合は、通常の列を使います。

  • 行ごとのドキュメント解析が不要で、クエリが高速
  • 厳密な型と制約を利用できる
  • ストレージ容量が小さい
  • 統計情報が優れている

JSONBは、形が変化する場合や、急速に進化する場合に適しています。

ハイブリッドモデリング

ベストプラクティスは、安定したフィールドには構造化された列を使い、変動する追加データにはJSONBを使うことです。

CREATE TABLE events (
  id BIGSERIAL PRIMARY KEY,
  ts TIMESTAMPTZ NOT NULL,
  event_type TEXT NOT NULL,
  user_id BIGINT,
  extra JSONB NOT NULL DEFAULT '{}'::JSONB
);

バリデーション

JSONBには、妥当なJSONであればどのようなデータでも保存できます。構造化された制約には、CHECK制約またはアプリケーション層でのスキーマ適用を使用します。

ALTER TABLE events
  ADD CONSTRAINT data_has_type CHECK (data ? 'type');

まとめ

ほぼすべての本番環境では、JSONよりJSONBが適しています。

  • JSONB: バイナリ形式、インデックス対応、高速なパス操作
  • JSON: テキストのラウンドトリップのみ
  • 形が変動する場合はJSONB、固定されている場合は通常の列を使う

理解度チェック

ユーザーがアップロードしたJSONドキュメントを保存し、内容で検索する新しいテーブルを設計しています。JSONとJSONBのどちらを使いますか。

よくある質問

「JSONBとJSON:使い分け」レッスンは無料ですか?

はい。「JSONBとJSON:使い分け」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「JSONBとJSON:使い分け」で何を学びますか?

適切な保存方法を選べるように、JSON(テキスト形式で空白を保持)とJSONB(バイナリ形式でインデックス化でき、キーを重複排除)の違いを理解します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「JSONBとJSON:使い分け」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. JSONBとJSON:使い分け
  2. パス演算子:->、->>、@>
  3. GINによるJSONBのインデックス化
  4. モデリング:JSONBが正規化を上回る場合
← SQL Academyに戻る