配列型 はいれつがた
配列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 関数 + テキスト |
| Oracle | VARRAY・ネスト表(複雑) | ほぼ別テーブルで代替 |
-- 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の比較
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| ISO/IEC 9075 (SQL:2003) | SQL標準の配列型(ARRAY)の仕様 |
| PostgreSQL公式ドキュメント | https://www.postgresql.org/docs/current/arrays.html |