# データベース標準

[目的: スキーマ設計、クエリ、マイグレーション、整合性の指針を示す]

## 基本方針
- まずドメインをモデリングする。正しさを確保してから最適化する
- 明示的な制約を優先する。不変条件はデータベースに強制させる
- 必要なものだけをクエリする。最適化の前に計測する

## 命名と型
- テーブル: `snake_case`、複数形（`users`、`order_items`）
- カラム: `snake_case`（`created_at`、`user_id`）
- 外部キー: `{table}.id` を参照する `{table}_id`
- 型: タイムゾーン対応のタイムスタンプ、堅牢な ID、正確な金額型

## リレーション
- 1:N: 子側に外部キー
- N:N: 複合キーを持つ中間テーブル
- 1:1: 外部キー + UNIQUE

## マイグレーション
- マイグレーションは不変（immutable）にする。常にロールバックを用意する
- 小さく焦点を絞ったステップにする。まず非本番でテストする
- 命名: `{seq}_{action}_{object}`（例: `002_add_email_index`）

## クエリのパターン
- 単純な CRUD と安全性には ORM、複雑／性能が重要な箇所には生 SQL を使う
- N+1 を避ける（eager load／バッチ化）。大きな結果セットはページネーションする
- 外部キーや、頻繁にフィルタ／ソートするカラムにインデックスを張る

## 接続とトランザクション
- コネクションプールを使う（サイズ／タイムアウトはワークロードに応じて）
- 作業単位（unit of work）ごとに1接続。速やかにクローズ／返却する
- 複数ステップの変更はトランザクションで包む

## データ整合性
- NOT NULL／UNIQUE／CHECK／外部キー制約を使う
- 適切な場合は DB 側で検証する（多層防御）
- 一貫した導出値には生成カラム（generated column）を優先する

## バックアップとリカバリ
- 保持期間付きの定期バックアップ、リストアのテスト
- RPO／RTO の目標を文書化する。バックアップジョブを監視する

---
_パターンと意思決定に焦点を当てること。環境固有の設定は記載しない。_
