データ型

JSONカラム じぇいそんからむ

JSON半構造化データNoSQLPostgreSQLMySQLドキュメント型
JSONカラムについて教えて

簡単に言うとこんな感じ!

JSONカラムは「データベースの中に小さなメモ帳を挟める機能」だよ!普通のテーブルは列(カラム)が決まってるけど、JSONカラムなら「このカラムの中に好きな形の情報をまとめて入れていいよ」ってなるんだ。設定値や属性情報みたいな「毎回形が違うデータ」に超便利!


JSONカラムとは

JSONカラム とは、リレーショナルデータベースの1つのカラムに JSON(JavaScript Object Notation)形式のデータをそのまま格納できる機能・型のことです。JSONはキーと値のペアや配列で構成される軽量なデータ形式で、{"name": "山田太郎", "age": 30} のような書き方が特徴です。

通常のリレーショナルDBは「スキーマ(テーブルの列定義)が事前に決まっていること」を前提とします。しかしJSONカラムを使えば、列の定義を変えずに柔軟な構造のデータを1つのカラムに詰め込めるため、ECサイトの商品属性(服ならサイズ・色、電化製品なら電圧・消費電力)や、ユーザーの設定値など「製品ごとに構造が変わるデータ」に非常に相性がよいです。

ただしJSONカラムは「何でも入れられる自由さ」の反面、型安全性の保証が弱い・検索が遅くなりやすい・データの一貫性を保ちにくい といったデメリットもあります。本来リレーショナルDBの強みである正規化・制約・結合を活かせなくなるため、使いどころの見極めが重要です。


JSONカラムの主なDBMSサポート

DBMS対応状況型名特徴
PostgreSQL 9.3+ネイティブ対応JSON / JSONBJSONB は内部でバイナリ変換済みで検索が高速
MySQL 5.7+ネイティブ対応JSONパス演算子で中身を参照可能
SQL Server 2016+テキスト+関数NVARCHAR + JSON関数専用型はないが JSON_VALUE() などで操作可能
SQLite 3.38+拡張対応TEXT + JSON関数json_extract() 等で操作
MongoDBネイティブ対応BSON(バイナリJSON)ドキュメント全体がJSONベース

PostgreSQLの JSON vs JSONB の違い

JSON型:
  テキストとして保存 → 入力を忠実に保持(キー順・スペースも保存)
  検索は遅め(毎回パース)

JSONB型:
  バイナリ形式で保存 → キー順が変わる・重複キーは後勝ち
  インデックスを貼れる・検索が高速
  ほとんどの場合こちらを選ぶ

歴史と背景

  • 2001年 — ダグラス・クロックフォードがJSONを提唱。XMLより軽量なデータ交換形式として普及し始める
  • 2006年頃 — AjaxやREST APIの普及でJSONがWeb APIの事実上の標準に
  • 2009年 — MongoDB がドキュメント型DB(JSONベース)として登場。NoSQLブームの先駆けに
  • 2012年 — PostgreSQL 9.2 が JSON 型をサポート(読み書きのみ)
  • 2014年 — PostgreSQL 9.4 が JSONB 型を追加。インデックス対応で実用的なJSONサポートに
  • 2015年 — MySQL 5.7 がネイティブ JSON 型をサポート。RDBMSでのJSON利用が主流化
  • 2016年以降 — SQL ServerもJSON関数に対応。「RDBとNoSQLのいいとこ取り」設計が広まる

JSONカラムの操作例

JSONカラムの構造イメージ productsテーブル id | name | price | attributes(JSONカラム) 1 | Tシャツ | 2800 | {"color": "white", "size": "M", "material": "cotton"} 構造は自由→カラム追加不要 2 | ノートPC | 98000 | {"cpu": "M3", "ram_gb": 16, "storage_gb": 512, "os": "macOS"} Tシャツとは全く異なる構造でOK 3 | コーヒー豆 | 1500 | {"origin": "Ethiopia", "roast": "medium", "tags": ["fruity","floral"]} 配列も入れられる 通常のカラムと異なり、JSON内の構造は行ごとに自由に変えられる 服・PC・食品…カテゴリが違っても同じテーブルで管理できる
-- PostgreSQL: JSONBカラムの値を条件に検索
SELECT name FROM products
WHERE attributes->>'color' = 'white';

-- MySQL: JSON_EXTRACT を使った検索
SELECT name FROM products
WHERE JSON_EXTRACT(attributes, '$.color') = 'white';

-- 特定のJSONキーにインデックスを作成(PostgreSQL)
CREATE INDEX idx_products_color
ON products ((attributes->>'color'));

関連する規格・RFC

規格・RFC番号内容
RFC 8259JSONデータ形式の仕様。文字列・数値・真偽値・配列・オブジェクトの定義
ISO/IEC 9075-2 (SQL:2016)SQL標準にJSON操作関数が追加された版

関連用語

  • テキスト型 — JSONをテキストとして保存する場合の基本型
  • 真偽値型(Boolean) — JSON内の true/false 値に対応するDBの型
  • 配列型 — JSONの配列と近い概念。PostgreSQLはどちらもサポート
  • スキーマ — JSONカラムはスキーマレス設計の自由さをRDBにもたらす
  • インデックス — JSONカラムの特定パスにインデックスを設定して検索を高速化する
  • 制約 — JSONカラムは一般的な制約が効きにくい点が注意点
  • データベース — JSONを扱うリレーショナルおよびドキュメント型DBの全体像