您如何在 Firestore 中存储重复数据?

Posted

技术标签:

【中文标题】您如何在 Firestore 中存储重复数据?【英文标题】:How do you store duplicate data in firestore? 【发布时间】:2019-03-26 09:50:47 【问题描述】:

我一直在使用 firebase RTDB,我打算将它迁移到 firestore。

我有与许多其他节点相关联的用户 ID。

例如,我有usersmessagespurchases

为了将用户与其他集合关联,我使用了users_messages/$date/$userId/$messageIdpurchases/$date/$userId/$purchaseId,因为 RTDB 不支持复杂查询,我希望能够查询特定用户的日期范围之间的消息。

现在我意识到 firestore 在数据查询方面比 RTDB 好得多,并且将拥有 messagespurchasesdateuser 的集合。

在这种情况下,我应该将userId 还是整个user 文档存储在messagespurchases 集合中?

【问题讨论】:

【参考方案1】:

一般来说,在 NoSQL 数据库中存储重复数据的最佳方式完全取决于项目的要求。没有一个适合每个人的正确解决方案。

您必须对要复制的数据提出一些问题:

    它是静态的,还是会随着时间而变化? 如果确实发生了变化,您是否需要更新每个重复的数据实例以使它们保持同步? 您是针对性能还是成本进行优化?

如果您的重复数据需要更改并保持同步,那么您可能很难让所有这些重复数据保持最新,并且您可能会花费大量资金来保持所有这些文档的最新状态,因为这需要阅读并为每个文档编写每个更改。

如果您需要非常快速的查询,您可能希望复制更多数据,以便客户端只需读取每个查询项目的一个文档,而不是多个文档。但是您也可以依赖本地客户端缓存,这会降低成本,具体取决于客户端必须读取的数据。

最后,对于是否复制某些数据的选择,很大程度上取决于您的数据及其特征。您必须根据具体情况考虑。

【讨论】:

【参考方案2】:

您可以简单地输入userId 并定义一个新集合users,其中包含每个userId 的描述作为文档及其关联数据。

关于 -

    消息 -> 日期 -> 用户 ID -> 消息 ID 购买 -> 日期 -> 用户 ID -> 购买 ID 用户 -> 用户 ID -> 详细信息

PS:只是一个提示,一个文档也可以引用一个集合。比如集合->文档->集合->文档..等等..

【讨论】:

这是否意味着我也应该在 firestore 中运行两个查询以获取消息的用户? 是的,我不知道您的用例,但在存储方面,这就是我期待的方式,因为放置整个用户文档会导致不必要的数据重复结尾。 @emil 检查了您的编辑,我认为应该是这样,您在一个范围内查询用户 ID,您获取详细信息,如果您需要用户 ID 详细信息,则从您的用户集合中获取它们。 @emil

以上是关于您如何在 Firestore 中存储重复数据?的主要内容,如果未能解决你的问题,请参考以下文章

Vue Firestore 查询。 Firestore更新数据时如何避免重复?

合并 Firestore 查询时出现重复数据

如何在 Swift 中重构重复的 Firestore 文档 ID?

如何从数组中删除重复数据

是否可以在Cloud Firestore中查询多个文档子集合? [重复]

如何在android Firestore上实现Paginate查询[重复]