~/VibeHandbook
$39

データベース

postgresql.org

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;