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 picksJSONB: バイナリ形式でインデックスに対応
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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- JSONBとJSON:使い分け
- パス演算子:->、->>、@>
- GINによるJSONBのインデックス化
- モデリング:JSONBが正規化を上回る場合