首页 > 解决方案 > 我应该只写标识符还是在 Firestore 的字段文档中写所有数据?

问题描述

我实际上是编程和 Firebase 的新手。我需要知道这两种情况之间哪一种更好。

我正在制作一个活动应用程序。如果用户将参加活动,我会在嵌套在“users”集合中的子集合“attendedEvents”中编写一个文档,如下所示:

在此处输入图像描述

然后,我需要管理该参加活动的完整数据并将其显示到客户端应用程序,我需要显示位置、坐标、场地等数据。

有两种方法可以保存参加的活动数据

1.我只是在“attendedEvents”子集合中写了eventID。像这样

在此处输入图像描述

然后当我需要显示完整数据时,我需要执行 2 个步骤。首先,我在“attendedEvents”子集合中获取所有 eventID,然后专门根据 eventID 进行查询以获取完整的事件数据。

2.我在“attendedEvents”子集合字段中写入所有事件数据,而不仅仅是 eventID。像这样

在此处输入图像描述

所以当我需要在客户端应用程序中显示事件数据时,我只需要执行一个查询来引用“attendedEvents”子集合。

这两者之间的优缺点是什么?

老实说,我不确定选择。但目前我会选择只写 eventID,因为在 firebase 中有存储定价,即使当我将参加的事件数据显示到客户端应用程序时,数据实时同步并不是真正需要的。

网络带宽怎么样?因为您需要为 Cloud Firestore 请求使用的网络带宽付费,因为第一个选择需要更多带宽,对吗?我不太了解这个网络带宽

标签: androidiosfirebasegoogle-cloud-firestore

解决方案


两者都是有效的方法,并且它们都没有比另一个更好。这完全取决于您的用例是什么,以及您对复制数据的舒适程度。

在您的第一种方法中,您编写的重复数据很少(几乎只是 ID)。因此,这意味着您编写此数据的代码将非常简单且非常快速。但是在读取数据时,您需要从两个集合中加载数据。对于合理数量的文档,这通常不是一个大的性能问题,但肯定需要更多的代码和更多的 API 调用。

在您的第二种方法中,您复制每个attendedEvents文档的事件的所有数据。这意味着编写此数据的代码更复杂,而且您肯定会存储更多数据。而且您需要弄清楚是否以及如何使其保持最新状态(有关此内容的更多信息,请参见我的答案)。但另一方面,attendedEvent现在阅读文档会在一次阅读中为您提供有关事件文档的所有信息。

这是 NoSQL 数据库中的一个常见考虑因素:您通常必须考虑写入性能和磁盘存储与读取性能和可伸缩性。正如我开始所说:没有在所有情况下都是最好的答案。这一切都取决于您的应用程序最重要的标准是什么。


推荐阅读