かとのぼのマイコード・マイライフ

エンジニア兼ウェブサービス開発者のプログラミングと雑記ブログ

複数のトークルームが存在するチャットアプリのデータ構成【Firebase firestore】

f:id:katonobo:20190502112425p:plain

Firebaseを使ったチャットアプリを作成するとき、ちょっと悩んだのがfirestoreのデータベース構成です。

Firebaseの「firestore」と「real time database」はNoSQLなので、普段使い慣れているRDB(リレーショナルデータベース)とはデータ構造の扱い方が違います。

多くのチャットアプリのサンプルでは複数のルームのメッセージを扱うと不具合が生じる

qiitaなどにfirebaseを使った簡易的なチャットアプリのサンプルは多くありますが、その多くはチャットを行うトークルームは一つだけを想定しています。

Firebase + Vue.jsで認証付き簡易チャットアプリ作成 - Qiita

React NativeとCloud Firestoreで(5分では無理だけど)チャットアプリを作る - Qiita

これは、チャットアプリがFirebase初心者の最初に学習する項目であることや手軽さを訴えるために書かれていることが多いので当然だと思います。

ただ、LINEのようなチャットアプリを考えればわかりますが、トークルームが一つだけというアプリは普通はありません。

ルームはいくつも作られるはずです。

ただ、そうなると問題が一つ生まれます。

それは多くのサンプルアプリの構成で作成するとfirebaseのドキュメント部分がメッセージだらけになってしまうと言うことです。

こうなると該当のトークルーム以外のメッセージも全て同じコレクションに入っていることになるのでメッセージが増えれば増えるだけデータの管理が難しくなります。

解決策:サブコレクションを使う

様々なデータ構成は考えられますが、解決策としては「サブコレクション」を使う方法が良いでしょう。

これはfirebaseの公式ドキュメントでも推奨されている方法です。

Cloud Firestore Data model  |  Firebase

サブコレクションとは、ドキュメントにネストされたコレクションです。

つまり今回の場合は、ドキュメントは各トークルームにして、その各トークルームにメッセージのサブコレクションを作ります。このようにすればデータの管理がスッキリします。

f:id:katonobo:20190502111739p:plain

サブコレクションの扱いはあまりqiitaにも書かれていないので、まだ使っていない人や知らない人もいるかもしれませんが、うまく使えばとても管理しやすいデータ構造を実現できるはずです。

また、サブコレクションにはいくつか独特の注意点があるため、公式ドキュメントで確認しておくと良いです。

 

関連記事:

www.katonobo.com

www.katonobo.com

www.katonobo.com