データ型

配列型 はいれつがた

配列ArrayPostgreSQL複数値データベースコレクション
配列型について教えて

簡単に言うとこんな感じ!

配列型は「1つのマス目に複数の値を入れられる仕切り付き引き出し」だよ!普通は「名前の列には1人の名前しか入らない」のに、配列型なら「タグの列に{料理、旅行、写真}みたいに複数の値をまとめて入れられる」んだ。ただし使えるDBが限られるのが注意点!


配列型とは

配列型(Array型) とは、1つのカラムに同じ型の値を複数格納できるデータ型です。たとえば「記事のタグ」カラムに {"料理", "旅行", "写真"} のように複数の文字列をまとめて持てます。プログラミング言語の「配列(リスト)」と同じ発想をデータベースのカラムに持ち込んだものです。

リレーショナルデータベースの設計原則(第一正規形)では「1つのカラムには1つの値のみ」が基本です。本来なら「タグ」を複数持ちたい場合は別テーブルarticle_tags テーブル)を作って外部キーで紐付けるのが正攻法です。しかし配列型を使えばテーブルを増やさずに複数値を1カラムにまとめて持てるため、開発が楽になる反面、正規化の原則を崩すというトレードオフがあります。

PostgreSQL は配列型を強力にサポートしており、任意の型の配列を定義でき、インデックスも貼れます。一方 MySQL・SQL Server・SQLite は配列型を持たず、JSONカラムや別テーブルで代替するのが一般的です。


配列型のサポート状況と構文

DBMS配列型サポート代替手段
PostgreSQLネイティブ対応(あらゆる型の配列)
MySQL非対応JSON 型の配列で代替
SQL Server非対応JSON または別テーブル
SQLite非対応JSON 関数 + テキスト
OracleVARRAY・ネスト表(複雑)ほぼ別テーブルで代替
-- PostgreSQL: 配列型カラムの定義
CREATE TABLE articles (
  id      SERIAL PRIMARY KEY,
  title   TEXT NOT NULL,
  tags    TEXT[],           -- 文字列の配列
  scores  INTEGER[]         -- 整数の配列
);

-- 配列の挿入
INSERT INTO articles (title, tags)
VALUES ('Pythonで機械学習', ARRAY['Python', 'AI', '機械学習']);

-- 配列の中の値で検索(ANY演算子)
SELECT title FROM articles
WHERE 'Python' = ANY(tags);

-- 配列にインデックスを貼る(GINインデックス)
CREATE INDEX idx_articles_tags ON articles USING GIN(tags);

歴史と背景

  • 1970年代 — E.F.コッドのリレーショナルモデル第一正規形)が提唱され「カラムに複数値を持たせてはいけない」という原則が確立
  • 1996年 — PostgreSQL 6.0 が配列型をサポート。「正規化の原則を部分的に崩す実用的な機能」として実装
  • 2000年代 — タグ機能・多対多関係を配列で持つパターンがWebサービスで広まる(いわゆる「タグ付けのアンチパターン」論争が起きる)
  • 2012年頃 — HStore(PostgreSQL)やJSONBの登場で「柔軟な複数値保存」の選択肢が増え、配列型の使いどころが整理されてきた
  • 現在 — PostgreSQLユーザーを中心に、シンプルな複数値保存では配列型、複雑な構造にはJSONBを使い分けるアプローチが定着

配列型・別テーブル・JSONの比較

「記事のタグ」を持つ3つのアプローチ ① 配列型(PostgreSQL) articles id | title | tags[] 1 | 記事A | {Python,AI} テーブル1つ・シンプル 正規化の原則から外れる PostgreSQL専用 ② 別テーブル(正規化) articles id | title article_tags article_id | tag_name DB標準・どのDBでも動く 検索・集計に強い テーブルが増える ③ JSON型 articles id | title | tags(JSON) 1 | 記事A | ["Python","AI"] 多くのDBで利用可能 柔軟な構造が持てる 検索が遅くなりやすい

関連する規格・RFC

規格・RFC番号内容
ISO/IEC 9075 (SQL:2003)SQL標準の配列型(ARRAY)の仕様
PostgreSQL公式ドキュメントhttps://www.postgresql.org/docs/current/arrays.html

関連用語

  • JSONカラム — 配列を含む柔軟な構造データを格納するもう一つの方法
  • テキスト型 — 配列要素として最もよく使われる型
  • 外部キー — 配列型の代わりに別テーブルを作る場合に使う参照整合性の仕組み
  • インデックス — PostgreSQLのGINインデックスで配列の内容を高速検索できる
  • 正規化 — 配列型を使うと崩れる可能性がある設計原則
  • 制約 — 配列カラムに設定できる制約の種類と限界
  • カラム — 配列型を設定するテーブルの列