「AIが生成したマイグレーション、なんか動いてるからヨシ!」
そんな経験、ありませんか?😅
今、海外の開発者コミュニティで「GitHub CopilotはDB設計の考え方を(悪い方向に)書き換えてしまっているかもしれない」という議論が注目を集めています。
開発スピードは上がる。でもその裏で、じわじわと技術的負債が積み上がっていく…。今回はこのトレンドを深掘りして、日本の開発現場でもすぐに活かせる視点を紹介します!
🤖 何が問題になっているの?

具体的なシナリオをイメージしてみてください。
47テーブル・複雑な外部キー・ドキュメントなし。そんなRailsのスキーマをCopilotに貼り付けて「マイグレーション生成して」と頼む。生成されたコードは一見きれいに見える。でも3週間後、循環依存(circular dependency)が原因でチェックアウト機能が落ちる……というわけです。
つまり問題の本質はこうです。
- ✅ Copilotは「動くコード」を生成するのは得意
- ❌ でも「設計の意図」や「ドメイン知識」は理解できない
- ❌ スキーマ全体の整合性・長期的な影響まで考慮しない
「AIが出したから大丈夫でしょ」という思考停止が、一番危ないんですよね。
⚠️ 特に注意したいDB設計のアンチパターン
Copilotが生みやすい、代表的な落とし穴をまとめました。
① 循環依存(Circular Dependency)
テーブルAがBを参照、BがCを参照、CがAを参照…という状態です。一見動いても、削除や更新のタイミングで地獄を見ます😱
② とりあえずNULL許容
AIは「エラーを避ける」方向に寄るため、カラムをNULLABLEにしがちです。でもビジネスロジック的にNULLを許してはいけないケースも多い。
③ 命名規則の混在
既存スキーマの命名ゆらぎをAIがそのまま踏襲して増殖させます。
🛡️ じゃあ、どう使えばいいの?
CopilotをDB設計で使うなら、「丸投げ」ではなく「壁打ち相手」として使うのがポイントです。以下のようなアプローチが効果的ですよ。
-- ❌ Copilotに任せきりな例(危険)
-- スキーマ全体を貼り付けて「最適なマイグレーション生成して」
-- ✅ 意図を明示した安全な使い方
-- 以下の制約を必ず守ってマイグレーションを生成してください:
-- 1. ordersテーブルとusersテーブルに循環参照を作らない
-- 2. order_statusカラムはNOT NULL制約を必ず付ける
-- 3. 命名規則はsnake_caseに統一する
ALTER TABLE orders
ADD COLUMN order_status VARCHAR(50) NOT NULL DEFAULT 'pending',
ADD CONSTRAINT fk_orders_users
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE RESTRICT; -- 削除時の挙動も明示的に指定!
ポイントをまとめるとこんな感じです👇
- 📌 制約・命名規則・削除時の挙動をプロンプトに明示する
- 📌 生成されたマイグレーションは必ずERダイアグラムで可視化して確認する
- 📌 「なぜこの設計にしたか」をコメントで残す習慣をつける
まとめ
GitHub CopilotはDB設計においても強力なツールですが、「設計の意図」を理解するのはあくまで人間の役割です。AIに思考を委ねすぎると、見えないところで技術的負債が積み上がっていきます。
「むずかしそう」ではなく「ちゃんと使いこなせる開発者」を目指して、ぜひ今日から意識してみてください!💪
DB設計やSQLまわりのトピックも今後どんどん取り上げていく予定なので、ぜひチェックしてみてくださいね😊





