android - 我应该只写标识符还是在 Firestore 的字段文档中写所有数据?
问题描述
我实际上是编程和 Firebase 的新手。我需要知道这两种情况之间哪一种更好。
我正在制作一个活动应用程序。如果用户将参加活动,我会在嵌套在“users”集合中的子集合“attendedEvents”中编写一个文档,如下所示:
然后,我需要管理该参加活动的完整数据并将其显示到客户端应用程序,我需要显示位置、坐标、场地等数据。
有两种方法可以保存参加的活动数据
1.我只是在“attendedEvents”子集合中写了eventID。像这样
然后当我需要显示完整数据时,我需要执行 2 个步骤。首先,我在“attendedEvents”子集合中获取所有 eventID,然后专门根据 eventID 进行查询以获取完整的事件数据。
2.我在“attendedEvents”子集合字段中写入所有事件数据,而不仅仅是 eventID。像这样
所以当我需要在客户端应用程序中显示事件数据时,我只需要执行一个查询来引用“attendedEvents”子集合。
这两者之间的优缺点是什么?
老实说,我不确定选择。但目前我会选择只写 eventID,因为在 firebase 中有存储定价,即使当我将参加的事件数据显示到客户端应用程序时,数据实时同步并不是真正需要的。
网络带宽怎么样?因为您需要为 Cloud Firestore 请求使用的网络带宽付费,因为第一个选择需要更多带宽,对吗?我不太了解这个网络带宽
解决方案
两者都是有效的方法,并且它们都没有比另一个更好。这完全取决于您的用例是什么,以及您对复制数据的舒适程度。
在您的第一种方法中,您编写的重复数据很少(几乎只是 ID)。因此,这意味着您编写此数据的代码将非常简单且非常快速。但是在读取数据时,您需要从两个集合中加载数据。对于合理数量的文档,这通常不是一个大的性能问题,但肯定需要更多的代码和更多的 API 调用。
在您的第二种方法中,您复制每个attendedEvents
文档的事件的所有数据。这意味着编写此数据的代码更复杂,而且您肯定会存储更多数据。而且您需要弄清楚是否以及如何使其保持最新状态(有关此内容的更多信息,请参见我的答案)。但另一方面,attendedEvent
现在阅读文档会在一次阅读中为您提供有关事件文档的所有信息。
这是 NoSQL 数据库中的一个常见考虑因素:您通常必须考虑写入性能和磁盘存储与读取性能和可伸缩性。正如我开始所说:没有在所有情况下都是最好的答案。这一切都取决于您的应用程序最重要的标准是什么。
推荐阅读
- yarnpkg - 使用 Yarn 2 的 PnP 运行脚本
- c# - 如何构建面包屑样式文本
- android - 修改协程用例的返回类型
- python - 我在安装 tensorflow、keras 和 pytorch 方面需要帮助
- ios - 使用 Apple 登录 - 交换标识符 - 请求无效
- sql - 意外获得总计 109%(而不是 100%)的总和
- vue.js - Gridsome 工作流页面名称和道具
- amazon-web-services - 如何为 Cloudformation 识别此 yaml 文件的错误配置
- angular - 创建一个新的 Angular 应用程序
- python - Discord.py API:当用户输入“bingo”时循环不会中断