JSONB全盛の今、あえて「hstore」を語る理由
「先輩、今のプロジェクトでスキーマレスなデータを入れたいんですけど、やっぱりJSONB一択ですよね?」
最近、後輩からこんな質問をよく受けます。もちろん、PostgreSQLにおいてJSONBは最強の選択肢です。検索性能、インデックスの豊富さ、そして何よりドキュメント指向DB並みの柔軟性。現代のWeb開発において、JSONBを避ける理由はほとんどありません。
でもね、エンジニアとして「歴史を知る」ことは、武器を増やすことと同じなんです。今日は、JSONBが市民権を得るずっと前からPostgreSQLを支えてきた、ちょっと渋い相棒「hstore」について話をしようと思います。
hstoreって何者?
簡単に言うと、hstoreは「キーと値のペアを一つのカラムに詰め込める拡張機能」です。
JSONBが階層構造(ネスト)を持てるのに対し、hstoreは基本的にフラットな「文字列のキーと値のペア」しか持ちません。一見すると「JSONBの劣化版じゃない?」と思うかもしれません。でも、この「フラットであること」が、特定のシチュエーションでは驚くほどのパフォーマンスとシンプルさを発揮するんです。
まずは準備から
hstoreは標準機能ではなく、拡張モジュールです。使うには一度だけ以下のコマンドを叩く必要があります。
CREATE EXTENSION IF NOT EXISTS hstore;
これだけで、PostgreSQLはhstoreの魔法を使えるようになります。
実践:どんな時にhstoreが輝くのか?
例えば、「ユーザーの属性データ」を保存するケースを考えてみてください。性別、年齢、趣味……これらは頻繁に追加・変更される可能性がありますよね。
CREATE TABLE users (
id serial PRIMARY KEY,
name text,
attributes hstore
);
データを投入するときは、こんな感じです。
INSERT INTO users (name, attributes)
VALUES (‘田中’, ‘”age”=>”28″, “hobby”=>”sauna”, “premium”=>”true”‘);
ここからがhstoreの面白いところ。特定のキーだけを抽出したり、フィルタリングしたりするのがすごく直感的です。
1. 特定の属性を持つユーザーを検索する
「サウナが趣味のユーザーを探せ」と言われたら?
SELECT name FROM users WHERE attributes @> ‘”hobby”=>”sauna”‘;
JSONBの演算子に似ていますが、hstoreの場合はキーと値のペアそのものをクエリできるので、非常に軽量です。
2. キーの追加や更新もサクサク
特定のユーザーの属性を更新するのも簡単です。
— 既存のデータにキーを追加・更新する
UPDATE users
SET attributes = attributes || ‘”location”=>”tokyo”‘
WHERE name = ‘田中’;
JSONBと何が違うの?
ここが一番大事なポイントです。なぜわざわざhstoreを使うのか。
- シンプルさ: 階層構造が不要な場合、JSONBの複雑なパーサーを通すよりも、hstoreの方がオーバーヘッドが少ないケースがあります。
- 型制約の心地よさ: hstoreは「キーも値も文字列」と決まっています。JSONBだと数値やnull、配列が混在してカオスになりがちですが、hstoreは「フラットな属性リスト」という制約がある分、アプリケーション側でデータのバリデーションがしやすいんです。
- レガシーな環境との親和性: 昔のシステムからの移行や、古いライブラリを使っている環境では、JSONBよりもhstoreの方が圧倒的に安定して動くことがあります。
先輩からのアドバイス
もちろん、今から新規でバリバリのモダンなシステムを作るなら、まずはJSONBを検討してください。JSONBには`GIN`インデックスという強力な武器がありますし、関数も圧倒的に多い。
でも、「とりあえずちょっとしたタグを付けたい」「設定値をフラットに持ちたい」という程度の要件であれば、hstoreの潔さは非常に魅力的です。
技術選定において、「最新だから」という理由だけで選ぶのではなく、「そのデータ構造に最も適した道具は何か?」を考える癖をつけましょう。JSONBという豪華な道具箱の横に、hstoreという使い勝手の良いドライバーを忍ばせておく。そんなプロの余裕が、現場では一番頼りになるはずですよ。
もし、今動かしているDBで「これ、JSONにするほどでもないけど、普通のカラムだと足らないな……」という悩みがあったら、一度hstoreを思い出してみてください。案外、それが一番の特効薬になるかもしれません。
さて、今日はこの辺で。また何か面白い技術の深掘りをしたくなったら、いつでも聞きに来てくださいね。
コメント