PostgreSQL
概要
PostgreSQLは成熟したオープンソースのリレーショナルデータベースで、型付きのテーブルにデータを保存し、(構造化問い合わせ言語)、トランザクション、データ整合性を手厚くサポートします。正確性、拡張性、そしてJSONB(Postgresのバイナリ形式の型)、全文検索、ウィンドウ関数といった豊富な機能で知られています。信頼できる構造化データを必要とする、ほとんどのアプリケーションバックエンドのデフォルトの選択肢です。
強み
- 全額が完全に振り込まれるか、完全に取り消されるか、どちらかになる銀行振込を思い浮かべてください。決して中途半端にはなりません。この「全か無か」の保証をACID(原子性・一貫性・独立性・永続性)トランザクションと呼び、Postgresはデフォルトで強い一貫性を提供します。
- 強力なSQL:結合、CTE(共通テーブル式)、ウィンドウ関数、集約。
JSONB、配列、範囲、カスタム型を含む柔軟な型。- PostGIS(地理空間)や
pgvector(埋め込み)のような拡張機能。 - 強力な制約、外部キー、チェックルールがデータの品質を強制する。
トレードオフ
- 垂直スケーリングは容易だが、水平方向のシャーディングには追加のツールが必要。
- モデルが進化するにつれてスキーマのマイグレーションが必要になる。
- ごく小さなプロジェクトでは、単一ファイルのデータベースよりも運用が重い。
- クライアントごとに接続するモデルのため、大規模では接続プーラー(PgBouncer)が必要になる。
使いどころ
リレーショナルデータ、トランザクション、レポーティングを必要とするほぼあらゆるアプリのデフォルトとして、PostgreSQLを選びましょう。SaaS(サービスとしてのソフトウェア)バックエンド、eコマース、分析、そして制約や結合の恩恵を受けるあらゆるものに向いています。
バイブコーディングとの相性
AIに指示を出す際は、エンティティとその関係を渡し、主キー、外部キー、NOT NULL制約、適切なインデックスを備えた正規化されたスキーマを生成させましょう。インジェクションを防ぐためにパラメータ化されたクエリ(文字列連結のSQLは使わない)を徹底させ、複数ステップの書き込みはトランザクションで包ませます。良いコツとして、AIには元に戻せるマイグレーションファイルも生成させましょう。追加する各インデックスについても説明させましょう。そうすれば、適用する前に読み書きのトレードオフを理解できます。
CREATE TABLE users (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
email TEXT NOT NULL UNIQUE,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE orders (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
total NUMERIC(10,2) NOT NULL CHECK (total >= 0),
status TEXT NOT NULL DEFAULT 'pending'
);
CREATE INDEX idx_orders_user_id ON orders(user_id);
-- パラメータ化されたクエリ(連結ではなくプレースホルダ)
SELECT o.id, o.total
FROM orders o
WHERE o.user_id = $1 AND o.status = $2;