PostgreSQL
概要
PostgreSQLは成熟したオープンソースのリレーショナルデータベースで、型付きのテーブルにデータを保存し、SQL、トランザクション、データ整合性を手厚くサポートします。正確性、拡張性、そしてJSONB、全文検索、ウィンドウ関数といった豊富な機能で知られています。信頼できる構造化データを必要とする、ほとんどのアプリケーションバックエンドのデフォルトの選択肢です。
強み
- ACIDトランザクションとデフォルトでの強い一貫性。
- 強力な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;