たぶん、もう何度も配列って聞いたことあるよね。いろんなプログラミング言語で、だいたい同じ意味だけど、ちょっとした違いもあるんだ。
PostgreSQLの配列は、同じ型の値のセットを1つのカラムに保存できるデータ型だよ。1つのレコードじゃなくて、まるごと「箱」にデータを詰めてセルに入れる感じ。数字のリスト、文字列、日付、もっと複雑なオブジェクトもOK。
抽象的に言うと、配列はツールボックスみたいなもの。鍵を全部手で持つ(それぞれがカラムや行)より、便利なケース(配列入りの1カラム)にまとめて入れるイメージ。
配列を作る2つの方法
PostgreSQLでは配列を作る方法が2つあるよ。スーツケースを詰める2つのやり方みたいなもので、結果は同じだけどアプローチが違う:
- 波括弧
{}を使うシンタックス
これはコンパクトでよく使われる方法:
-- 文字列の配列
'{"りんご", "バナナ", "さくらんぼ"}'
-- 数字の配列
'{1, 2, 3, 4, 5}'
-- 日付の配列
'{"2023-01-01", "2023-01-02", "2023-01-03"}'
- コンストラクタ
ARRAY[]を使うシンタックス
もっと明示的で読みやすい方法:
-- 文字列の配列
ARRAY['りんご', 'バナナ', 'さくらんぼ']
-- 数字の配列
ARRAY[1, 2, 3, 4, 5]
-- 日付の配列
ARRAY['2023-01-01'::DATE, '2023-01-02'::DATE, '2023-01-03'::DATE]
どっちのシンタックスも同じように動くよ!どっちを使うかは好みや状況次第。他の言語で for と while どっちのループ使うか選ぶのと同じで、機能的には一緒だけど、場面によって便利さが違うだけ。
配列を使うタイミング
配列はPostgreSQLのスーパーパワーで、追加のテーブルやカラムを作るのが面倒なときに役立つよ。こんな場面にピッタリ:
- リスト、タグ、カテゴリの保存
例えば、ネットショップのデータベースを作るとする。商品ごとに複数のタグがある場合:
- Tシャツならタグは
["服", "メンズ", "スポーツ"]。 - イヤホンならタグは
["エレクトロニクス", "ワイヤレス", "ガジェット"]。
配列を使えば、タグ用の別テーブルを作らずに1カラムでタグを保存できて、データ構造もシンプルになるよ。
-- タグ配列付き商品テーブル
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
tags TEXT[] -- タグ用の文字列配列
);
-- データ例
INSERT INTO products (name, tags)
VALUES
('Tシャツ', ARRAY['服', 'メンズ', 'スポーツ']),
('イヤホン', ARRAY['エレクトロニクス', 'ワイヤレス', 'ガジェット']);
- 注文リストの保存
注文を扱う場合、1つの注文に含まれる商品リストを配列で保存できる:
-- 商品ID配列付き注文テーブル
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_name TEXT,
product_ids INTEGER[] -- 商品IDの配列
);
-- データ例
INSERT INTO orders (customer_name, product_ids)
VALUES
('アンナ', ARRAY[1, 2, 3]),
('オットー', ARRAY[4, 5]);
これで、各注文にどの商品が含まれてるか一目で分かるし、便利だよね?
シンプルな設定やプリファレンスの保存
ユーザーの設定や好みのリストを保存したいとき:
CREATE TABLE user_preferences ( user_id INTEGER PRIMARY KEY, notification_types TEXT[], allowed_days INTEGER[] -- 曜日: 1-7 );
配列と他のデータ型の比較
ここで大事なのは、配列はPostgreSQLのツールボックスの1つで、万能じゃないってこと。例えば、配列の代わりにリレーションテーブル(多対多の関係)やJSON/JSONB型を使うこともできる。
配列 vs JSONB
配列は、同じ型の複数の値を保存したいときに便利。シンプルで速くて、省スペース。
JSONBは、もっと複雑な構造や柔軟なオブジェクトを保存したいときに向いてる。でも、JSONBは処理がちょっと面倒なことも。
同じデータを配列とJSONBで保存する例:
-- 配列
ARRAY['服', 'メンズ', 'スポーツ']
-- JSONB
'["服", "メンズ", "スポーツ"]'::JSONB
ソートやフィルタ、インデックスをよく使うなら、配列の方がオススメ。
実際の課題で配列を使う例
例えば、大学の出席管理アプリを作るとする。各講義に出席した学生のリストが必要だけど、学生と講義をつなぐ別テーブルを作るほどじゃない場合、配列が便利:
-- 学生配列付き講義テーブル
CREATE TABLE lectures (
id SERIAL PRIMARY KEY,
topic TEXT NOT NULL,
students INTEGER[] -- 学生IDの配列
);
-- データ例
INSERT INTO lectures (topic, students)
VALUES
('データベース', ARRAY[101, 102, 103]),
('アルゴリズム', ARRAY[104, 105]);
これで、どの講義に誰が出席したか簡単に調べられるし、学生の追加や削除も楽ちん。
PostgreSQLで配列を使うときの注意点
- 配列の中身の型は全部同じじゃないとダメ。 PostgreSQLでは、例えば文字列と数字を同じ配列に混ぜるのはNG。
-- OK
ARRAY[1, 2, 3] -- 数字の配列
-- エラー:文字列と数字の混在
ARRAY['りんご', 42, 'さくらんぼ']
- 配列のインデックスは1から始まるよ。PythonやJavaScript、C++みたいに0からじゃないから注意!
- NULLサポート:配列にはNULL値も入れられる
- 多次元:PostgreSQLは多次元配列もサポートしてる
GO TO FULL VERSION