FirebaseとSupabaseの違いは?使い分けに迷ったら読む記事!実例で理解する選択基準

目次

「Firebase?Supabase?どっち使えばいいの?」そんな悩み、ありませんか

新規プロジェクトでバックエンドを選ぶとき、「FirebaseとSupabase、名前は似てるけど何が違うの?」と迷った経験はありませんか?どちらもBaaS(Backend as a Service)として人気ですが、データベースの仕組み、認証方式、料金体系、開発体験が根本的に異なります

この記事では、実際のコード例を交えながら、FirebaseとSupabaseの具体的な違いと使い分けの判断基準を解説します。「NoSQLとRDBMSって何が違う?」「どっちが学習コスト低い?」「料金はどっちが安い?」といった疑問を、実践的な視点で解消していきましょう。

Firebase
Firebase | Google's Mobile and Web App Development Platform Discover Firebase, Google’s mobile and web app development platform that helps developers build apps and games that users will love.
Supabase
Supabase | The Postgres Development Platform. Build production-grade applications with a Postgres database, Authentication, instant APIs, Realtime, Functions, Storage and Vector embeddings. Start for free.

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の知識を活用したい
    • オープンソースでセルフホスティングも視野に入れる

どちらも無料枠が充実しているので、実際に両方試してみて、自分のプロジェクトに合った方を選ぶのがベストです。この記事が、あなたの技術選定の助けになれば幸いです!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次