mcpField
P
postgresql-best-practices

postgresql-best-practices

github.com/wimolivierデータ・データベース5172 回インストール27 週間前に更新
リポジトリ

postgresql-best-practices について

PostgreSQL 18+ の開発者向け実践リファレンスで、データベース設計、SQL 規約、移行、テスト、性能、運用を扱います。スキーマ分離、API 関数、セキュリティ指針を軸に、参照資料と実行可能な移行スクリプトを収録しています。

主な機能

  1. 01data、private、api のスキーマ分離パターンを提示
  2. 02関数、プロシージャ、トリガー、命名規則を解説
  3. 03移行の資料と実行可能なスクリプトを収録
  4. 04テスト、性能、セキュリティ、データ処理パターンを網羅
  5. 05PostgreSQL 18+ の機能とアンチパターンを掲載

活用シーン

  1. 01アプリケーションの DB アクセス用 API 層を設計
  2. 02バージョン管理された DB 移行手順を整備
  3. 03クエリ性能とインデックス戦略を確認
  4. 04テナント分離、監査、ベクトル検索を実装

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/wimolivier/postgresql-best-practices --skill postgresql-best-practices

インストール後、Claude Code で/postgresql-best-practicesを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

README.md
CLAUDE.md
references/
checklists-troubleshooting.md
anti-patterns.md
audit-logging.md
bulk-operations.md
backup-recovery.md
cicd-integration.md
analytical-queries.md
coding-standards-trivadis.md
data-types.md
indexes-constraints.md
full-text-search.md
encryption.md
event-sourcing.md
data-warehousing-medallion.md
migrations.md
oracle-migration-guide.md
jsonb-patterns.md
monitoring-observability.md
plpgsql-table-api.md
partitioning.md
performance-tuning.md
queue-patterns.md
postgis-patterns.md
replication-ha.md
quick-reference.md
schema-naming.md
row-level-security.md
schema-architecture.md

詳細

PostgreSQL 高度なベストプラクティス(PostgreSQL 18 以降)

アーキテクチャの概要

                        ┌─── PostgreSQL Database ──────────────────────────────┐
                        │                                                      │
                        │  ┌──────────────────┐    ┌───────────────────────┐   │
                        │  │   api schema      │    │   private schema      │   │
  ┌─────────────┐       │  │──────────────────│    │───────────────────────│   │
  │ Application │─EXECUTE─▶│ get_customer()   │───▶│ set_updated_at()     │   │
  └─────────────┘       │  │ insert_order()   │    │ hash_password()      │   │
        │               │  └────────┬─────────┘    └──────────┬────────────┘   │
        │               │           │                         │                │
        │               │           │ SECURITY DEFINER        │ triggers       │
        │               │           ▼                         ▼                │
        │               │  ┌──────────────────────────────────────────────┐    │
        │               │  │              data schema                     │    │
     BLOCKED            │  │──────────────────────────────────────────────│    │
        │               │  │  customers    orders    ...                  │    │
        └ ─ ─ ─ ✕       │  └──────────────────────────────────────────────┘    │
                        │                                                      │
                        └──────────────────────────────────────────────────────┘

スキルの内容

🚀 はじめに(まずお読みください)
ドキュメント目的
quick-reference.mdすぐに確認できるリファレンス - 1 ページのチートシート(印刷してお使いください!)
schema-architecture.mdまずはこちら - スキーマ分離パターン(data/private/api)
coding-standards-trivadis.mdコーディング規約と命名規則(l_、g_、co_)
📚 コアリファレンス(日常的に使用)
ドキュメント目的
plpgsql-table-api.mdテーブル API 関数、プロシージャ、トリガー
schema-naming.mdすべてのオブジェクトの命名規則
data-types.mdデータ型の選択(UUIDv7、text、timestamptz)
indexes-constraints.mdインデックスの種類、戦略、制約
migrations.mdネイティブマイグレーションシステムのドキュメント
anti-patterns.md避けるべきよくある間違い
checklists-troubleshooting.mdプロジェクトのチェックリストと問題の解決方法
🔧 高度なトピック(必要に応じて)
ドキュメント目的
testing-patterns.mdpgTAP によるユニットテスト、テストファクトリー
performance-tuning.mdEXPLAIN ANALYZE、クエリ最適化、JIT
row-level-security.mdRLS パターン、マルチテナント分離
jsonb-patterns.mdJSONB のインデックス作成、クエリ、検証
audit-logging.md汎用監査トリガー、変更の追跡
bulk-operations.mdCOPY、バッチ挿入、アップサート
session-management.mdセッション変数、コネクションプーリング
transaction-patterns.md分離レベル、ロック、デッドロックの防止
full-text-search.mdtsvector、tsquery、ランキング、多言語対応
partitioning.mdレンジ、リスト、ハッシュによるパーティショニング戦略
window-functions.mdフレーム、ランキング、累積計算
time-series.md時系列データのパターン、BRIN インデックス
event-sourcing.mdイベントストア、プロジェクション、CQRS
queue-patterns.mdジョブキュー、SKIP LOCKED、LISTEN/NOTIFY
encryption.mdpgcrypto、列の暗号化、TLS
vector-search.mdpgvector、埋め込み、類似検索
postgis-patterns.md空間データ、地理クエリ
🚀 DevOps とマイグレーション
ドキュメント目的
oracle-migration-guide.mdPL/SQL から PL/pgSQL への変換
cicd-integration.mdGitHub Actions、GitLab CI、Docker
monitoring-observability.mdpg_stat_statements、メトリクス、アラート
backup-recovery.mdpg_dump、pg_basebackup、PITR
replication-ha.mdストリーミング/論理レプリケーション、フェイルオーバー
📊 データウェアハウジング
ドキュメント目的
data-warehousing-medallion.mdメダリオンアーキテクチャ - Bronze/Silver/Gold、データリネージ、ETL
analytical-queries.md分析クエリのパターン、OLAP の最適化、GROUPING SETS
実行可能なスクリプト
スクリプト用途
001_install_migration_system.sqlマイグレーションシステムをインストールします(コア関数)
002_migration_runner_helpers.sqlヘルパープロシージャ(run_versioned、run_repeatable)
003_example_migrations.sqlマイグレーションパターンの例
999_uninstall_migration_system.sqlマイグレーションシステムを完全に削除します

コアアーキテクチャ

スキーマ分離パターン
Application → api schema → data schema
                ↓
            private schema (triggers, helpers)
スキーマ内容アクセス用途
dataテーブル、インデックスなしデータストレージ
privateトリガー、ヘルパーなし内部ロジック
api関数、プロシージャアプリケーション外部インターフェース
app_audit監査テーブル管理者変更追跡
app_migrationマイグレーション追跡管理者スキーマのバージョン管理
セキュリティモデル

すべてのapi関数には、次の設定が必須です。

SECURITY DEFINER
SET search_path = data, private, pg_temp

クイックリファレンス

テーブル作成パターン
CREATE TABLE data.{table_name} (
    id              uuid PRIMARY KEY DEFAULT uuidv7(),
    -- columns...
    created_at      timestamptz NOT NULL DEFAULT now(),
    updated_at      timestamptz NOT NULL DEFAULT now()
);

CREATE TRIGGER {table}_bu_updated_trg
    BEFORE UPDATE ON data.{table_name}
    FOR EACH ROW EXECUTE FUNCTION private.set_updated_at();
API関数パターン
CREATE FUNCTION api.{action}_{entity}(in_param type)
RETURNS TABLE (col1 type, col2 type)
LANGUAGE sql STABLE
SECURITY DEFINER
SET search_path = data, private, pg_temp
AS $$
    SELECT col1, col2 FROM data.{table} WHERE ...;
$$;
APIプロシージャパターン
CREATE PROCEDURE api.{action}_{entity}(
    in_param type,
    INOUT io_id uuid DEFAULT NULL
)
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = data, private, pg_temp
AS $$
BEGIN
    INSERT INTO data.{table} (...) VALUES (...) RETURNING id INTO io_id;
END;
$$;
マイグレーションパターン
SELECT app_migration.acquire_lock();

CALL app_migration.run_versioned(
    in_version := '001',
    in_description := 'Description',
    in_sql := $mig$ ... $mig$,
    in_rollback_sql := '...'
);

SELECT app_migration.release_lock();

命名規則

Trivadisスタイルの変数プレフィックス
プレフィックス型例
l_ローカル変数l_customer_count
g_セッション/グローバル変数g_current_user_id
co_定数co_max_retries
in_INパラメーターin_customer_id
out_OUTパラメーター(関数のみ)out_total
io_INOUTパラメーター(プロシージャ)io_id
c_カーソルc_active_orders
r_レコードr_customer
t_配列/テーブルt_order_ids
e_例外e_not_found

Note:PostgreSQLのプロシージャがサポートするのはINOUTパラメーターのみで、OUTはサポートされません。プロシージャのすべての出力パラメーターには、io_プレフィックスを使用してください。

データベースオブジェクト
オブジェクトパターン例
テーブルsnake_case、複数形orders、order_items
列snake_casecustomer_id、created_at
主キーidid
外部キー{table_singular}_idcustomer_id
インデックス{table}_{cols}_idxorders_customer_id_idx
一意制約{table}_{cols}_keyusers_email_key
関数{action}_{entity}get_customer、select_orders
プロシージャ{action}_{entity}insert_order、update_status
トリガー{table}_{timing}{event}_trgorders_bu_trg

データ型の推奨事項

使用する型代わりに使用しない型
textchar(n)、varchar(n)
numeric(p,s)money、float
timestamptztimestamp
booleanintegerフラグ
uuidv7()serial、uuid_generate_v4()
GENERATED ALWAYS AS IDENTITYserial、bigserial
jsonbjson、EAVパターン

重大なアンチパターン

  1. ❌ アプリケーションからテーブルに直接アクセスする
  2. ❌ RETURNS SETOF table(すべての列を公開します)
  3. ❌ SECURITY DEFINERでSET search_pathを設定しない
  4. ❌ タイムゾーンなしのtimestamp
  5. ❌ サブクエリでNOT INを使う(NOT EXISTSを使用してください)
  6. ❌ タイムスタンプでBETWEENを使う(>= AND <を使用してください)
  7. ❌ 外部キーにインデックスがない
  8. ❌ serial/bigserialを使う(IDENTITYを使用してください)
  9. ❌ 任意の上限を設けたvarchar(n)を使う(textを使用してください)
  10. ❌ NOWAIT/SKIP LOCKEDなしでSELECT FOR UPDATEを使う

PostgreSQL 18以降の機能

機能用途
uuidv7()id uuid DEFAULT uuidv7() - 時刻順に並ぶUUID
仮想生成列col type GENERATED ALWAYS AS (expr) - クエリ実行時に計算
RETURNING内のOLD/NEWUPDATE ... RETURNING OLD.col, NEW.col
時間的制約PRIMARY KEY (id) WITHOUT OVERLAPS
NOT VALID制約テーブル全体をスキャンせずに制約を追加

ファイル構成

db/
├── migrations/
│   ├── V001__create_schemas.sql
│   ├── V002__create_tables.sql
│   └── repeatable/
│       ├── R__private_triggers.sql
│       └── R__api_functions.sql
├── schemas/
│   ├── data/           # Table definitions
│   ├── private/        # Internal functions
│   └── api/            # External interface
└── seeds/              # Reference data

コメント