Firebase Realtime DatabaseとCloud Firestoreの違い

# Firebase（ファイアベース）について
遅ればせながらGoogle Cloudが提供するサービス「Firebase（ファイアベース）」を学び始めました。

https://firebase.google.com/?hl=ja

簡単に説明すると

:::note info
モバイルアプリやWebアプリをより簡単に開発・運用するためのプラットフォームで、アプリを作るための便利な機能がたくさん詰まった場所。
:::

で、

* ユーザー認証（ログイン機能など）
* リアルタイムデータベース（アプリで使うデータを保存・共有する場所）
* クラウドストレージ（画像や動画などのファイルを保存する場所）
* プッシュ通知（アプリからユーザーへのお知らせ機能）
* アクセス解析（アプリの利用状況を分析する機能）

など、Googleが用意しているサービスを組み合わせて、クラウド上でオリジナルのアプリが作れます！

上記の主要なサービス以外にも

* **Cloud Functions**: イベント駆動型のバックエンドコードを実行できるサーバーレス環境
* **Hosting**: Webアプリや静的コンテンツを高速かつ安全に配信できるホスティングサービス
* **ML Kit**: モバイルアプリで機械学習機能（画像認識、自然言語処理など）を利用できるSDK
* **Remote Config**: アプリのアップデートなしに、アプリの動作や見た目を動的に変更できる機能
* **App Distribution**: 開発中のアプリをテスターに配布・管理できる機能
* **Performance Monitoring**: アプリのパフォーマンスに関する情報を収集・分析できる機能
* **Test Lab**: さまざまなデバイスやOSバージョンでアプリをテストできる機能

などもあるので、これらの組み合わせで様々な課題解決ができることでしょう♪

さてさて、その中でも情報を格納するデータベースには２種類あって、その違いについて調べてみました。

と、その前にNoSQLデータベースについての基礎知識です。そんなの知ってるよという方は読み飛ばしてください。
### NoSQLデータベースって何？

:::note info
NoSQLデータベースは、従来の「SQLデータベース」とは異なる種類のデータベースです。「NoSQL」は「Not Only SQL（SQLだけではない）」という意味で、必ずしもSQLという問い合わせ言語を使わないデータベース全般を指します。
:::

従来のSQLデータベース（例えばMySQLやPostgreSQLなど）は、データをテーブルと呼ばれる行と列で構成された表形式で保存します。これは、構造化されたデータを扱うのに非常に適していますが、柔軟性やスケーラビリティの面で課題が出てくる場合があります。

一方、NoSQLデータベースは、データの保存形式がSQLデータベースほど厳密ではありません。そのため、様々な種類のデータや、頻繁に構造が変わるようなデータを取り扱うのに適しています。

#### NoSQLデータベースの主な特徴
1. **様々なデータモデル** :NoSQLデータベースにはいくつかの種類があり、それぞれデータの保存方法が異なります。代表的なものとしては以下のようなものがあります。
    * **ドキュメント指向データベース**: データをJSONやXMLのような形式の「ドキュメント」として保存します。例えるなら、個別のファイルのようなイメージです。FirebaseのFirestoreなどがこれにあたります。
    * **キーバリュー型データベース**: 
単純な「キー（鍵）」と「バリュー（値）」のペアでデータを保存します。例えるなら、ラベルの付いた箱のようなイメージです。
    * **グラフデータベース**: 
データ間の関係性を重視して、点（ノード）と線（エッジ）でデータを表現します。例えるなら、人間関係のネットワーク図のようなイメージです。
    * **カラムファミリー型データベース**: 
行と列を持ちますが、SQLデータベースほど厳密なスキーマ（データの型や構造の定義）を持ちません。
1. **スキーマレスまたは柔軟なスキーマ**: 
SQLデータベースでは、データを保存する前にテーブルの構造（列の名前やデータの型など）を厳密に定義する必要がありますが、NoSQLデータベースでは、必ずしも事前に厳密な定義をする必要がありません。
データの構造を後から変更したり、異なる構造のデータを同じ場所に保存したりすることも可能です。これは、データの形式が頻繁に変わるような場合に便利です。
1. **高いスケーラビリティ**: 
一般的に、NoSQLデータベースは複数のサーバーにデータを分散して処理することが得意です。そのため、大量のデータやアクセスにも比較的容易に対応できます。

#### SQLデータベースとの違いを例えるなら…
* **SQLデータベース**: 
きちんと整理された書類棚のようなものです。
どの引き出しにどんな種類の書類を入れるか事前に決まっていて、探すときも整理されたルールに従います。
* **NoSQLデータベース（ドキュメント指向）**: 
いろいろな種類の情報が詰まったファイルフォルダのようなものです。
中身の形式は様々ですが、関連する情報をまとめて保管できます。

#### なぜNoSQLデータベースが使われるのか？
近年、Webアプリケーションやモバイルアプリケーションで扱うデータの種類や量が多様化し、SQLデータベースだけでは対応が難しくなってきました。例えば、以下のようなケースでNoSQLデータベースが活躍します。

1. **頻繁にデータ構造が変わる場合**: 
アプリケーションの開発初期段階や、ユーザーの行動によってデータ構造が変化する場合など。
1. **非構造化データが多い場合**: 
テキストデータ、画像データ、動画データなど、表形式で表現しにくいデータを扱う場合。
1. **大量のデータを扱う場合**: 
大規模なWebサービスやIoTデバイスからのデータなど、スケーラビリティが求められる場合。
1. **高速な読み書きが求められる場合**: 
リアルタイム性の高いアプリケーションなど。

:::note info
NoSQLデータベースは、従来のSQLデータベースとは異なる特性を持ち、特定の種類のデータやアプリケーションに対して非常に有効な選択肢となります。
:::

と、NoSQLデータベースについての基本をおさえたところで、やっとここからが本題です。

## Firebase Realtime DatabaseとCloud Firestoreの違い
どちらもFirebaseが提供するNoSQLデータベースですが、データの構造や機能、料金体系などにいくつかの重要な違いがあります。

### Firebase Realtime Database

* **データの構造** : 
単一の巨大なJSONツリーとしてデータを保存します。
例えるなら、一つの大きな辞書のようなイメージです。
すべてのデータがこの一つの辞書の中に、階層構造で保存され、深いネスト構造を持つことができます。
* **クエリ** : 
比較的シンプルなクエリしかできません。
特定のノードの子データを取得したり、簡単なフィルタリングや並び替えはできますが、複雑な条件での検索は苦手です。
* **スケーラビリティ** : 
特定のノードへの書き込みが集中すると、パフォーマンスが低下しやすい傾向があります。
データ量が増えてくると、シャーディング（データを分割する）などの対策が必要になる場合があります。
* **料金体系** : 
主にデータ転送量とストレージ容量に基づいて課金されます。
* **リアルタイム性** :
非常に高速なリアルタイム同期を提供します。
データの変更があると、接続しているすべてのクライアントにほぼ瞬時に反映されます。
* **主な用途** :
リアルタイム性が非常に重要なアプリ（チャット、オンラインゲームのリアルタイム対戦など）に適しています。
シンプルなデータ構造で済むアプリにも適しています。

### Cloud Firestore

* **データの構造** :
コレクションとドキュメントという構造でデータを保存します。
例えるなら、たくさんのファイルが入ったフォルダ（コレクション）があり、それぞれのファイル（ドキュメント）の中にデータが入っているようなイメージです。
ドキュメントはJSONのような形式でデータを持ちます。
* **クエリ** :
非常に強力なクエリ機能を持っています。
複数の条件でのフィルタリング、並び替え、範囲検索などが可能です。
インデックス（索引）を活用することで、大規模なデータでも効率的に検索できます。
* **スケーラビリティ** :
水平方向に自動的にスケールするため、データ量やアクセス数が増えても、パフォーマンスが低下しにくい設計になっています。
* **料金体系** :
主に書き込み、読み取り、削除の操作回数とストレージ容量に基づいて課金されます。
* **リアルタイム性** :
リアルタイム同期も提供しますが、Realtime Databaseほどではありません。それでも、多くのアプリケーションにとって十分な速度です。
* **主な用途** :
複雑なデータ構造を持つアプリ（ECサイト、SNS、業務システムなど）に適しています。
高度な検索機能が必要なアプリやスケーラビリティが求められる大規模なアプリにも適しています。

## どちらを選ぶべきか？
:::note info
超高速なリアルタイム性が最優先で、データの構造が比較的シンプルであれば、Realtime Databaseが適しているかもしれません。
複雑なデータ構造を持ち、高度な検索機能が必要で、スケーラビリティを重視するなら、Cloud Firestoreがより適しています。
:::

現在では、**Cloud Firestore**の方が機能が豊富で、より多くのユースケースに対応できるため、**特に理由がない限りはCloud Firestoreを選ぶことが多い傾向**にあります。Realtime Databaseは、既存のプロジェクトや、本当にリアルタイム性が求められる特定のケースで利用されることが多いです。

## まとめ
データベースは**Cloud Firestore**を選んでおけば良し！🥰

以上、最後までお読みいただきありがとうございました👋