Firestore:数组与子文档集的性能比较

12

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

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

我开始使用数组来存储用户的消息。这种方法的问题在于,没有办法添加或插入新条目,每当一个新消息被提交到聊天室时,就必须保存一个带有新消息附加的新副本。这似乎是一种不太可扩展的方式,除非将聊天历史记录分成子数组等等。

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


3
将一个聊天室中的所有消息存储到单个文档中,很快就会导致文档超过1MB的限制。在多用户环境中使用数组是不明智的,正如 这篇博客文章所解释的那样。针对每个聊天消息使用单独的文档似乎是最简单的方法,因为文档也推荐这样做,那么为什么你认为有其他更好的方法呢? - Frank van Puffelen
1
不,你说得对,我只是没有使用过NoSQL数据库,从MySQL的背景出发,我发现很多东西都有点违反直觉。 - Jimmy H.
2个回答

11

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

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


嗨,托德,你能告诉我如何存储对特定消息的回复吗?在消息文档中使用名为“replies”的数组还是子集合? - RL Shyam

-1

关于Todd的观点,我想补充一点:

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


你确定吗?我在数组中存储时间戳没有任何问题。 - Martin Nuc
1
当我发布这个答案时,这是不可能的。请注意,我指的是Firestore的时间戳。 - Minas Mina
2
我这样做。至于今天,可以在Firestore数组中存储Firestore时间戳。 - Martin Nuc
1
那太好了,听起来不错 :) - Minas Mina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接