CodeGym /コース /SQL SELF /JSONB データ型の使い方

JSONB データ型の使い方

SQL SELF
レベル 16 , レッスン 1
使用可能

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管理が大変になることもあるから注意!データ構造が安定してるなら、リレーショナルモデルの方がいい場合もあるよ。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION