【问题标题】:How do you store duplicate data in firestore?您如何在 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 集合中?

【问题讨论】:

    标签: javascript node.js firebase google-cloud-firestore


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      关于 -

      1. 消息 -> 日期 -> 用户 ID -> 消息 ID
      2. 购买 -> 日期 -> 用户 ID -> 购买 ID
      3. 用户 -> 用户 ID -> 详细信息

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

      【讨论】:

      • 这是否意味着我也应该在 firestore 中运行两个查询以获取消息的用户?
      • 是的,我不知道您的用例,但在存储方面,这就是我期待的方式,因为放置整个用户文档会导致不必要的数据重复结尾。 @emil
      • 检查了您的编辑,我认为应该是这样,您在一个范围内查询用户 ID,您获取详细信息,如果您需要用户 ID 详细信息,则从您的用户集合中获取它们。 @emil
      猜你喜欢
      • 2020-06-19
      • 1970-01-01
      • 2020-07-27
      • 2020-08-08
      • 2021-08-11
      • 1970-01-01
      • 2019-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多