我已经使用 Firestore 很长时间了。我现在正在构建一个应用程序,可扩展性和保持低成本非常重要。 (我正在使用颤振)
我的应用程序有用户,他们有用户个人资料,他们也可以添加 friend 并与他们交谈(例如 Instagram 或 Facebook)。 我在构建这个好友系统时遇到问题。
我的好友系统模型目前如下所示:
- 用户集合。每个文档 id = 来自身份验证的用户 id,这些文档包含姓名、用户名、个人资料图片等数据。
- friend 收藏。每个文档 id = auth 中的用户 id。对于每个用户,这些文档包含一个名为:friends 的字段,该字段是一个包含其每个 friend 用户 ID 的数组。 该模型如下所示:
Friends collection:
- uid:
- friends_list: [friend_uid1, friend_uid2, ...]
这就是我的“后端”的样子。 现在我想向我的用户显示他的 friend 列表。我该怎么做?
我想要一个看起来像 Instagram 的列表,有一个漂亮的 UI,显示我的每个用户 friend 的个人资料图片、姓名、最后一条消息等。
我找不到使用 Firestore 和查询执行此操作的直接方法。
假设我这样做:
- 获取数组中我所有 friend 的用户 ID。
- 使用每个文档的 .get() 获取所有用户文档。
这在 firestore 中是不可行的,因为它会消除我拥有的所有查询能力(例如只能查询名为“x”的用户),我必须获取所有用户并在我的前面进行查询 - end(或者在云函数中,同样的事情,不可扩展)。
如果我这样做:
- 使用对 Friends 集合中所有用户的查询来获取所有文档,其中 Friends_list 包含我的用户 ID。
- 仅从这些文档中保存文档ID,并手动获取所有 friend 的用户数据。
这又带来了另一个问题。在Firestore中,如果不获取文档的所有字段,就无法获取文档,因此我用来仅获取 friend 的ID的第一个查询实际上会给我他们的ID + 他们的 friend 列表(因为当我查询时,它还获取文档 id + 数据),这不好。
如果我这样做:
- 当您添加好友时,不要只保存其 uid,而是保存其 uid + 数据。
- 现在我可以轻松地向用户展示他的好友列表,并在前端进行一些查询。
这里的问题是,现在如果我的一个 friend 更新了他的个人资料照片,我需要在他所有 friend 的每个文档中更新它,这对于一点点个人资料更新来说是非常昂贵的。
还有观看更多数据的问题,也许我有另一个聊天集合,我想显示我与 friend 聊天的最后一条消息,现在我也必须获取聊天室,这更多很难查询数据,伴随着我之前提到的所有问题。
总结:我没有看到在 Firestore 中实现此类系统的良好可扩展方法。这似乎是一个任何基本应用程序都应该拥有的简单系统,但我不知道如何以一种不会进行大量读取或读取比应有的数据(或敏感数据)更多的数据(或敏感数据)的方式来做到这一点。
对于这样的好友系统,你会做什么样的模型?
最佳答案
您正在描述 NoSQL 数据库的一个典型缺点。 Get to Know Cloud Firestore中实际上给出了类似的例子。系列。
就像其他人评论的那样,答案实际上取决于您的应用程序。这就是您必须要做的评估。比如根据应用程序的使用情况,哪个选项更便宜。
例如,如果您选择第三个选项并存储 friend 的用户数据,则您需要填充列表。这意味着每当用户更新其信息时,您都必须采取措施来保持复制数据的完整性。
然后,您可以查看应用的使用情况,并确定用户更改信息的频率,以及如果您不复制数据来为您的应用找到最便宜的方法,则需要检索完整用户的频率。
关于firebase - 用于获取用户好友列表的 Firestore 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72816720/