您如何在 Firestore 中存储重复数据?
Posted
技术标签:
【中文标题】您如何在 Firestore 中存储重复数据?【英文标题】:How do you store duplicate data in firestore? 【发布时间】:2019-03-26 09:50:47 【问题描述】:我一直在使用 firebase RTDB,我打算将它迁移到 firestore。
我有与许多其他节点相关联的用户 ID。
例如,我有users
、messages
、purchases
。
为了将用户与其他集合关联,我使用了users_messages/$date/$userId/$messageId
、purchases/$date/$userId/$purchaseId
,因为 RTDB 不支持复杂查询,我希望能够查询特定用户的日期范围之间的消息。
现在我意识到 firestore 在数据查询方面比 RTDB 好得多,并且将拥有 messages
、purchases
与 date
和 user
的集合。
在这种情况下,我应该将userId
还是整个user
文档存储在messages
和purchases
集合中?
【问题讨论】:
【参考方案1】:一般来说,在 NoSQL 数据库中存储重复数据的最佳方式完全取决于项目的要求。没有一个适合每个人的正确解决方案。
您必须对要复制的数据提出一些问题:
-
它是静态的,还是会随着时间而变化?
如果确实发生了变化,您是否需要更新每个重复的数据实例以使它们保持同步?
您是针对性能还是成本进行优化?
如果您的重复数据需要更改并保持同步,那么您可能很难让所有这些重复数据保持最新,并且您可能会花费大量资金来保持所有这些文档的最新状态,因为这需要阅读并为每个文档编写每个更改。
如果您需要非常快速的查询,您可能希望复制更多数据,以便客户端只需读取每个查询项目的一个文档,而不是多个文档。但是您也可以依赖本地客户端缓存,这会降低成本,具体取决于客户端必须读取的数据。
最后,对于是否复制某些数据的选择,很大程度上取决于您的数据及其特征。您必须根据具体情况考虑。
【讨论】:
【参考方案2】:您可以简单地输入userId
并定义一个新集合users
,其中包含每个userId
的描述作为文档及其关联数据。
关于 -
-
消息 -> 日期 -> 用户 ID -> 消息 ID
购买 -> 日期 -> 用户 ID -> 购买 ID
用户 -> 用户 ID -> 详细信息
PS:只是一个提示,一个文档也可以引用一个集合。比如集合->文档->集合->文档..等等..
【讨论】:
这是否意味着我也应该在 firestore 中运行两个查询以获取消息的用户? 是的,我不知道您的用例,但在存储方面,这就是我期待的方式,因为放置整个用户文档会导致不必要的数据重复结尾。 @emil 检查了您的编辑,我认为应该是这样,您在一个范围内查询用户 ID,您获取详细信息,如果您需要用户 ID 详细信息,则从您的用户集合中获取它们。 @emil以上是关于您如何在 Firestore 中存储重复数据?的主要内容,如果未能解决你的问题,请参考以下文章
Vue Firestore 查询。 Firestore更新数据时如何避免重复?
如何在 Swift 中重构重复的 Firestore 文档 ID?