AgentSkillsCN

db-design

以 RDBMS + ORM 为前提的数据库与数据模型设计指南(不依赖于任何工具)。涵盖数据库设计工作流、表设计原则、规范化与非规范化判断、数据类型设计、索引策略、关系设计以及迁移管理等核心内容。适用于表设计、数据模型设计以及迁移操作等场景。

SKILL.md
--- frontmatter
name: db-design
description: RDBMS + ORM 前提のデータベース・スキーマ設計ガイド(ツール非依存)。DB設計ワークフロー、テーブル設計原則、正規化/非正規化判断、型設計、インデックス戦略、リレーション設計、マイグレーション管理をカバー。テーブル設計、データモデル設計、マイグレーション時に使用。

データベース・スキーマ設計ガイド

RDBMS + ORM 前提のフレームワーク非依存ガイド。

DB 設計ワークフロー

code
1. 要件からエンティティを抽出
2. 関連(リレーション)を定義
3. 属性と制約を決定
4. 正規化 (3NF を目標)
5. 非正規化の検討(パフォーマンス要件に応じて)
6. インデックス設計
7. マイグレーション作成

テーブル設計の原則

命名規則

code
テーブル名: 複数形・スネークケース (users, order_items)
カラム名:   スネークケース (created_at, user_id)
外部キー:   {参照テーブル単数}_id (user_id, order_id)
真偽値:     is_, has_, can_ プレフィックス (is_active, has_permission)

共通カラム

code
id          : 主キー(UUID or 連番)
created_at  : 作成日時(NOT NULL)
updated_at  : 更新日時(NOT NULL)
deleted_at  : 論理削除日時(NULL 許容、必要な場合のみ)

データ型選択の原則

用途推奨避ける
主キーUUID / ULID / auto increment文字列ID
日時timestamp with timezone文字列
金額decimal / integer (最小単位)float
状態enum / varchar + CHECKinteger
フラグbooleaninteger (0/1)
JSONjsonb (対応DBの場合)text

正規化と非正規化

正規化 (3NF を基本目標)

レベル排除するもの
1NF繰り返しグループカンマ区切りの値 → 別テーブル
2NF部分関数従属複合キーの一部だけで決まる属性
3NF推移関数従属非キー属性が別の非キー属性に依存

非正規化の判断基準

場面手法トレードオフ
読み取り頻度が高い集計値事前計算カラム追加更新時の整合性コスト
頻繁な JOIN の回避冗長カラム追加ストレージ + 更新コスト
履歴データの保持スナップショットストレージ増
検索パフォーマンス非正規化ビュー同期コスト

原則: まず正規化し、計測に基づいて非正規化を検討

詳細: references/normalization.md

型設計

Branded Types(ID の混同防止)

code
UserId と OrderId を型レベルで区別
→ 引数の取り違えをコンパイル時に検出

Enum / Union Types(状態表現)

code
Status = 'pending' | 'approved' | 'rejected'

設計原則:
- 状態遷移を明確に定義
- 無効な遷移を型レベルで防ぐ
- DB には文字列 or enum 型で保存

Nullable 設計

code
NOT NULL をデフォルトとし、NULL は明確な理由がある場合のみ使用

NULL の正当な用途:
- 任意フィールド(ユーザーが未入力)
- 論理削除の deleted_at
- 将来の拡張フィールド

NULL を避けるべき場面:
- デフォルト値で代替可能な場合
- 空文字列/0/false で表現できる場合

インデックス戦略

インデックスを付けるべきカラム

対象理由
外部キーJOIN パフォーマンス
WHERE で頻繁に使うカラム検索パフォーマンス
ORDER BY で使うカラムソートパフォーマンス
UNIQUE 制約のあるカラム一意性保証

インデックスの種類

種類用途
単一カラム単純な条件検索
複合複数条件の AND 検索(左端一致原則)
部分条件付きインデックス(WHERE 句付き)
全文検索テキスト検索

避けるべきパターン

  • 低カーディナリティのカラムへの単独インデックス
  • 過剰なインデックス(書き込みパフォーマンス低下)
  • 使われないインデックスの放置

詳細: references/indexing-strategy.md

リレーション設計

関係実装
1:1外部キー + UNIQUE 制約users ↔ profiles
1:N子テーブルに外部キーusers → orders
N:M中間テーブルusers ↔ roles (user_roles)
自己参照同テーブルの外部キーcategories (parent_id)

中間テーブルの設計

code
中間テーブル名: {テーブルA}_{テーブルB} (アルファベット順)
  例: user_roles, order_items

カラム:
  - 各テーブルの外部キー
  - created_at
  - 追加属性(関係に紐づくデータ)

カスケード設計

アクション用途注意
CASCADE親削除時に子も削除意図しない大量削除に注意
SET NULL親削除時に NULL にNULL 許容カラムのみ
RESTRICT子が存在する場合は親削除を拒否デフォルト推奨

マイグレーション管理の原則

  • マイグレーションは常に前進(ロールバック用ではなく新規マイグレーションで修正)
  • 破壊的変更は段階的に行う(カラム追加 → データ移行 → 旧カラム削除)
  • 本番データに対する破壊的操作は慎重に(バックアップ必須)
  • マイグレーションファイルはバージョン管理に含める

レビューチェックリスト

  • テーブル名・カラム名が命名規則に従っている
  • 共通カラム(id, created_at, updated_at)が存在する
  • NOT NULL がデフォルトで、NULL には明確な理由がある
  • 外部キーにインデックスが設定されている
  • 3NF 以上に正規化されている(または非正規化の理由がある)
  • カスケード設計が適切(デフォルト RESTRICT)
  • 頻繁な検索条件にインデックスがある
  • マイグレーションが後方互換性を持つ

リファレンス