Claude Codeでデータベース設計を相談・実装する
ER図からマイグレーションまでDB設計をAIに相談
データベース設計にClaude Codeを活用する理由
データベース設計は、アプリケーションの性能と保守性を左右する重要な工程です。テーブル構造、リレーション、インデックス、正規化の判断には経験と知識が必要ですが、Claude Codeに相談しながら設計を進めることで、経験の浅いエンジニアでも品質の高いDB設計が可能になります。
Claude Codeに相談できるDB設計の範囲
- ER図・テーブル設計: エンティティの抽出、リレーション定義、正規化
- スキーマ定義: SQL DDL、ORMスキーマの生成
- マイグレーション: スキーマ変更のマイグレーションファイル作成
- シードデータ: テスト用の初期データ生成
- クエリ最適化: 遅いクエリの分析と改善
- インデックス戦略: 適切なインデックスの設計
ステップ1: 要件からエンティティを抽出する
まず、アプリケーションの要件をClaude Codeに伝えて、必要なエンティティ(テーブル)を洗い出してもらいます。
エンティティ抽出の会話例
あなた: ECサイトのデータベースを設計したいです。要件は以下の通りです。
- 会員登録・ログイン
- 商品カテゴリ(階層構造あり)
- 商品(複数画像、バリエーション対応)
- カート機能
- 注文・決済
- レビュー(星評価+テキスト)
- お気に入り
テーブル一覧とリレーションを提案してください。
Claude Code: ECサイトの要件を分析し、以下のエンティティを提案します。
## エンティティ一覧
| テーブル名 | 説明 | 主なリレーション |
|-----------|------|----------------|
| users | 会員情報 | → orders, reviews, favorites, cart_items |
| categories | 商品カテゴリ | → categories(自己参照), products |
| products | 商品 | → categories, product_images, product_variants |
| product_images | 商品画像 | → products |
| product_variants | 商品バリエーション | → products |
| cart_items | カート内商品 | → users, product_variants |
| orders | 注文 | → users, order_items |
| order_items | 注文明細 | → orders, product_variants |
| reviews | レビュー | → users, products |
| favorites | お気に入り | → users, products |
## リレーション図(テキスト版)
users 1──N orders
users 1──N reviews
users 1──N favorites
users 1──N cart_items
categories 1──N categories(親子)
categories 1──N products
products 1──N product_images
products 1──N product_variants
products 1──N reviews
orders 1──N order_items
product_variants 1──N order_items
product_variants 1──N cart_items
ステップ2: スキーマの詳細設計
エンティティが決まったら、各テーブルのカラム定義を詳細に設計します。データ型、制約、デフォルト値なども含めてClaude Codeに生成してもらいましょう。
SQLスキーマの生成
あなた: 上記のエンティティに基づいて、PostgreSQL用のCREATE TABLE文を
生成してください。以下の点を考慮してください。
- UUIDを主キーに使用
- created_at / updated_at を全テーブルに追加
- 適切なINDEXを含める
- 外部キー制約を設定
Claude Code: PostgreSQL用のスキーマを生成します。
-- カテゴリ(自己参照で階層構造を実現)
CREATE TABLE categories (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
parent_id UUID REFERENCES categories(id) ON DELETE SET NULL,
name VARCHAR(100) NOT NULL,
slug VARCHAR(100) NOT NULL UNIQUE,
description TEXT,
sort_order INTEGER DEFAULT 0,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_categories_parent ON categories(parent_id);
CREATE INDEX idx_categories_slug ON categories(slug);
-- 商品
CREATE TABLE products (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
category_id UUID NOT NULL REFERENCES categories(id),
name VARCHAR(200) NOT NULL,
slug VARCHAR(200) NOT NULL UNIQUE,
description TEXT,
base_price DECIMAL(10,2) NOT NULL CHECK (base_price >= 0),
is_published BOOLEAN DEFAULT false,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_products_category ON products(category_id);
CREATE INDEX idx_products_published ON products(is_published)
WHERE is_published = true;
-- 商品バリエーション
CREATE TABLE product_variants (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
product_id UUID NOT NULL REFERENCES products(id) ON DELETE CASCADE,
sku VARCHAR(50) NOT NULL UNIQUE,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL CHECK (price >= 0),
stock_quantity INTEGER NOT NULL DEFAULT 0 CHECK (stock_quantity >= 0),
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_variants_product ON product_variants(product_id);
CREATE INDEX idx_variants_sku ON product_variants(sku);
ステップ3: マイグレーションの作成
本番環境で運用を始めた後にスキーマを変更する場合、マイグレーションファイルが必要です。Claude Codeにスキーマ変更の要件を伝えて、安全なマイグレーションを生成してもらいましょう。
マイグレーション生成の依頼
あなた: productsテーブルに以下の変更を加えるマイグレーションを作成してください。
- tagsカラム(TEXT配列)を追加
- weight_gramカラム(INTEGER)を追加
- descriptionをTEXTからJSONBに変更(多言語対応のため)
ダウンタイムなしで実行できるようにしてください。
Claude Code: 安全なマイグレーションを生成します。
ダウンタイムを避けるため、段階的に実行する構成にします。
-- Migration: 20240315_add_product_fields.sql
-- Step 1: 新しいカラムを追加(NULLABLEで追加→ロックなし)
ALTER TABLE products ADD COLUMN tags TEXT[] DEFAULT '{}';
ALTER TABLE products ADD COLUMN weight_gram INTEGER;
-- Step 2: 多言語対応のためdescriptionをJSONBに移行
-- 既存データを保持するため、新カラムを追加してデータを移行
ALTER TABLE products ADD COLUMN description_jsonb JSONB;
-- Step 3: 既存データの移行
UPDATE products SET description_jsonb = jsonb_build_object(
'ja', COALESCE(description, '')
) WHERE description_jsonb IS NULL;
-- Step 4: カラム名変更(アプリケーション側の切り替え後に実行)
-- ALTER TABLE products DROP COLUMN description;
-- ALTER TABLE products RENAME COLUMN description_jsonb TO description;
-- インデックスの追加
CREATE INDEX idx_products_tags ON products USING GIN(tags);
-- ロールバック用
-- ALTER TABLE products DROP COLUMN tags;
-- ALTER TABLE products DROP COLUMN weight_gram;
-- ALTER TABLE products DROP COLUMN description_jsonb;
ステップ4: クエリ最適化の相談
遅いクエリをClaude Codeに見せて、最適化してもらうことができます。EXPLAINの結果も一緒に渡すと、より正確な改善案が得られます。
クエリ最適化の依頼テンプレート
あなた: 以下のクエリが遅いです(実行時間: 3.2秒)。
最適化してください。
[遅いクエリのSQL]
EXPLAIN ANALYZEの結果:
[EXPLAINの出力]
テーブル定義:
[CREATE TABLE文]
データ量:
- productsテーブル: 約50万件
- ordersテーブル: 約200万件
ステップ5: シードデータの生成
開発やテストに必要な初期データもClaude Codeに生成してもらえます。リアルに近いダミーデータを大量に生成するスクリプトも作成可能です。
シードデータ生成の依頼
あなた: 開発用のシードデータを作成してください。
- カテゴリ: 3階層、合計20件
- 商品: 各カテゴリに5-10件、リアルな日本語商品名
- ユーザー: テスト用5名
- レビュー: 各商品に0-5件、自然な日本語レビュー文
Claude Code: リアルなシードデータを生成します。
-- カテゴリ(3階層)
INSERT INTO categories (id, parent_id, name, slug) VALUES
('cat-01', NULL, 'ファッション', 'fashion'),
('cat-02', NULL, '家電・PC', 'electronics'),
('cat-03', NULL, '食品・飲料', 'food'),
('cat-04', 'cat-01', 'メンズ', 'fashion-mens'),
('cat-05', 'cat-01', 'レディース', 'fashion-womens'),
('cat-06', 'cat-04', 'Tシャツ', 'fashion-mens-tshirts'),
('cat-07', 'cat-04', 'パンツ', 'fashion-mens-pants'),
-- ... 省略
-- 商品(リアルな日本語商品名)
INSERT INTO products (id, category_id, name, slug, base_price) VALUES
('prod-001', 'cat-06', 'オーガニックコットン クルーネックTシャツ',
'organic-cotton-crew-neck', 3980),
('prod-002', 'cat-06', 'ドライメッシュ スポーツTシャツ',
'dry-mesh-sports-tee', 2480),
-- ... 省略
SQLとNoSQLの選択相談
プロジェクトの特性に応じて、RDB(PostgreSQL/MySQL)とNoSQL(MongoDB/DynamoDB)のどちらを選ぶべきかもClaude Codeに相談できます。
| 判断基準 | RDB向き | NoSQL向き |
|---|---|---|
| データ構造 | 構造化されたデータ、明確なスキーマ | 半構造化、スキーマが頻繁に変わる |
| リレーション | 複雑なリレーションが多い | リレーションが少ない、埋め込みで十分 |
| 一貫性 | トランザクション必須(金融、EC等) | 結果整合性で十分 |
| スケール | 垂直スケーリング中心 | 水平スケーリング必須 |
| クエリ | 複雑な検索・集計が必要 | キーアクセス中心 |
プロのヒント: Claude Codeにデータベース設計を相談する際は、「なぜその設計にしたのか」を説明してもらうよう依頼しましょう。理由を理解することで、将来の設計変更時にも適切な判断ができるようになります。また、正規化のレベル(第1〜第3正規形)についても意識的に議論すると、より堅牢な設計が得られます。
DB設計ワークフローのまとめ
- エンティティ抽出: 要件からテーブル候補を洗い出し、リレーションを明確にする
- スキーマ設計: カラム定義、制約、インデックスを含むDDLを生成する
- レビューと改善: 正規化の観点で設計を見直し、冗長性を排除する
- マイグレーション: スキーマ変更は必ずマイグレーションファイルで管理する
- シードデータ: 開発・テスト用のリアルなダミーデータを生成する
- クエリ最適化: 本番運用後のパフォーマンスチューニングにもClaude Codeを活用する