【问题标题】:firestore: arrays vs sub collection of documents performancefirestore:数组与文档子集合的性能
【发布时间】:2018-06-03 02:38:45
【问题描述】:

我想问在开发聊天应用程序时是否有 Firestore 的最佳实践,以及为聊天室存储消息的最佳实践是什么。

这里的假设是每个聊天室都有自己的文档。

我开始使用数组来存储来自用户的消息。这种方法的问题在于,每次向聊天室提交新消息时,无法添加插入(附加)新条目。必须保存附加新消息的数组的新副本。除非聊天记录被分成子数组等,否则这看起来会非常糟糕。

在官方文档中,他们建议了一种结构,其中应该将特定聊天室的消息作为单独的文档存储在该聊天室的子集合中。我想知道这种方法是否最好,会有哪些缺点,或者是否有另一种首选方法。

【问题讨论】:

  • 将聊天室的所有消息存储到单个文档中会很快将您带到大于允许大小 1MB 的文档。如this blog post 中所述,在多用户环境中使用数组是个坏主意。为每条聊天消息使用单独的文档似乎是最简单的。鉴于文档也引导您朝那个方向发展,您为什么认为另一种方法更好?
  • 不,你是对的,我只是没有使用 nosql 数据库的经验,而且我发现很多事情都来自 mysql 背景的直觉

标签: javascript arrays firebase google-cloud-firestore


【解决方案1】:

我通常会采用“每个聊天室都有一个消息子集合。每个新消息都是该子集合中的一个单独文档”的方法。这有几个优点:添加或编辑单个消息很容易,并且您可以执行许多不同的查询(例如“获取 20 条最近的消息”)

我想,最大的缺点是,如果您发现新用户经常进入您的聊天室,并且希望在他们加入之前查看房间的整个聊天记录,那将导致大量数据库读取。但实际上,我不知道这种情况在现实生活中会发生多少次,您可以通过使用分页来批量抓取您的历史聊天来缓解这种情况。

【讨论】:

  • 嗨,托德,您能告诉我如何存储对特定消息的回复吗?在消息文档或子集合中使用名为“replies”的数组?
【解决方案2】:

补充托德所说的:

您不能在数组中存储时间戳 - 这对您的情况来说是一个很大的缺点,因为您需要消息发送的时间。

【讨论】:

  • 你确定吗?我将时间戳存储在数组中,没有任何问题。
  • 当我发布这个答案时,这是不可能的。请注意,我指的是 Firestore 的时间戳。
  • 我这样做了。至于今天,可以将 Firestore 时间戳存储在 Firestore 数组中。
  • 那太好了 :)
猜你喜欢
  • 1970-01-01
  • 2018-10-21
  • 2020-08-25
  • 2020-07-26
  • 2021-05-12
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多