【问题标题】:Cloud Firestore: Will fetching references on documents cause additional "reads" to the database?Cloud Firestore:获取文档上的引用会导致对数据库进行额外的“读取”吗?
【发布时间】:2019-04-02 19:17:09
【问题描述】:

我想澄清一下 Cloud Firestore 与 Reference 类型相关的读取定价。在我当前的场景中,我有一个聊天室,其中显示对话中的消息列表。一条消息如下所示...

{
  "id": "...",
  "text": "Hello World",
  "createdBy": Reference(/users/userID)
}

在呈现消息时,我可以访问text,但我还需要访问createdBy 用户。目前,我将 createdBy 引用传递给另一个组件(在 React 中),然后在那里获取该文档以显示用户的头像和用户名。

这运行得很好,但我担心这会导致对话中的每条消息都读取数据库,这可能会很快加起来。我几乎可以肯定这会导致每条消息的读取次数增加,但 Firebase 是否足够智能以缓存用户?

换句话说,如果我有 5 条由 /users/userA 创建的消息,那么每条消息都会被计为对数据库的读取,还是对于对话中的每个用户来说只是一次读取?

如果 Firebase 无法缓存此内容,我似乎需要对数据进行非规范化并在消息文档上复制用户名和头像,而不是仅仅依赖参考本身。不过,这似乎在某种程度上限制了引用的好处。

【问题讨论】:

  • 感谢分享。一般来说,我得出的结论是,非规范化基本数据可能是要走的路。对于我的聊天应用程序,我在每条消息中存储了发送用户的姓名和头像 URL,以及对实际用户的引用。如果用户更改了此信息,这确实会导致旧消息不会更新,但这是我有意识的决定,如果您愿意,可以通过追溯更新旧消息来解决。 (这就是为什么非规范化往往是写重而不是读重的原因。)
  • 对于一些人来说,如果不这样做,为每条消息做参考阅读实际上确实很快就加起来了,我们最终用尽了刚刚开发的免费 Firebase 计划。因此,虽然这可能是一个过早的优化,但至少在我们的案例中还不算太早。

标签: firebase google-cloud-firestore


【解决方案1】:

缓存的文档将被重复使用,并且在访问时不会产生读取。无论您是自己创建 DocumentReference 还是从另一个文档的字段中获取它都没有关系。使用 DocumentReference 读取文档不会导致额外读取。客户必须明确阅读。

【讨论】:

  • 感谢您的验证,这无疑让事情变得容易了一些。那么,使用我所描述的引用而不是对数据进行反规范化通常是安全的吗? (当然,去规范化在某些情况下可能仍然有意义。)
  • 引用只是指向文档的强类型字符串。它们本质上没有什么不安全或昂贵的。
  • 对不起,让我澄清一下。我的意思是在另一个文档上存储对文档的引用,然后基本上进行两次读取(例如阅读消息,并阅读其作者),而不是仅仅在消息本身上存储一些基本数据,如用户名和图片(一次阅读)。
  • 您必须确定最适合您的用例。如果需要,可以选择使用参考。或者,如果需要,您可以将数据复制到多个文档中。没有“正确的方式”——只有你认为最适合你的方式。
  • @JesseDunlap 您可以从 4:37 开始观看 Firebase 官方视频:youtube.com/watch?v=Elg2zDVIcLo&t=277
猜你喜欢
  • 2019-06-22
  • 1970-01-01
  • 2021-03-24
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 2020-06-09
  • 1970-01-01
相关资源
最近更新 更多