我实际上是编程和 Firebase 方面的新手。我需要知道这两种情况中哪一种更好。
我正在制作一个 Activity 应用程序。如果用户将参加该 Activity ,我会在嵌套在“用户”集合中的子集合“attendedEvents”中编写一个文档,如下所示:
然后,我需要管理并向客户端应用程序显示该参加 Activity 的完整数据,我需要显示位置、坐标、地点等数据。
有两种方法可以保存参加过的 Activity 数据
1. 我只是在“attendedEvents”子集合中写入 eventID。像这样
然后当我需要显示完整数据时,我需要执行 2 个步骤。首先,我获取该“attendedEvents”子集合中的所有 eventID,然后专门根据 eventID 进行查询以获取完整的事件数据。
2. 我在“attendedEvents”子集合字段中写入所有事件数据,而不仅仅是 eventID。像这样
所以当我需要在客户端应用程序中显示事件数据时,我只需要执行一个查询来引用“attendedEvents”子集合。
这两者的优缺点是什么?
老实说我不太确定选择。但目前我会选择只写 eventID,因为在 firebase 中有存储定价,即使当我向客户端应用程序显示参加的事件数据时,数据实时同步并不是真正需要的。
网络带宽如何?因为您需要为 Cloud Firestore 请求使用的网络带宽付费,因为第一个选择需要更多带宽,对吗?我不是很了解这个网络带宽
最佳答案
这两种方法都是有效的,并且没有哪一种方法比另一种方法更好。这完全取决于您的用例是什么,以及您对复制数据的适应程度。
在第一种方法中,您写入的重复数据非常少(几乎只是 ID)。因此,这意味着用于写入这些数据的代码将非常简单且非常快。但是在读取数据时,您将需要从两个集合中加载数据。对于合理数量的文档,这通常不是一个大的性能问题,但确实需要更多代码和更多 API 调用。
在第二种方法中,您可以为每个 attendedEvents
文档复制一个事件的所有数据。这意味着写入此数据的代码更加复杂,并且您肯定会存储更多数据。您需要弄清楚是否以及如何使其保持最新(有关更多信息,请参阅 my answer here)。但另一方面,读取 attendedEvent
文档现在可以一次性为您提供有关事件文档的所有信息。
这是 NoSQL 数据库中的一个常见考虑因素:您通常需要考虑写入性能和磁盘存储与读取性能和可伸缩性。正如我一开始所说的:没有任何答案在所有情况下都是最好的。这完全取决于您的应用最重要的标准是什么。
关于android - 我应该在 Firestore 的字段文档中只写标识符还是写所有数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50918681/