モデリング:JSONBが正規化を上回る場合
JSONB列と別テーブルのどちらを使うか、柔軟な属性と厳格なスキーマの違いを踏まえて判断します。
「モデリング:JSONBが正規化を上回る場合」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
選択
保存する可能性のあるデータごとに、通常の列にするかJSONBのキーにするかを選びます。この選択が、スキーマ設計、クエリ性能、保守性を左右します。
通常の列が適している場合
データが次のような場合は、通常の列を使います。
- 内容が既知で安定している
- インデックスを使って頻繁に検索する
- CHECK制約やFK制約で検証する
- レポートの対象にしたり、結合したりする
JSONBが適している場合
次のような場合はJSONBを使います。
- 行ごとに形が異なる(テナント定義のフィールド、プラグインのメタデータなど)
- スキーマが急速に変化する(マイグレーションを避けられる)
- ドキュメント全体の読み書きが一般的
- 不透明なペイロードを保存する(Webhookの本文など)
ハイブリッドパターン
両方の長所を活かします。安定した中核部分には構造化された列を使い、変動する追加部分にはJSONBを使います。
CREATE TABLE events (
id BIGSERIAL PRIMARY KEY,
ts TIMESTAMPTZ NOT NULL,
event_type TEXT NOT NULL,
user_id BIGINT,
data JSONB NOT NULL DEFAULT '{}'::JSONB
);EAVの落とし穴
従来の「エンティティ・属性・値」モデルでは、(key, value)の行を持つ1つのテーブルを使います。以前は疎なデータを扱う唯一の選択肢でした。JSONBなら、EAVを1つのドキュメント列に置き換えられます。
-- Old EAV:
CREATE TABLE user_attrs (
user_id BIGINT,
attr TEXT,
val TEXT
);
-- Modern:
ALTER TABLE users ADD COLUMN attrs JSONB NOT NULL DEFAULT '{}';
-- JSONB queries are faster and easier than the EAV joins.マイグレーション戦略
負荷の高いテーブルに列を追加すると、大きなテーブルでは5分間の停止が発生することがあります。JSONBなら、フィールドの追加はアプリケーションコードを変更するだけです。
JSONBに対する制約
CHECK制約を追加して、最低限の構造を強制します。
ALTER TABLE events
ADD CONSTRAINT data_has_type CHECK (data ? 'type'),
ADD CONSTRAINT type_is_string CHECK (jsonb_typeof(data->'type') = 'string');頻繁に使うフィールドを通常の列に昇格する
JSONBのフィールドが頻繁に検索されるようになったら、通常の列に昇格させます。UPDATEスクリプト、新しいインデックス、新しい列を用意すれば高速化できます。
JSONBのパッチ操作
1つのフィールドを更新します。
UPDATE users
SET attrs = jsonb_set(attrs, '{plan}', '"pro"')
WHERE id = 1;金額をJSONBに保存しない
金額には、正確なNUMERIC型と制約が必要です。必ず通常の列にしてください。
JSONBが問題になる場合
すべてのクエリで同じJSONBキーを抽出してキャストしているなら、それは列にすべきサインです。何百万行ものデータに対して(data->>'k')::INTを実行する累積コストは無視できません。
スキーマのドキュメント化
JSONB列は書き込みやすい一方で、ドキュメント化が難しくなります。共同作業者が想定すべき内容を把握できるように、外部スキーマ(JSON Schemaやアプリケーションコード)を管理してください。
まとめ
JSONBは強力なツールです。変動する部分にはJSONBを使い、安定した中核部分には通常の列を使ってください。パターンが明らかになったら、頻繁に使うフィールドを通常の列に昇格させます。
クイックチェック
監査イベントを保存しています。イベントの種類は常に存在し、一部のイベントには形状がさまざまな「actors」配列があります。どのようにモデル化しますか。
よくある質問
「モデリング:JSONBが正規化を上回る場合」レッスンは無料ですか?
はい。「モデリング:JSONBが正規化を上回る場合」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「モデリング:JSONBが正規化を上回る場合」で何を学びますか?
JSONB列と別テーブルのどちらを使うか、柔軟な属性と厳格なスキーマの違いを踏まえて判断します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「モデリング:JSONBが正規化を上回る場合」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- JSONBとJSON:使い分け
- パス演算子:->、->>、@>
- GINによるJSONBのインデックス化
- モデリング:JSONBが正規化を上回る場合