「Firebase?Supabase?どっち使えばいいの?」そんな悩み、ありませんか
新規プロジェクトでバックエンドを選ぶとき、「FirebaseとSupabase、名前は似てるけど何が違うの?」と迷った経験はありませんか?どちらもBaaS(Backend as a Service)として人気ですが、データベースの仕組み、認証方式、料金体系、開発体験が根本的に異なります。
この記事では、実際のコード例を交えながら、FirebaseとSupabaseの具体的な違いと使い分けの判断基準を解説します。「NoSQLとRDBMSって何が違う?」「どっちが学習コスト低い?」「料金はどっちが安い?」といった疑問を、実践的な視点で解消していきましょう。


FirebaseとSupabaseの基本的な違い
データベース構造の根本的な違い
最も大きな違いは、データベースの種類です:
- Firebase:Firestore(NoSQLドキュメントデータベース)
- Supabase:PostgreSQL(RDBMSリレーショナルデータベース)
この違いは、データの保存方法・クエリの書き方・スキーマ設計の考え方すべてに影響します。
Firebaseのデータ構造例
Firestoreはコレクション(フォルダのようなもの)とドキュメント(JSONデータ)で構成されます:
// Firestoreのデータ構造イメージ
users/
user123/
{
name: "田中太郎",
email: "tanaka@example.com",
posts: [
{ id: "post1", title: "初投稿" },
{ id: "post2", title: "二回目の投稿" }
]
}
// データ取得例
import { collection, getDocs } from 'firebase/firestore';
const querySnapshot = await getDocs(collection(db, 'users'));
querySnapshot.forEach((doc) => {
console.log(doc.id, doc.data());
});Supabaseのデータ構造例
SupabaseはPostgreSQLなので、テーブルとリレーションで設計します:
-- users テーブル
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
-- posts テーブル(外部キーでリレーション)
CREATE TABLE posts (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES users(id),
title TEXT NOT NULL,
content TEXT,
created_at TIMESTAMP DEFAULT NOW()
);// データ取得例(JOINクエリ)
const { data, error } = await supabase
.from('users')
.select(`
name,
email,
posts (
title,
content
)
`);認証システムの違いを実例で比較
Firebase Authenticationの実装例
Firebase Authは独自のSDKで、Googleアカウント連携が非常にスムーズです:
// Firebase Auth - メール認証
import { getAuth, createUserWithEmailAndPassword } from 'firebase/auth';
const auth = getAuth();
const userCredential = await createUserWithEmailAndPassword(
auth,
'user@example.com',
'password123'
);
console.log('登録完了:', userCredential.user);
// Google認証
import { signInWithPopup, GoogleAuthProvider } from 'firebase/auth';
const provider = new GoogleAuthProvider();
const result = await signInWithPopup(auth, provider);
console.log('Googleログイン完了:', result.user);Supabase Authの実装例
SupabaseはPostgreSQLベースで、Row Level Security(RLS)で細かいアクセス制御が可能:
// Supabase Auth - メール認証
const { data, error } = await supabase.auth.signUp({
email: 'user@example.com',
password: 'password123'
});
// GitHub認証
const { data, error } = await supabase.auth.signInWithOAuth({
provider: 'github'
});
// Row Level Security設定(PostgreSQL側)
// ユーザーは自分のデータのみ読み書き可能
CREATE POLICY "Users can only see their own data"
ON posts
FOR SELECT
USING (auth.uid() = user_id);認証の違いのポイント:
- Firebase:Google連携が超簡単、UI付きAuthがある
- Supabase:RLSでデータベースレベルのセキュリティ、SQL知識が必要
リアルタイム機能の違い
Firebaseのリアルタイムデータ監視
FirestoreはonSnapshotでドキュメントの変更をリアルタイム監視:
// チャットメッセージのリアルタイム取得
import { collection, query, orderBy, onSnapshot } from 'firebase/firestore';
const q = query(collection(db, 'messages'), orderBy('timestamp', 'desc'));
const unsubscribe = onSnapshot(q, (snapshot) => {
snapshot.docChanges().forEach((change) => {
if (change.type === 'added') {
console.log('新しいメッセージ:', change.doc.data());
}
if (change.type === 'modified') {
console.log('メッセージ更新:', change.doc.data());
}
});
});Supabaseのリアルタイムサブスクリプション
SupabaseはPostgreSQLのWAL(Write-Ahead Logging)を使ったリアルタイム機能:
// テーブル変更のリアルタイム監視
const channel = supabase
.channel('messages-channel')
.on(
'postgres_changes',
{ event: 'INSERT', schema: 'public', table: 'messages' },
(payload) => {
console.log('新しいメッセージ:', payload.new);
}
)
.on(
'postgres_changes',
{ event: 'UPDATE', schema: 'public', table: 'messages' },
(payload) => {
console.log('メッセージ更新:', payload.new);
}
)
.subscribe();
// クリーンアップ
channel.unsubscribe();リアルタイム機能の違い:
- Firebase:ドキュメント単位で監視、設定不要で簡単
- Supabase:テーブル変更を監視、PostgreSQLの設定が必要
料金体系の違い
Firebaseの料金構造
Firebaseは読み書き回数・ストレージ容量・ネットワーク帯域で課金:
- 無料枠(Sparkプラン):
- ドキュメント読み取り:50,000回/日
- ドキュメント書き込み:20,000回/日
- ストレージ:1GB
- ネットワーク下り:10GB/月
- 有料プラン(Blazeプラン):
- 読み取り:$0.06 / 100,000回
- 書き込み:$0.18 / 100,000回
- ストレージ:$0.18 / GB
注意点:NoSQLの特性上、リレーションデータを取得する際に複数回読み取りが発生するため、料金が膨らみやすい傾向があります。
Supabaseの料金構造
Supabaseはデータベース容量・API呼び出し回数・ストレージで課金:
- 無料枠:
- データベース:500MB
- ストレージ:1GB
- API呼び出し:無制限
- 帯域幅:5GB/月
- Proプラン($25/月):
- データベース:8GB
- ストレージ:100GB
- API呼び出し:無制限
- 帯域幅:250GB/月
コストメリット:SQLのJOINで関連データを一度に取得できるため、APIリクエスト回数を抑えやすく、コスト最適化しやすい特徴があります。
開発体験(DX)の違い
Firebaseの開発体験
FirebaseはGoogle製のエコシステム統合が強み:
- メリット:
- Firebase Console(Webダッシュボード)で直感的に管理
- Cloud Functionsで簡単にサーバーレス関数を追加
- Google AnalyticsやCrashlyticsなど連携サービスが豊富
- モバイルアプリ(iOS/Android)のSDKが充実
- デメリット:
- 複雑なクエリが書きにくい(NoSQLの制約)
- データのマイグレーションが難しい
- Firestore Rulesの学習コストがある
Supabaseの開発体験
SupabaseはオープンソースでSQL慣れした開発者に優しい:
- メリット:
- SQLでクエリを書けるため、既存知識を活用できる
- Table Editor(GUI)で直感的にデータ編集可能
- PostgreSQLの全機能が使える(トリガー、ビュー、関数など)
- セルフホスティング可能(Dockerで自前サーバー運用)
- デメリット:
- PostgreSQL・SQLの知識が必要
- モバイルSDKがFirebaseほど成熟していない
- 日本語ドキュメントが少ない
使い分けの判断基準:5つの選択シナリオ
シナリオ1:モバイルアプリ開発(iOS/Android)
推奨:Firebase
- 理由:モバイルSDKが成熟、プッシュ通知(FCM)が標準搭載
- 適した機能:Firebase Cloud Messaging、Crashlytics、Remote Config
- 実例:チャットアプリ、SNSアプリ、ゲームのバックエンド
シナリオ2:複雑なリレーショナルデータを扱うWebアプリ
推奨:Supabase
- 理由:JOINクエリで関連データを効率的に取得できる
- 適した機能:PostgreSQLの全機能、Row Level Security
- 実例:ECサイト、業務管理システム、SaaSプロダクト
// Supabaseで注文データと商品データをJOIN取得
const { data } = await supabase
.from('orders')
.select(`
id,
order_date,
total_amount,
order_items (
quantity,
products (
name,
price
)
)
`)
.eq('user_id', userId);シナリオ3:Google製品との連携が必須
推奨:Firebase
- 理由:Google Analytics、Google Ads、BigQueryとシームレス連携
- 適した機能:Firebase Extensions(Google製の拡張機能)
- 実例:マーケティング重視のWebアプリ、Google Workspace連携ツール
シナリオ4:コスト最適化が重要な中規模サービス
推奨:Supabase
- 理由:API呼び出し無制限、データベース容量ベースの予測可能な料金
- 適した機能:PostgreSQLの効率的なクエリ、セルフホスティング
- 実例:B2B SaaS、コミュニティサイト、データ分析ツール
シナリオ5:プロトタイプを素早く作りたい
推奨:Firebase
- 理由:セットアップが簡単、スキーマ設計なしでも始められる
- 適した機能:Firebase Hosting、Authentication、Firestoreのセット
- 実例:ハッカソン、MVP開発、アイデア検証
実際のプロジェクトでの移行例
FirebaseからSupabaseへの移行パターン
「Firestoreの読み書き回数課金が高額になった」という理由で移行するケースが増えています:
// Firebase時代(複数回の読み取りが必要)
const userDoc = await getDoc(doc(db, 'users', userId));
const postsSnapshot = await getDocs(collection(db, 'posts'));
const commentsSnapshot = await getDocs(collection(db, 'comments'));
// → 合計3回の読み取り課金
// Supabase移行後(1回のクエリで完結)
const { data } = await supabase
.from('users')
.select(`
*,
posts (*),
comments (*)
`)
.eq('id', userId);
// → API呼び出し無制限で効率的SupabaseからFirebaseへの移行パターン
「モバイルアプリの機能拡充でFCM(プッシュ通知)が必要になった」という理由で移行するケースもあります:
- Supabaseにはネイティブなプッシュ通知機能がない
- FirebaseのFCM + Cloud Functionsでリアルタイム通知が簡単
- 既存のデータをFirestoreに移行する必要がある(手間がかかる)
よくある質問と回答
Q1. 両方を併用することは可能?
A:可能です。例えば「認証とリアルタイム機能はFirebase、データベースはSupabase」といった使い分けもできます。ただし、管理の複雑さが増すため、小規模プロジェクトでは推奨しません。
Q2. どちらがセキュリティ面で優れている?
A:どちらも高いセキュリティを持ちますが、アプローチが異なります:
- Firebase:Firestore Rulesでクライアント側のアクセス制御
- Supabase:PostgreSQLのRow Level Securityでデータベースレベルの制御
個人的には、Supabaseの方がデータベース側で完結するため、セキュリティ設定漏れが起きにくいと感じます。
Q3. 学習コストはどちらが低い?
A:前提知識によります:
- プログラミング初心者:Firebase(NoSQLの方が直感的)
- SQL経験者:Supabase(既存知識を活用できる)
- モバイル開発者:Firebase(モバイルSDKが充実)
まとめ:あなたのプロジェクトに最適な選択を
FirebaseとSupabaseは、どちらも優れたBaaSですが、プロジェクトの要件によって最適な選択が変わります:
- Firebaseを選ぶべき場面:
- モバイルアプリ開発(iOS/Android)
- Google製品との連携が必須
- プロトタイプを素早く作りたい
- NoSQLのドキュメント構造が適している
- Supabaseを選ぶべき場面:
- 複雑なリレーショナルデータを扱うWebアプリ
- コスト最適化が重要
- SQLの知識を活用したい
- オープンソースでセルフホスティングも視野に入れる
どちらも無料枠が充実しているので、実際に両方試してみて、自分のプロジェクトに合った方を選ぶのがベストです。この記事が、あなたの技術選定の助けになれば幸いです!
