FirebaseのRealtime Databaseのざっくり概要

個人的に作っているアプリで簡単にリアルタイムにデータが同期される機構を組み込みたく調べていたところ、Firebaseにたどり着いたのでまずはざっくり概要をまとめました。

## Firebaseとは
Googleが運営しているMBaasです。
Firebaseの特徴としては、他のMBaasと同じ様に、オンラインでサインアップするだけで、オンラインのデータベースにデータを保存 / 取得ができることに加え、
HTML / CSS / JS / 画像などの静的ファイルをホスティングし、CDNを通じSSLで提供するとこまでを提供する[FirebaseHosting](https://firebase.google.com/docs/hosting/)やユーザーの行動を分析する[Firebase Analytics](https://firebase.google.com/docs/analytics/)など、Googleさまさま(?)な強力な機能も利用することができます。

### Firebaseの機能一覧
|サービス | 概要 | 対応プラットフォーム |
|:------------:|:------------:|:------------:|
|Firebase Cloud Messaging|さまざまなプラットフォームでメッセージを確実に送受信|iOS / Android / C++ / Web|
|Firebase Authentication|強固な認証によりユーザーの作業を軽減|iOS / Android / C++ / Web|
|Firebase Realtime Database|アプリデータの保存と同期をリアルタイムで|iOS / Android / Web|
|Firebase Storage|ファイルを簡単に保存|iOS / Android / Web|
|Firebase Hosting|ウェブ コンテンツをすばやく配信|Web|
|Firebase Remote Config|アプリのアップデートを公開しなくても、アプリの動作と外観を変更|iOS / Android|
|Firebase Test Lab for Android|Google データセンターでホストされている端末上でアプリをテスト|Android|
|Firebase Crash Reporting|アプリで発生した問題の診断と修正に役立つ、すぐに使用できる包括的な情報を提供|iOS / Android|

## Firebase Realtime Databaseとは
> データを保存して NoSQL クラウド データベースと同期できます。データはすべてのクライアントにわたってリアルタイムで同期され、アプリがオフラインになっても、利用可能な状態を保ちます。

[公式ドキュメント](https://firebase.google.com/docs/database/)から引用

ほうほう…

### 主な機能
|機能 | 概要 |
|:------------:|:------------:|
|リアルタイム| データが変更されるたびに、接続されているあらゆるデバイスがその更新を数ミリ秒以内に受信します |
|オフライン|Firebase アプリはオフラインでも応答できる状態を保ちます。|
|クライアント端末からアクセス可能|モバイル端末やウェブブラウザから直接アクセスできます。アプリケーション サーバーは必要ありません。|

[公式ドキュメント](https://firebase.google.com/docs/database/)から抜粋

リアルタイムにDBを同期し、オフラインになっても接続が確立したら、現在のサーバーの状態と同期し、アプリケーションサーバを立てることなく、皆様お持ちのモバイル端末やウェブブラウザからアクセスできると。。。！

（上記の概要をそのまま繋げただけとか言わないで。）

DB自体というよりかはその周りを取り巻く通信系の部分もマルッとパッケージングされてるみたいですね。

### 詳細

*  NoSQL データベース。
* データはローカルで永続化され、オフラインでも、リアルタイム イベントは引き続き発生。
* デバイスが接続を回復すると、Realtime Database はローカルデータの変更内容をクライアントがオフラインであったときに発生したリモート更新と同期して、競合があれば自動的に統合。
* Realtime Database API は短時間で実行できる操作だけを許可するように設計されている。
* Firebase Realtime Database Security Rules という柔軟性に優れた式ベースのルール言語が用意されており、この言語で、データの構造と、データの読み取りや書き込みを可能にするタイミングを定義。

[公式ドキュメント](https://firebase.google.com/docs/database/)から引用

ざっくり図にした
![realtime database.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/39342/e431d9c6-95c3-89db-a858-5f92a68d4843.jpeg)



> ・ NoSQL データベース。

まず、NoSQLデータベース(データ構造はJSONツリー)ということで、これまで、MysqlやMariaDB(ほぼ同じw)しか触ってこなかった自分にとっては、あまり馴染みのないデータアーキテクチャです。

データベース設計は、RDBの様に正規化をするのではなく、平坦化(非正規化)するのが重要らしい。※このあたりは次回まとめます。


> ・データはローカルで永続化され、オフラインでも、リアルタイム イベントは引き続き発生。

図で言うオレンジ部分ですかね。
基本的には、ユーザはローカルにあるクラウド上のFirebase Realtime Databaseのコピーに対して操作を行うので、もちろんオフライン時でもイベント自体は引き続き発生しますよと言うことなんでしょうか。なるほど。。。

> デバイスが接続を回復すると、Realtime Database はローカルデータの変更内容をクライアントがオフラインであったときに発生したリモート更新と同期して、競合があれば自動的に統合。

図で言うブルーの部分かと。
ローカルでの出来事は、オンライン時は常にクラウド上にあるDBと統合してると。つまりMr. Aがデータを書き加えた場合、Mr. Aのローカルのコピーが変わり、即時にクラウド上のマスターにその差分が統合され、Mr. BやMr. Cのローカルのコピーはその瞬間にマスターとの差分が発生するので、即時マスターとの整合性を取るという流れでしょうか。

> Firebase Realtime Database Security Rules という柔軟性に優れた式ベースのルール言語が用意されており、この言語で、データの構造と、データの読み取りや書き込みを可能にするタイミングを定義。

もちろんのことながら、読み書きのルールも設定できるのでセキュアですよ。

ざっくり個人的な感想としては、

・　NoSQLなので、データベース設計はちょっとコツがいりそう。
・ ローカルにコピーを作ることで、オフライン時でも操作ができ、かつオンライン時にローカルのコピーとマスターの整合性を保つという仕組みに「おーなるほど。」となりましたw
・ NoSQLでどこまで複雑なことができるかわかりませんが、簡単なチャットなどの扱うデータの要素(種類?)が比較的少ないアプリでかつリアルタイム性を重視したアプリを作成するケースにベストマッチしているのではないでしょうか。（= 相性が良いアプリとそうでないアプリがある）

以前、[Firebaseのチュートリアルの様なもの]( [Firebase Web Codelab](https://codelabs.developers.google.com/codelabs/firebase-web/#0) )をやって見て、「おーこんな簡単にリアルタイムチャットアプリできんのか」と感動したのですが、いまいち仕組みがわからずモヤモヤしたので、
今回まとめて見ました。

次回は、実際にコードも交えての実践編を書きたいと思います。

Realtime databaseを使ってこんなアプリを作ってみました。
[Firebaseを使ってリアルタイムにみんなでyoutubeを視聴するwebアプリを作ってみた](https://qiita.com/seiya1121/items/fd5489bad467cff73865)

## 参考資料
* [Firebase]( [Firebase | App success made simple](https://firebase.google.com/) )
+ [Firebase Realtime Database]( [Firebase Realtime Database  |  Firebase](https://firebase.google.com/docs/database/) )