JSONカラム じぇいそんからむ
JSON半構造化データNoSQLPostgreSQLMySQLドキュメント型
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 / JSONB | JSONB は内部でバイナリ変換済みで検索が高速 |
| 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カラムの操作例
-- 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 8259 | JSONデータ形式の仕様。文字列・数値・真偽値・配列・オブジェクトの定義 |
| ISO/IEC 9075-2 (SQL:2016) | SQL標準にJSON操作関数が追加された版 |