0Pricing
SQL Academy · レッスン

モデリング: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フィードバックを取得できます。ローカル設定は不要です。

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

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