こんにちは!皆さんは個人開発に勤しんでいますか?
個人開発の設計段階において、どのDBを利用するのかは非常に重要ですよね。どのデータベースを利用するかは開発体験に大きな影響を与えるし、様々な選択肢があり選ぶのが難しいです。
この記事では、初期アプリを構築しようとしている際のアーキテクチャに悩んでいるユーザーにFireStoreというDBを利用する選択肢を提示します。FireStoreはGoogleが提供するクラウドサービスプラットフォームであるFirebaseのサービスの一つであり、NoSQLベースのデータベースのことです。
ユースケース次第ではあるが、FireStoreを利用することでMVP段階であれば「安く、早く、楽に」にアプリケーションを作成することができます。
そのユースケースとは、下記のような条件を持つアプリケーションのことです。
- ユーザーが多くない(~100人程度)
- バックエンドの機能は簡単なCRUDのみで十分である
- Firebase AuthなどのFireStore以外のFirebaseサービスを利用する
MVP段階のアプリであれば当てはまるケースも多いのではないでしょうか?
この記事では、上記のユースケースにおいてFireStoreを利用する利点をコスト・開発スピード・開発体験の3つの観点で紹介し、FireStoreの魅力をお伝えしていきたいと思います。一方で、サービスがスケールするといくつかの困難な点が発生する可能性があるため、その点についてもお伝えします。
MVP段階でFireStoreを利用する魅力
コスト:無料で始めることができるので安い
個人開発において、最も大きな障害になるのが維持費用だと考えています。コストがかかりすぎると継続的に開発することが難しくなるためです。MVP段階のプロダクトにおいて発生するコストの中で、個人開発で一番コストが発生するのはDBの料金になるケースが多いです。
GCP,AWSのRDBサービスを利用すると固定費として月1000円ほど発生してしまいます。
その点のFireStoreは完全従量課金であり、最初は無料で始めることができます。読み取り・書き取りなどの操作量に応じて課金されます。プロジェクトごとに無料枠が設定されており、その範囲内であれば無料で利用できるため、サービスがスケールするまでは無料で利用することができます。初期費用が定額でかかってしまうDBサービスと比較して、完全無料で始めることができるのは大きな魅力です。
一方でその他のDBにおいても初期無料で利用できるRDBサービスもあるのでユースケースにあったものを適宜利用すべきです。PlanetScaleなどは非常に優秀でRead,Writeの制限がFireStoreより緩く、コストだけを考慮するとPlanetScaleを利用するほうが良いかもしれません。とはいえこれからご紹介する他の観点などを考慮して総合的に判断することをおすすめします。
開発スピード:APIサーバーを建てずにアプリケーションを構築できるので早い
FireStoreはSDK等を用いることでアプリケーションクライアントと直接通信を行うことができ、APIサーバーを立てずにデータを受け渡すことができます。APIサーバーを実装する必要がないため、CRUDのみを提供するようなサービスであれば少ない工数でアプリケーションを実装することができます。
少々複雑な処理であってもフロント側で処理することも可能であるため、ロジックが複雑になるまでは早く開発することができます。一方で描画速度などの観点で複雑なロジックはバックエンド側で処理したほうが良いケースもあるため、要件によって最適なDBを選択するようにしましょう。
開発体験:Firebaseとの相性が抜群であり、ある程度直感的に操作できるので楽
FireStoreを利用することで簡単に開発できる理由を2つのポイントでお伝えします。
1点目としてFirebaseとの相性が抜群でありFirebaseを多く活用するサービスであればより簡単に開発できる点が挙げられます。
FirebaseはFirebase Authenticationなどを始めとした使いやすいサービスが揃っており、個人開発で利用されることが多いクラウドプラットフォームとなっています。FireStoreはFirebaseのサービスの一つであるため、Firebaseとの相性が抜群です。
Google Analyticsや、Firebase Authentication,CloudStorageなどのFirebase内の別サービスを利用するユースケースであれば、同一コンソール上で操作が完結するので使い勝手が良いです。
また開発時においても、一つのFirebaseクレデンシャルで複数のFirebaseサービスを起動させることができるため環境変数の管理や初期化の手間も省くことができ簡単に開発することができます。
また2点目においてはFireStore自体の利用の簡単さが挙げられます。
FireStoreはDart,Node.js,Python各種言語SDKが提供されており、活用事例も多いため初めて利用する場合であってもキャッチアップはそこまで難しくないのではないかと思います。
管理画面での操作においても、JSONのような構造でKey,Valueを入れていく形で操作できるため基本的なCRUDを行うだけなどであれば複雑な操作は特に必要ありません。そのため初めて管理画面を触る方であってもある程度直感的に操作できるのではないかと思います。
スケール時におけるFireStore利用時の懸念点
多くのメリットがあるFireStoreですが、前述したメリットはスケールする段階で変化する場合があります。下記のようなデメリットが発生する可能性があるので併せて確認しましょう。
また、この懸念点については私自身はまだ経験したことがなく、FireStoreの特性上発生する可能性であるという点についてもあらかじめ記載させていただきます。
コスト:実装方法によってはコストが多くかかる可能性がある
FireStoreは無料から始められますが、読み取り・書き込み等の操作量に比例する従量課金であるため操作量の増大によって課金が発生します。そのためユーザー数の増大や、ユーザーごとのデータ量の増大によって、どこかのタイミングでコストが発生するようになります。
操作量に比例する課金モデルであるため、設計次第では別の課金モデルのDBと比較してコスト金額が高くなる可能性があります。例えば、データ書き込みのたびに最新版のデータを全件取得するなどの実装をしていた場合などです。この場合ではデータ量が多くなるとドキュメントの読み込み回数も非常に多くなるため、操作量を考慮しない他のDBと比較して金額が高くなる可能性があります。
ドキュメントの読み取り回数を非正規化を上手に活用することで減らすなど工夫しコストを抑えることも可能ですが、高い設計能力が必要になるため上級者向けの対応であり最適化するのは難しいと言えます。
開発スピード:設計・実装の複雑性が増すため時間がかかる可能性がある
開発スピードに関しても、NoSQL特徴である正規化と非正規化のバランスはトレードオフが発生するため最適解を見つけることが難しく、RDBを使うとき以上に設計・開発に時間がかかる可能性があります。
DB設計に関しては非正規化を活用してデータを最適に保持することは設計難易度が高く、設計に時間がかかる可能性があります。また、FireStoreでは複雑なSQL処理は行えないためSQLで完結する処理をクライアント側のロジックで実行する必要がある場合があり、RDBの実装コストと比較してクライアント側のロジックが複雑になる場合があります。
開発体験:MVP時とそこまで差は発生しない?スキーマレスなのでデータ管理は大変になる可能性がある
MVP時に説明した利点はスケール段階においても実感できるため、スケールしていても引き続きFirebaseとの親和性や、FireStore自体の利用のしやすさは実感でき、利便性を保ちながら開発できると思っています。
一方で、運用コストはスキーマレスであるため保守運用時にデータ管理の観点で難しさが発生する可能性があります。FireStoreはスキーマレスであるため、データの状態の整合性を担保する仕組みがなく、テーブル構造を変更した場合にデータの整合性が取れなくなるなどで管理が複雑になる可能性があります。
この問題を防ぐために、バージョン管理を適切に行うなどして管理をしやすくさせる仕組みづくりが必要となるかと思います。バージョン管理・マイグレーションについてはNorikazu Muramotoさんの書かれたCloud Firestoreを実践投入するにあたって考えたことは非常に参考になると思います。
終わりに
今回改めて整理する中で、FireStoreはMVP段階のユースケースでは非常に便利なDBだと感じました。一方で、スケールする段階で最適な構成にするための難易度は高くなっていきます。そのため使い方としては、FireStoreを利用して初期検証を手早く進める→スケールしてきたらRDBに移行するという運用が良いのではないでしょうか。
私自身はまだFireStoreをスケール段階で活用したことがないので、どのような構成にすべきかは模索していきたいと思っています。Keisuke69さんが書かれたAWS DevDay Japan 2022 に「脱Firebase. 我々はどう生きるか 」というタイトルで登壇してきたなど、様々な方がスケール段階でFireStoreに関するナレッジを共有されているため、参考にしたいです。
FireStoreは引き続き利用していきたいので、FireStoreについてよくご存知の方がいれば是非色々とご教示いただけると嬉しいです!
それでは!!!