【ITニュース解説】Notes - Array in JSONB column
2025年09月09日に「Dev.to」が公開したITニュース「Notes - Array in JSONB column」について初心者にもわかりやすいように丁寧に解説しています。
ITニュース概要
データベースのJSONB型カラムに格納された配列は、SQLの演算子で簡単に操作できる。`||`で要素を追加し、`-`で要素を削除するなど、JSONデータを柔軟に更新することが可能だ。
ITニュース解説
現代のWebアプリケーション開発において、データ交換形式としてJSON(JavaScript Object Notation)が広く利用されている。このJSON形式のデータをデータベースで効率的に扱うための機能が、多くのデータベースシステムに導入されており、特にPostgreSQLのJSONB型はその強力な機能で注目を集めている。これは、システム開発の現場でデータベース設計の考え方を大きく変える可能性を秘めている。
従来のリレーショナルデータベース(RDB)では、データは厳格な構造を持つテーブルに格納されるのが一般的であった。例えば、一人のユーザーが複数の部署に所属するケースを考えた場合、ユーザー情報を格納する「USER」テーブルと、部署情報を格納する「DEPARTMENTS」テーブルを作成し、さらに両者を関連付けるための中間テーブル「USER_DEPARTMENTS」を用意する、という設計(正規化)が基本であった。この方法はデータの整合性を保ちやすい反面、テーブルの数が増え、データの取得や更新には複数のテーブルを結合(JOIN)する複雑なクエリが必要になる場合があった。しかし、JSONB型を利用すると、このような関連データを一つのカラムにまとめて格納することが可能になる。具体的には、USERテーブルに「DEPARTMENTS」というJSONB型のカラムを用意し、そこに所属部署のリストを["dept1", "dept2"]のようなJSON配列として直接保存できる。これにより、データベースの構造をシンプルにし、アプリケーション側のデータ構造と一致させやすくなるという利点がある。
PostgreSQLにはJSONを扱うデータ型として「JSON」と「JSONB」の二種類が存在する。JSON型は入力されたテキストをそのまま保存するのに対し、JSONB型はデータを解析して最適化されたバイナリ形式に変換して保存する。このバイナリ形式で保存することにより、JSONB型はいくつかの重要なメリットを持つ。第一に、処理速度が向上する。テキストを都度解析する必要がないため、データの検索や更新がJSON型に比べて高速である。第二に、インデックスの作成に対応している。これは、大量のデータの中から特定の値を高速に検索するための仕組みであり、JSONB型であればJSONデータ内の特定のキーや値に対してインデックスを設定できる。これにより、JSONBカラムを検索条件に含めるクエリのパフォーマンスを大幅に改善できる。したがって、特別な理由がない限り、JSONデータを格納する際にはJSONB型を選択することが推奨される。
それでは、実際にJSONB型のカラムに格納された配列データをどのように操作するのかを見ていこう。まず、新しいユーザーのデータとして、所属部署の配列を登録する場合、INSERT INTO USER (DEPARTMENTS) VALUES ('["dept1","dept2"]')のようなSQL文を実行する。この時、値は文字列として記述するが、データベース側でJSONB型として正しく解釈され、バイナリ形式で格納される。
次に、既存のユーザーに新しい部署を追加したい場合を考える。これには専用の連結演算子||を使用する。例えば、UPDATE USER SET DEPARTMENTS = DEPARTMENTS || '["dept3"]'::JSONBというクエリを実行すると、既存の["dept1", "dept2"]という配列に["dept3"]が連結され、結果として["dept1", "dept2", "dept3"]という新しい配列でカラムが更新される。ここでの::JSONBはキャストと呼ばれる機能で、右辺の文字列を明示的にJSONB型として扱うようデータベースに指示するものである。この演算子により、アプリケーション側で既存のデータを読み込んで加工し、再度書き戻すといった手間をかけることなく、データベース上で直接かつ効率的に配列の要素を追加できる。
逆に、ユーザーが特定の部署から離れるなど、配列から要素を削除したい場合には-演算子を利用する。UPDATE USER SET DEPARTMENTS = DEPARTMENTS - 'dept1'というクエリを実行すれば、DEPARTMENTSカラムの配列から"dept1"という要素が取り除かれる。この操作もデータベース内で完結するため、非常にシンプルかつ高速である。このように、JSONB型には専用の演算子が用意されており、あたかも通常のデータ型を扱うのと同じような感覚で、JSON内部のデータを柔軟に操作することが可能となっている。
JSONB型は、開発の柔軟性と速度を向上させる強力な機能であるが、万能というわけではない。正規化された設計に比べてデータの整合性を保つための制約が弱くなりがちであり、無計画に使用するとデータの一貫性が損なわれるリスクもある。そのため、ユーザーのプロフィール設定や商品のタグ情報など、構造が可変的であったり、従属的な情報を格納するのに適している。一方で、厳密なトランザクション管理やデータ間の整合性が最優先される基幹業務システムなどでは、従来通りの正規化された設計が依然として有効である。
システムエンジニアを目指す上で、JSONBのような新しいデータベースの機能を理解し、その特性や適切な利用シーンを見極める能力は非常に重要である。これにより、従来のRDB設計の知識に加えて、より現代的で柔軟なデータモデリングの選択肢を持つことができ、設計・開発できるシステムの幅が大きく広がることになるだろう。