Cloud Firestoreでサブコレクションを使うときに気を付けること
はじめに
こんにちは。GenAiの平賀です。
データのサマリ情報を作る仕組みをCloud Firestoreを用いて実現しようとしたときに、サブコレクションを試したのですが、上手くできなかったので私が躓いた部分について執筆します。
やりたかったこと
RDBのイメージで、以下のようなヘッダー、明細という構成で、明細テーブルがもつ会社ID、日付から会社ID、年月で集約したサマリーテーブルを作成するのがやりたかったことです。
明細
明細ID | ヘッダーID | 日付 | 会社ID | 金額 |
---|---|---|---|---|
111 | 1111 | 2023/08/01 | 1234 | 10000 |
222 | 1111 | 2023/08/10 | 1234 | 15000 |
333 | 1111 | 2023/08/20 | 1234 | 20000 |
444 | 2222 | 2023/09/03 | 2345 | 30000 |
555 | 2222 | 2023/09/10 | 2345 | 40000 |
ヘッダー
ヘッダーID | ユーザーID | ユーザー名 |
---|---|---|
1111 | 11 | Aさん |
2222 | 22 | Bさん |
サマリー(明細データを集約して作成)
会社ID | 年月 | 金額 |
---|---|---|
1234 | 202308 | 45000 |
2345 | 202309 | 70000 |
Cloud Firestoreで定義した場合のデータモデル
データモデルは以下のような階層構造のイメージです。
ヘッダーコレクション
∟ ヘッダードキュメント1
∟ ユーザーID
∟ ユーザー名
∟ 明細サブコレクション
∟ 明細ドキュメント
∟ 日付
∟ 金額
∟ …
∟ ヘッダードキュメント2
∟ ユーザーID
∟ …
∟ …
処理のイメージ
先述したデータモデルで、明細のサブコレクション内にあるドキュメントからサマリーのドキュメントを作成しようとしました。
処理順としては以下のようなイメージです。
- ヘッダーのドキュメントを作成
- ヘッダーのドキュメント内にある明細のサブコレクションにドキュメントを追加
- 明細のサブコレクション内にあるドキュメントからサマリーのドキュメントを作成
困ったこと
RDBの場合、明細テーブルを直接参照して、集約することができます。
しかし、Cloud Firestoreの場合、明細のサブコレクションのドキュメントを参照するためには、まずヘッダーのドキュメントを参照し、そのドキュメントがもつ明細のサブコレクションのドキュメントを参照する必要があります。(先ほどのデータモデルの階層構造を上からたどるようなイメージです。)
毎回階層構造を上からたどるための処理が複雑になったので、よりシンプルかつ素早く作りたい思いもあり、サブコレクションを使うことを断念しました。
結局どうしたのか
明細コレクションとサマリーコレクションをそれぞれ定義しました。
そして、明細とサマリーの両方にシステム性質上一意になる項目を追加しました。
今回の場合では、年月と会社ID(厳密には会社ドキュメントのreference)になります。
集約するときにその項目を使って、明細コレクション内のドキュメントをサマリーして、サマリーコレクション内にドキュメントを作成するようにしました。
開発会社をお探しの方、日本語でのFlutterFlowの技術サポート/設計/開発請負について
上記、興味あればFlutterFlowを使ったアプリ開発の技術サポートや、設計・開発の請負も弊社では行っているので興味あればお声がけください!
開発会社をお探しであれば、通常の要件定義から設計・実装また保守まで対応可能です。ローコードならではの迅速な開発や、費用感を抑えた開発をご希望の方はぜひご連絡ください。
サービスページ: https://studio.genai.co.jp/
弊社お問い合わせ先→ info@genai.co.jp
では!
Discussion