JSON (JavaScript Object Notation) は、システム間で情報をやりとりするのによく使われるデータフォーマットだよ。軽量で人間にも読みやすくて、オブジェクトや配列みたいな構造化データの表現にピッタリ。
PostgreSQLではJSONを扱うために2つのデータ型があるよ:
JSON: データを文字列として保存する。これは純粋なテキスト表現で、内部的な最適化はされてない。JSONB: JSONのバイナリ表現。PostgreSQLが事前にパースして保存を最適化するから、読み込みやフィルタリング、処理が速い。
なんで JSONB がよく選ばれるの?理由は:
- バイナリ保存だからクエリが速い。
- インデックスが使えるので、大量データにも向いてる。
- キーが順序通りに保存されて重複も消してくれるから、処理がラク。
JSON構造の例:
{
"name": "Alice",
"age": 25,
"skills": ["SQL", "PostgreSQL", "JSONB"]
}
なんで JSONB が便利なの?
半構造化データの保存。 現実のデータって、複雑なオブジェクト(たとえばメタデータ、設定、ユーザープロフィールとか)で来ることが多いよね。JSONBなら、何百ものテーブルやリレーションを作らずにそういうデータを保存できる。
変化するデータ構造のモデリング。 オブジェクトの構造がよく変わる(フィールドが追加・削除される)場合でも、JSONBなら柔軟に保存できる。
APIとのやりとり。 多くのWebアプリはJSON形式でデータを送ってくる。リクエストを変換せず、そのまま保存して直接扱えるのが便利!
JSONB付きテーブルの作成
じゃあ実際にやってみよう!たとえば、ユーザープロフィールを保存するデータベースを作るとするよ。
profileカラムには追加情報(年齢、興味、連絡先など)をJSON形式で保存する。ユーザーごとに保存するデータの構造が違っても便利だよ。
| id | name - VARCHAR(100) | profile - JSONB |
|---|---|---|
| 1 | Alice | {"age": 25, "skills": ["SQL", "PostgreSQL", "JSONB"], "location": "New York"} |
| 2 | Bob | {"age": 30, "interests": ["hiking", "photography"], "location": "Denver"} |
| 3 | Charlie | {"email": "charlie@example.com", "verified": true} |
| 4 | Diana | {"age": 22, "skills": ["Python"], "bio": "Data enthusiast", "location": "Berlin"} |
| 5 | Eve | {"age": 28, "skills": [], "preferences": {"theme": "dark", "notifications": false}} |
JSONデータは文字列としてINSERTできるよ。PostgreSQLが自動でJSONBに変換してくれる。
JSONBからデータを取り出す
データが入ったら、今度はどうやって取り出すか見てみよう。PostgreSQLにはJSONBを扱うための演算子がたくさんあるよ。
フィールド値へのアクセス
->演算子でフィールドの値を取得できる:
-- ユーザーの年齢を表示
SELECT profile->'age' AS age FROM users;
値をテキストに変換
->>演算子で値を文字列として取り出せる:
-- ユーザーの居住地を表示
SELECT profile->>'location' AS location FROM users;
JSONBでデータをフィルタリング
JSONBの本領発揮はフィルタ付きクエリ!SQL標準の演算子でJSONも扱えるよ。
キーでフィルタする例:
-- 居住地が"New York"のユーザーを探す
SELECT * FROM users
WHERE profile->>'location' = 'New York';
配列の中を検索
JSONは配列もサポートしてて、PostgreSQLはその中身も検索できる:
-- SQLができるユーザーを探す
SELECT * FROM users
WHERE 'SQL' = ANY(jsonb_array_elements_text(profile->'skills'));
jsonb_array_elements_text関数は配列の要素を文字列にして比較できるようにしてくれる。
もっと短く書くなら@>演算子も使えるよ:
-- SQLができるユーザーを探す
SELECT * FROM users
WHERE profile->'skills' @> '["SQL"]';
JSONの関数やいろんな使い方は、また今度じっくり話すから楽しみにしててね :P
まとめ:JSONBを使うべきとき
JSONBはこんなときに超便利:
- 複雑な構造化データを保存したいとき。
- 外部APIからのデータを扱うとき。
- オブジェクトの構造がよく変わるとき。
でも、JSONBを使いすぎるとインデックスやDB管理が大変になることもあるから注意!データ構造が安定してるなら、リレーショナルモデルの方がいい場合もあるよ。
GO TO FULL VERSION