はじめに
Supabaseは”Supabase is an open source Firebase alternative.”とサイトで銘打っており、Firebaseの代替であることを強調しています。
実際にFirebaseとSupabaseを様々な観点から比較してそれぞれのメリット、デメリットを考えてみます。
データベース
Firebase
Firebaseでは二つのデータベースがそれぞれ提供されており、用途に合わせてどちらを使うか選択できます。
双方ともにNoSQLベースのデータベースで方ともにNoSQLベースのデータベースで、その中でKey-Valueデータベースと呼ばれるものになっています。
※NoSQLについては下記の記事でAWSが説明してくれています。
https://aws.amazon.com/jp/nosql/
Realtime Database
リアルタイム性の高さに着目したシンプルなデータベースです。
レイテンシ(遅延)が低く効率良くデータを扱えるため、UX要件的にリアルタイム性を求められるチャットツールやゲームなどのDBとして適している印象です。
Cloud Firestore
Firebaseにおける後発のデータベースで、大規模で複雑なデータ構造やそれに対する複雑なクエリが必要になる場合、また、
利用者が多く自動スケーリングの恩恵を受けやすいサービスでの利用に強みがあります。
それぞれのFirebaseのデータベースソリューションの詳細は下記を参照してください。
https://firebase.google.com/docs/database/rtdb-vs-firestore?hl=ja
Supabase
SupabaseではPostgreSQL Databaseを利用することができます。
(Supabase Project自体が実質的にPostgreSQL Databaseを中心として構築されています。)
PostgreSQLいわゆるRDB(リレーショナルデータベース)の流れを汲んでいますが、主要サービスの一つであるMySQLと比較したとき痒い所に手が届く機能が多かったり、RLS(Row Level Security)による恩恵を受けることができるなどより詳細にデータベースを扱いたい複雑なビジネス要件に適している印象です。
AWSが提供しているそれぞれのデータベースの相違点のQ&Aを見るとPostgreSQLの強みがわかりやすいかと思います。
https://aws.amazon.com/jp/compare/the-difference-between-mysql-vs-postgresql/
どちらが良いか?
ここは好みの問題で意見が分かれると思います。
RDBに慣れている人はSupabaseの方を使いやすいと感じると思いますし、特にこだわりのない人はFirebaseで柔軟にサービスに合わせて構成を考えるのが良いのではないでしょうか?
個人的にはデータベース周りのGUIに関してはSupabaseに軍配が上がるかなと思っています。
Firebaseはkey-valueで保存される関係上、データの全容が見づらいです。
リアルタイム性
Firebase
Realtime Database自体がリアルタイム性を担保する仕組みを持っており、すべてのクライアントと同期するようになっているため、ユーザはリスナーを登録するだけでリアルタイムな変更検知→反映を行うことができます。
例えば子要素の追加を検知して新たなポストを画面に表示したい場合、下記の記述があれば実現できます。
ref.on('child_added', (snapshot, prevChildKey) => {
const newPost = snapshot.val();
console.log('Author: ' + newPost.author);
console.log('Title: ' + newPost.title);
console.log('Previous Post ID: ' + prevChildKey);
});
Supabase
SupabaseではWebSocketのサーバが機能として別で提供されており、これを有効化することでリアルタイムな変更検知を行うことができます。
ただ、WrapされているもののWebSocketの仕組みに乗った記述をする必要があり、直感的でない印象です。
どちらが良いか?
これに関してはデフォルトでリアルタイム性が担保されているFirebase側に軍配が上がります。
どうしてもSupabase側のリアルタイム機能はあくまでサブ要素という感じが否めないですね。
認証機能
Firebase
Firebaseは下記の多様な認証方法をサポートしています。
- メール/パスワード
- 電話番号
- サードパーティ
- Appleアカウント
- X
- Github
- カスタム認証システムの統合
- 匿名認証
また、Firebase Authentication with Identity Platformというオプション機能(別途課金あり)を利用して、
二要素認証や、登録、認証時のトリガーなど追加機能を利用することができます。
Supabase
Supabaseも強力な認証機能を提供しており下記の機能を提供します。
- メール/パスワード
- マジックリンク
- ワンタイムパスワード
- 電話番号
- 匿名認証
- 二段階認証
また、デフォルトで利用できるサードパーティの認証プロバイダも多いです。
現状は添付画像のものすべて利用できます。
どちらが良いか?
両者とも強力な認証機能を提供していますが、この二つであればSupabase側のほうがより良いのでは考えています。
豊富な認証プロバイダや認証機能とRLSとの統合など有用な部分が多いです。
ローカル開発
Firebase
FirebaseはJavaベースのローカルエミュレータを持っており、Firebase CLIから立ち上げることが可能です。
基本的にはFirebaseと同じ要領で利用できますが、一部ローカル開発用の実装をしなければいけないこともあるようです。
Supabase
SupabaseではDockerベースのローカル開発環境があり、Firebaseと同じ要領でCLIツールから立ち上げることが可能です。
Supabaseはデータベースの変更をバージョン管理するためのマイグレーション機能も提供しており、ローカル開発からプロダクション環境への移行がスムーズです。
どちらが良いか?
Supabaseの方がなじみ深いDockerベースでの環境を作れることやenvファイルの書き換えだけで動かせる点、データベースのマイグレーションなどのメリットがあり、こちらのほうが使いやすい印象です。
サーバレス開発
Firebase
FirebaseはCloud Functionsを通じて、サーバレス開発を行うことができます。
Node.js、Python、でFunctionsを書くことができ、データベースの変更やアナリティクス情報、認証など様々なタイミングに合わせてトリガーすることが可能です。
開発は前述のローカルエミュレータ上で行うことになります。
Supabase
Supabaseは、PostgreSQLの機能を活用したサーバレス開発を提供しています。
Denoベースのみでの記述となり、トリガーに関しては間にDatabase Functionを別で作成し、そこから呼び出すため少し手間がかかります。
Firebaseと同じくローカル開発環境上で開発を行うことになります。
どちらが良いか?
開発体験自体はSupabaseのEdge Functionのほうが前述のローカル開発環境もあり、良い認識ですが、
利用できる言語やトリガー設定のシンプルさなどはFirebase側のほうが便利です。
FirebaseのCloud Functionsの方が良いと思います。
AIアプリ開発
Firebase
Firebaseは直接的なAI機能を提供していませんが、GCPとの統合によりGemeni in Firebaseを利用したり、
Firebase extensions hubの利用により、AIソリューションを拡張機能としてFirebaseアプリにとりこんで利用することができます。
また、Firebase MLを使用すると、モバイルアプリケーションに機械学習モデルを簡単に統合できます。これにより、デバイス上での推論、カスタムモデルの利用が可能になります。
Supabase
Supabaseは、PostgreSQLの拡張機能であるpgvectorを利用してベクトルデータベースを実現し、RAGや類似性検索などを実装できます。
その他、Supabaseのサイトを見るとOpenAPIを利用したEdge Functionsの作成方法などのチュートリアルを見ることができますが、実際にSupabase自体が機能を提供しているわけではないです。
どちらが良いか?
AIアプリ開発の観点では、拡張機能の充実性からやはりFirebaseに軍配が上がります。
セキュリティルール
Firebase
Firebaseは、各種データベースとストレージにセキュリティルールという機能をもっています。これにより、データベースやストレージへのアクセスを細かく制御できます。
セキュリティルールは宣言的な構文で記述され、ユーザーの認証状態、データの内容、リクエストの種類などに基づいてアクセスを制御できます。
下記のように実装します。
{
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}
この例では、ユーザーは自分のデータのみを読み書きできるようになっています。
Supabase
SupabaseはPostgreSQLのRow Level Security(RLS)を活用してセキュリティを実現しています。RLSにより、テーブルごとに詳細なアクセス制御ポリシーを定義できます。
RLSポリシーは下記のようにSQLで記述することができます。
この例ではFirebaseと同じように、ユーザーは自分のデータのみにアクセスできるようになっています。
CREATE POLICY "Users can only access their own data" ON profiles
FOR ALL USING (auth.uid() = id);
どちらが良いか?
SupabaseのRLSで認証、ストレージ、各種テーブルなどを同じ利用方法で直感的に定義できる点からSupabaseのほうが便利に利用できる認識です。
SQLで書けるのでデータベースを書く延長で指定できるのもメリットです。
サポートしているプラットフォーム
Firebase
FirebaseはクライアントSDKにおいて、下記のプラットフォームをサポートしています:
- iOS+
- Android
- Flutter
- Web
- Unity
- C++
Supabase
Supabaseの公式資料を見る限り、C++,Unityへの言及はありませんが、下記プラットフォームは幅広く様々なフレームワークベースでの対応方法を含めて公式サイトに記述があります。
- iOS+
- Android
- Flutter
- Web
どちらが良いか?
プラットフォームのサポート範囲では、Firebaseの方が広いと言えます。特に、UnityやC++のネイティブサポートは、ゲーム開発者にとって魅力的です。
ただ、細かいWeb/モバイルのフレームワーク上での利用方法について記述があるSupabaseのほうがスタート時に困ることは少ないかもしれません。
ゲーム開発であればFirebase, Web/モバイルのフレームワークまで決まっていて開発を始めるならSupabaseといった選定をするとよさそうです。
アナリティクス
Firebase
Firebaseは、Google Analyticsとの統合によりアナリティクスを提供しています。これにより、アプリの使用状況、ユーザー行動、クラッシュレポートなどの詳細な分析が可能です。主な特徴は以下の通りです。
- リアルタイムデータ分析
- ユーザーセグメンテーション
- コンバージョン追跡
- A/Bテスト機能
- プッシュ通知と連携したユーザーエンゲージメント分析
また、GCPのBigQueryとの統合により、より高度なデータ分析やカスタムレポートの作成も可能です。
Supabase
Supabaseは、直接的なアナリティクス機能は提供していません。
ダッシュボード上で利用状況の確認はできますが、個別機能としての提供はないです。
どちらが良いか?
アナリティクスの観点では、Firebaseが明らかに優位です。
Google Analyticsの完成された資産をそのまま利用することができるのはとても便利です。
ストレージ
Firebase
Firebaseは Firebase Cloud Storageというストレージサービスを提供しています。
バケットの作成、セキュリティルールの設定、暗号化など一通りの必要な機能はそろっており、ドキュメントも充実しています。
https://cloud.google.com/storage/docs/introduction?hl=ja
暗号化機能はデフォルトでONになっています。
https://cloud.google.com/storage/docs/encryption?hl=ja
Supabase
Supabaseはストレージも統合して提供しています。
どんなファイルもアップロード可能かつ、バケット単位でpublic化、private化する、RLSを利用するなどでアクセス制御を行うことが可能です。
機能としてストレージの暗号化は存在していないですが、デフォルトでプロジェクト自体を暗号化しているためその点の問題はなさそうです。
プロジェクトの暗号化に関しては下記に言及があります。
https://supabase.com/docs/guides/database/extensions/pgsodium
どちらが良いか?
ストレージの機能としてはどちらも一通り備わっており、セキュリティ的にも問題はない印象です。
これに関しては好みなのかなと思います。
機能面で大きな差はないですが、細かいドキュメントが豊富なのはFirebaseなのでそちらの方が問題の解決はしやすいかもしれません。
価格
Firebase
FirebaseにはBlazeという有料プランがあります。
これは従量課金制のプランになっており、自動スケーリングを前提としたサービスです。
Supabase
SupabaseにはPro, Enterpriseという段階的なプランが存在し、それぞれ基本料金は
- Pro: 25ドル/月
- Enterprise: 599ドル/月
となっています。
それぞれのプランの利用量を超えると従量課金制になります。
どちらが良いか?
小さくサービスを始め、スケールする可能性がある場合はFirebaseだと初めのうちの料金を安く抑えられるのでよいかと思います。
中規模なサービスで利用者数の増減が少ない想定の場合はSupabaseを利用するのが良いです。
まとめ
Firebase、Supabaseそれぞれ比較してメリット、デメリットがあることがわかりました。
下記に箇条書きでまとめます。
Firebase
メリット
- リアルタイムデータベースの優れた性能と使いやすさ
- 豊富な認証方法と容易な実装
- Cloud Functionsによる柔軟なサーバーレス開発
- Google Analyticsとの統合による強力なアナリティクス機能
- 幅広いプラットフォームサポート(iOS、Android、Flutter、Web、Unity、C++)
- AIアプリ開発のための拡張機能と統合(Gemini、Firebase ML)
- 小規模から大規模までスケーラブルな料金体系(Blazeプラン)
デメリット
- 構造が複雑なデータベースには不向き
- データベースのGUI操作性がやや劣る
- ローカル開発環境の設定がしづらい
Supabase
メリット
- PostgreSQLベースの強力で柔軟なリレーショナルデータベース
- 優れたデータベースGUIと操作性
- Row Level Security (RLS)による直感的で強力なセキュリティ制御
- Dockerベースの使いやすいローカル開発環境
- データベースマイグレーション機能によるスムーズな開発フロー
- pgvectorを利用したAI機能の実装しやすさ
- 中規模サービスに適した段階的な料金プラン
デメリット
- リアルタイム機能の実装がやや複雑
- サーバーレス開発の言語選択肢が限定的(Denoのみ)
- 内蔵のアナリティクス機能が存在しない。
- 一部のプラットフォーム(Unity、C++)のサポートが不足
どちらを選択するかは、プロジェクトの要件、開発チームの経験、サービスの規模と成長予測によって変わってきそうです。
Firebaseは小規模から大規模までスケーラブルで、特にリアルタイム性とアナリティクスが重要な場合に適しています。
一方、Supabaseは複雑なデータモデルを扱う中規模プロジェクトや、PostgreSQLの機能を最大限に活用したい場合に適しています。
それぞれ自分の作りたいものに合わせて選定するようにしましょう!
参考資料
Supabaseドキュメント:
https://supabase.com/docs
Firebaseドキュメント:
https://firebase.google.com/docs?hl=ja
- Next.js + SupabaseでTodoアプリ作成 CRUDの基本を学ぼう
- FirebaseとSupabaseの機能、料金、セキュリティ、AI観点などを含めて徹底比較
- Next.js とSupabaseで求人マッチングアプリを作る①
- 素早くアプリを作りたい! Vercel+Supabaseでプロジェクト開発
- Supabaseの機能一覧・解説 オープンソースのFirebase代替mBaaS
- Supabase CLIコマンド一覧
- Supabase RealtimeのBroadcast, Presenceを利用したキャンバス共有アプリを作る
- Supabaseのローカル開発環境を構築して開発体験を向上させつつ料金も節約
- Next.js + Supabaseでリアルタイムチャットを作ろう
- Next.js + Supabaseでソーシャルログインを実装する方法
- Next.js+Supabaseで認証機能を実装しよう【コード付き完全ガイド】
- Supabase + Next.jsで画像投稿アプリを最適化する(画像圧縮、ファイルサイズ制限、ファイルのアップロード数制限)
- OpenAI Embeddings API+ Supabase Vector Database + Next.jsでベクトル検索を実装する
- Supabase + AWS CognitoでAmplifyを利用せずサードパーティ認証する
- Supabaseでデータ更新があった時にSlack通知を送る
- Supabase Branchingでプレビュー環境を手に入れて開発体験を向上する
- Next.js + SupabaseでGraphQLを利用する方法
- SupabaseのEdge FunctionsとSendGridでメールを一斉送信する
- Supabaseで匿名認証とアカウントの本登録への昇格の方法
- Next.js + SupabaseでStorageを利用した画像投稿アプリ作成
- Next.js + SupabaseでRLSを利用して安全なアプリを作ろう。
- Next.js + SupabaseでAuth + Storageのストレージサービスを作る方法
- Next.jsとSupabaseで認証機能ありのリアルタイムチャットを作成する。
- Next.jsとSupabaseで認証つきチャットアプリを作成する(SNS風UI)
- Next.js + SupabaseでSMS認証を作成する方法
- Next.jsとSupabaseで全文検索を実装する方法
- Next.jsとSupabaseで作成したチャットアプリにお知らせ機能を実装する
- Nextjs + SupabaseでSupabaseのStorage Image Transformationsを利用する方法
- Supabase vs Neonの比較。機能や料金、セキュリティ、AIを徹底比較
- Supabaseのセルフホスティングをできるだけ安く行う方法
- Supabase + Cognitoの連携で外部連携を試す
- Supabase CLIのTesting機能を利用する
- Supabaseを利用する際に設定しておきたい項目