JSONBとは?
JSONB
は、PostgreSQLにおけるJSONデータを効率よく保存するための型です。JSONをそのまま保存するのではなく、バイナリ形式で保持するので検索やインデックス処理が高速になります。簡単に言えば、**RDBの中で「柔軟に形を変えられる引き出し」**のような存在です。
JSONBを使うシーン
特にMLOps環境では、次のようなケースで便利です。
- 推論リクエストのペイロード:ユーザーごとに入力形式が異なる場合でもそのまま保存可能。
- モデルのメタデータ:新しい特徴量やログ形式が追加されてもテーブル設計を変えずに対応できる。
JSONBのメリット
- スキーマレスで柔軟
→ 新しいフィールドが増えてもALTER TABLEが不要。 - 部分検索・インデックス対応
→ GINインデックスを貼ることで「payload内のキー検索」も高速化できる。 - 構造化と非構造化の中間
→ RDBの強み(ACID、SQLクエリ)を保ちながら、NoSQL的な柔軟さを得られる。
📌 イメージ図
[正規化されたRDBテーブル] ← 基本情報(user_id, model_versionなど)
+
[JSONBフィールド] ← 可変的なデータ(特徴量やログ)
JSONBの落とし穴
- 安易に全部JSONBにしない
頻繁にJOINするカラム(例:user_idやmodel_version)は通常のカラムにした方が効率的。 - インデックス肥大化
GINインデックスは便利だがサイズが大きくなりやすく、ストレージや更新コストが増える。 - 正規化を放棄しない
JSONBは「補助的なフィールド」として使うのがベスト。主要なデータは正規化テーブルで管理。
サンプル設計例
CREATE TABLE inference_requests (
id BIGSERIAL PRIMARY KEY,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
user_id BIGINT NOT NULL,
model_version TEXT NOT NULL,
payload JSONB -- 入力データや設定を柔軟に保存
);
-- payload内のキー検索を高速化
CREATE INDEX idx_requests_payload ON inference_requests USING GIN (payload);
✅ 今日のまとめ
- JSONBは「変化に対応する柔軟な引き出し」。
- ただし万能ではなく、すべてを詰め込むと後でパフォーマンスや管理が大変になる。
- 基本情報は正規化テーブルに、可変情報はJSONBに、という役割分担が長期運用を安定させるコツ。