前回の記事では、ローカルLLM対応のAI Overview診断ツールに、SQLite + Prismaを使って診断履歴を保存する機能を追加しました。
SQLiteは、ローカル環境で使いやすい軽量データベースです。
一方で、今後この診断ツールを複数端末で使いたい、Web上に公開したい、ログイン機能を追加したい、SaaS化を考えたい場合は、ローカルファイルのSQLiteだけでは限界があります。
そこで今回は、DB保存先をSQLiteからSupabaseに変更することとしました。
Supabaseを使うと、診断履歴をローカルPC内の dev.db ではなく、クラウド上のPostgreSQLデータベースに保存できます。
PostgreSQL(ポストグレスキューエル):
オープンソースのリレーショナルデータベース管理システム(RDBMS)で、データの整合性を守る信頼性の高さと、多様なデータ型を扱える柔軟性を兼ね備えているのが大きな特徴です。
Supabaseとは?
Supabaseは、PostgreSQLをベースにしたバックエンドサービスです。
簡単にいうと、アプリ開発に必要な次のような機能をまとめて使えるサービスです。
| 機能 | 内容 |
|---|---|
| Database | PostgreSQLデータベースを使える |
| Auth | ログイン・ユーザー認証を追加できる |
| Storage | 画像やファイルを保存できる |
| Edge Functions | サーバー側の処理を実行できる |
| Realtime | データ変更をリアルタイムに反映できる |
今回使うのは、この中の Database 機能です。
つまり、Supabaseを使うと、ローカルのSQLiteファイルではなく、クラウド上のPostgreSQLに診断履歴を保存できます。

Supabaseへの移行の流れ
Supabase SDKを使わず、Next.jsのAPI RouteからSupabase REST APIに直接リクエストしています。
AI Overview診断ツール
↓
Next.js API Route
↓
Supabase REST API
↓
Supabase PostgreSQL
Supabase側のテーブル
Supabaseには、次のテーブルを作成しました。
diagnosis_histories
作成したカラムは以下の通りです。
id
user_id
created_at
input_preview
source_url
total_score
summary

user_id は、将来ログイン機能を追加するために用意しています。
今回はログイン機能を実装しないため、user_id は NULL のまま保存されます。
Supabase側のテーブル作成
- Supabase Dashboardを開く
https://supabase.com/dashboard - 対象プロジェクトを選択
- 左メニューの SQL Editor を開く
- New query を押す
- 以下のSQLを貼り付けて実行
create table if not exists diagnosis_histories (
id bigint generated by default as identity primary key,
user_id uuid,
created_at timestamptz not null default now(),
input_preview text not null,
source_url text,
total_score integer not null check (total_score >= 0 and total_score <= 100),
summary text not null
);
comment on column diagnosis_histories.user_id is
'ログイン機能を追加する将来のSaaS化に備えた予約カラム。MVPではnullのまま保存する。';
- 左メニューの Table Editor を開く
- diagnosis_histories テーブルが作成されていることを確認

.env.local の設定
NEXT_PUBLIC_SUPABASE_URL=https://xxxx.supabase.co
SUPABASE_SERVICE_ROLE_KEY=sb_secret_xxxxxSUPABASE_SERVICE_ROLE_KEY は公開禁止なので、NEXT_PUBLIC_ はつけません。
Supabaseへの履歴書き出し処理
診断が完了すると、以下の流れで、画面側から履歴保存APIへ診断結果を送ります。
app/page.tsx
↓
POST /api/history
↓
app/api/history/route.ts
↓
lib/supabaseAdmin.ts
↓
Supabase REST API
↓
diagnosis_histories
SaaS化に備えた設計
ログイン機能は実装しませんが、将来SaaS化しやすいように、user_id カラムだけ先に用意しました。
将来的には次のように拡張できます。
Supabase Auth
↓
ログインユーザーIDを user_id に保存
↓
ユーザーごとの診断履歴を表示
↓
RLSで自分の履歴だけ見えるように制御
今は自分用MVPなので、RLSは有効にしていません。
RLS(Row Level Security):
行レベルセキュリティのことで、データベースの行(row)ごとにアクセス制限をかける仕組みです。
SupabaseはデフォルトでRLSが無効で、RLSを有効にしないと全ユーザーが全データを見れてしまいます。 フロントエンドから直接DBにアクセスする構成では必須のセキュリティ設定ですす。
現在の保存処理
現在、診断が完了すると次の流れで履歴が保存されます。
- ユーザーがURLまたは本文を入力
- 診断を実行
- ルールベース診断とOllama診断を実行
- 診断結果を画面に表示
- Next.js API Routeへ履歴保存リクエスト
- Supabase REST API経由でPostgreSQLへ保存
- 画面下部の診断履歴を再取得
現在の画面表示
画面下部では、Supabaseに保存された診断データを表示しています。
タブは診断履歴と高スコアサイト5選の2つです。

診断履歴では、最新5件を表示します。
高スコアサイト5選では、URL診断された履歴の中からスコア上位5件を表示します。
SQLiteとの違い
- SQLiteの場合:
ローカルPC内のファイルに保存 - Supabaseの場合:
クラウド上のPostgreSQLに保存
そのため、Supabaseに変更したことで次のメリットがあります。
- 履歴がクラウドDBに保存される
- Supabaseダッシュボードから確認できる
- 将来ログイン機能を追加しやすい
- SaaS化しやすい
- 他の端末や本番環境でも同じDBを使える
現在の制限
以下はまだ未実装です。
- ログイン機能
- ユーザー別履歴
- RLS
- 課金機能
- 管理画面
ただし、user_id カラムを用意しているため、将来追加しやすい構成になっています。
まとめ
Supabaseは、PostgreSQLをベースにしたクラウド型のバックエンドサービスです。
SQLiteはローカルMVPに向いていますが、Supabaseに変更すると、診断履歴をクラウドDBに保存できるようになります。
これにより、複数端末での利用、Web公開、ログイン機能、ユーザー別の履歴管理などに発展させやすくなります。
関連記事


