0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【個人開発】Supabase × Prisma × Next.js × ChatGPT による設計自動化ワークフロー

Posted at

Supabase × Prisma × Next.js × ChatGPT による設計自動化ワークフロー

はじめに

今回は、AIによる設計工程(DB設計/ER図/アーキテクチャ構築) を徹底的に解説します。

ChoreRights / IP Connect では、DB構造・ER図・API構造・RLS(Row Level Security)など、プロダクト設計の中核となる領域も、ほぼすべてChatGPTに任せています。

本記事ではその具体的プロセスを公開します。


なぜ設計工程をAIに任せるのか?

■ 抽象化と構造化が得意

ChatGPTは、要件から「一般的に最適なデータモデル」を導くのが非常に得意です。

■ 要件変更に強い

仕様変更があった場合、
「この差分を踏まえてER図とPrismaを再生成して」
と指示するだけで設計全体が同期されます。

■ 仕様の漏れが発生しにくい

正規化、関係性の整合性、ユースケースとの齟齬を自動で指摘してくれます。

■ 個人開発の速度が飛躍的に向上

設計工程は数時間〜数日必要ですが、AIを使うと 10〜20分で作成 できます。


ChatGPTでDB設計を自動生成する

例として、IP Connect の「音声IPデータ管理」のDB設計プロセスを紹介します。


Step 1:ユースケースを渡す

僕がChatGPTに渡した要件は非常にシンプルです:

音声クリエイターが自身の音声ファイルをアップロードし、
企業側が商用ライセンス契約を行えるようにしたい。
必要なテーブル設計とER図を生成して。

Step 2:AIがテーブル定義と関係性を生成

ChatGPTの出力(要約)は以下です。

主なテーブル:

  • users(クリエイター/企業共通)
  • voice_assets(音声IP)
  • applications(利用申請)
  • licenses(契約)
  • transactions(支払い)
  • organizations(企業)

関係性(例):

  • users 1 → N voice_assets
  • voice_assets 1 → N applications
  • applications 1 → 1 licenses
  • licenses 1 → N transactions

ChatGPTがER図まで生成する

ASCII形式のER図例:

users
  ├── id (PK)
  └── name

voice_assets
  ├── id (PK)
  ├── user_id (FK → users.id)
  └── file_path

applications
  ├── id (PK)
  ├── voice_id (FK → voice_assets.id)
  └── status

licenses
  ├── id (PK)
  ├── application_id (FK → applications.id)
  └── license_type

Mermaid形式版:

erDiagram
    USERS ||--o{ VOICE_ASSETS : owns
    VOICE_ASSETS ||--o{ APPLICATIONS : receives
    APPLICATIONS ||--|| LICENSES : grants

PrismaスキーマもAIが生成

プロンプト例:

上記ER図に基づき、Prisma schema を生成して。
PostgreSQLに最適化し、@relationやindexも含めて。

生成例(抜粋):

model VoiceAsset {
  id        String   @id @default(cuid())
  userId    String
  filePath  String
  createdAt DateTime @default(now())
  applications Application[]

  user User @relation(fields: [userId], references: [id])
}

model Application {
  id        String   @id @default(cuid())
  voiceId   String
  status    String
  license   License?

  voice VoiceAsset @relation(fields: [voiceId], references: [id])
}

model License {
  id            String   @id @default(cuid())
  applicationId String
  licenseType   String

  application Application @relation(fields: [applicationId], references: [id])
}

RLS(Row Level Security)もAIが生成

プロンプト例:

voice_assetsテーブルに対して、
・本人のみ閲覧可能
・企業ユーザーは申請中の音声のみ参照可能
となるRLSポリシーをSQLで書いて。

生成例:

create policy "Creators can view own assets"
on voice_assets for select
using (auth.uid() = user_id);

create policy "Organizations can view assets with pending applications"
on voice_assets for select
using (
  exists (
    select 1 from applications
    where applications.voice_id = voice_assets.id
    and applications.status = 'pending'
    and applications.organization_id = auth.uid()
  )
);

アーキテクチャ設計もAIが比較・提案

ChatGPTは以下のような比較軸で表を作り、最適解を出します。

比較軸例:

  • Next.js Route Handlers vs BFF構造
  • Serverless Functions
  • Supabase Edge Functions
  • Webストレージ連携のしやすさ
  • スループットとコスト
  • Web3連携時の利便性

AIの分析により、
「Next.js Route Handler + Supabase」構成が最適
という判断に至りました。


ADR(Architecture Decision Record)もAIが作る

設計の整合性を保つため、ADRもAIに作成させています。

生成例:

# ADR-0003: Use Next.js Route Handlers for API

## Context
The system requires low-latency APIs with simple integration
into Supabase authentication and RLS.

## Decision
Use Next.js Route Handlers instead of a dedicated BFF layer.

## Consequences
+ シンプルな構成
+ 学習コストが低い
- 重いAPI処理はEdge Functionへ移管が必要

構造化された設計文書が自動で揃い、仕様ズレが減ります。


まとめ

AIによるDB設計・ER図生成・アーキテクチャ選定は、
エンジニアリングの「最も認知負荷の高い領域」を大幅に効率化してくれます。

AI × 設計工程の強み:

  • 抽象要件 → ER図 → Prisma → Supabase が一気通貫
  • 要件変更も即時反映
  • セキュリティ(RLS)まで自動化
  • ADRで仕様ズレなし
  • 個人開発でもチーム開発の速度
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?