【发布时间】: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