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

时间:2018-10-22 10:37:45

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

我一直在使用Firebase RTDB,并将其迁移到Firestore。

我有与许多其他节点关联的userId。

例如,我有usersmessagespurchases

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

现在,我意识到在数据查询方面,firestore比RTDB更好,并且将messagespurchases收集到dateuser

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

2 个答案:

答案 0 :(得分:1)

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

-

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

PS:提示,文档也可以引用集合。例如,收集->文档->收集->文档..等等。

答案 1 :(得分:1)

从广义上讲,将重复数据存储在NoSQL数据库中的最佳方法完全取决于项目的需求。没有一种适合所有人的正确解决方案。

您必须问一些有关要复制的数据的问题:

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

如果需要更改重复的数据并保持同步,那么您可能很难将所有重复的数据保持最新状态,并且可能会花费很多金钱来使所有这些文档保持最新状态,因为这需要读取并为每个文档写出每个更改。

如果您需要非常快速的查询,则可能希望复制更多的数据,以便客户端只需要为每个查询项目读取一个文档,而不是多个文档。但是您也许还可以依靠本地客户端缓存使此便宜,这取决于客户端必须读取的数据。

最后,对于您是否要复制某些数据的选择,它很大程度上取决于您的数据及其特征。您将不得不逐案考虑。