質問: ###### 実現したいこと react native & expoでアプリを作成。 バックエンドはfirebase。 webの管理画面はLaravelで作成。 ###### 懸念点 webの管理画面を実装できるかどうか。 管理画面では、ユーザー情報、商品情報(紐づくユーザーの取得、絞り込み検索などがあります。 商品が登録された日時、商品のカテゴリーでの並べ替えも実装したいです。 商品は1つのカテゴリーに属していてユーザーのidを持っているのですが、カテゴリー別での商品の取得、その商品に紐づくユーザーの取得など firestoreでリレーションを取得するような機能が実装できるのかわかっていません。 一般的なアプリにはwebの管理画面がもちろんあると思うのですが、みなさんどのように実装しているのでしょうか。
回答: Firestoreにはリレーション(参照)を保持するデータ型は存在しますが、データ取得時にそれらをJOINすることはできません。データの取得は、1つのコレクションに対して条件に合うドキュメントを取得することぐらいしかできないです。データの結合が必要なら、それぞれデータを取得した後に、自前で行う必要があります。 なのでFirestoreでは、各ドキュメントに必要な情報を冗長化(非正規化)して保持するのが一般的だと思います。 もしある商品やあるカテゴリと関連するユーザ一覧を取得したいなら、ユーザのドキュメントに商品IDのリストやカテゴリIDのリストを含めることで対応します。(もしくは、商品ドキュメントやカテゴリドキュメントのサブコレクションにユーザを追加する) * 冗長化には Firebaes FunctionsのFirestoreトリガーを使う * 検索クエリには配列メンバーシップが使えそう **参考** * Cloud Firestoreを実践投入するにあたって考えたこと * Cloud Firestoreの勘所 パート2 — データ設計 * Firebase Realtime DBを実践投入するにあたって考えたこと ※ Firestoreの一つ前のDBですが、RDBとの違い部分が丁寧に説明されています。 **別解:BigQueryを利用する** 自分は使ったことがありませんが、FirestoreのデータをBigQueryにexportするとSQLのような複雑な集計ができるようです。PHPからも実行できそうし、Extensionを使うとリアルタイムにBigQueryにexportもできるっぽいです。 **別解:RDBも併用する** Firestoreは複雑な検索や集計には向いていないです。すべてをFirestoreで完結させるのが難しいのであれば、RDBを併用することも一つの選択肢だと思います。参考になりそうな記事があったので載せておきます。 RDBとFirebaseのDB両方使ったっていいじゃない もし、アプリ機能より、管理画面側の機能の方が主体なら、RDBのみを使って、Laravelでアプリ向けのAPIを提供する方が適切かもしれません ※ 正直、自分もFirestoreを使ったサービスを1つ作ってみた程度で、しかもまだ最低限の機能しかないので、回答してみたけど、あまり自信はないです。他の人の意見を聞いてみたいけど、あまりこの手の質問に真面目に回答してくれる人は少ないですかね...