firebase - 用于获取用户好友列表的 Firestore 模型

标签 firebase google-cloud-firestore nosql

我已经使用 Firestore 很长时间了。我现在正在构建一个应用程序,可扩展性和保持低成本非常重要。 (我正在使用颤振)

我的应用程序有用户,他们有用户个人资料,他们也可以添加 friend 并与他们交谈(例如 Instagram 或 Facebook)。 我在构建这个好友系统时遇到问题。

我的好友系统模型目前如下所示:

  1. 用户集合。每个文档 id = 来自身份验证的用户 id,这些文档包含姓名、用户名、个人资料图片等数据。
  2. friend 收藏。每个文档 id = auth 中的用户 id。对于每个用户,这些文档包含一个名为:friends 的字段,该字段是一个包含其每个 friend 用户 ID 的数组。 该模型如下所示:
Friends collection:
    - uid:
        - friends_list: [friend_uid1, friend_uid2, ...]

这就是我的“后端”的样子。 现在我想向我的用户显示他的 friend 列表。我该怎么做?

我想要一个看起来像 Instagram 的列表,有一个漂亮的 UI,显示我的每个用户 friend 的个人资料图片、姓名、最后一条消息等。

我找不到使用 Firestore 和查询执行此操作的直接方法。

假设我这样做:

  1. 获取数组中我所有 friend 的用户 ID。
  2. 使用每个文档的 .get() 获取所有用户文档。

这在 firestore 中是不可行的,因为它会消除我拥有的所有查询能力(例如只能查询名为“x”的用户),我必须获取所有用户并在我的前面进行查询 - end(或者在云函数中,同样的事情,不可扩展)。

如果我这样做:

  1. 使用对 Friends 集合中所有用户的查询来获取所有文档,其中 Friends_list 包含我的用户 ID。
  2. 仅从这些文档中保存文档ID,并手动获取所有 friend 的用户数据。

这又带来了另一个问题。在Firestore中,如果不获取文档的所有字段,就无法获取文档,因此我用来仅获取 friend 的ID的第一个查询实际上会给我他们的ID + 他们的 friend 列表(因为当我查询时,它还获取文档 id + 数据),这不好。

如果我这样做:

  1. 当您添加好友时,不要只保存其 uid,而是保存其 uid + 数据。
  2. 现在我可以轻松地向用户展示他的好友列表,并在前端进行一些查询。

这里的问题是,现在如果我的一个 friend 更新了他的个人资料照片,我需要在他所有 friend 的每个文档中更新它,这对于一点点个人资料更新来说是非常昂贵的。

还有观看更多数据的问题,也许我有另一个聊天集合,我想显示我与 friend 聊天的最后一条消息,现在我也必须获取聊天室,这更多很难查询数据,伴随着我之前提到的所有问题。

总结:我没有看到在 Firestore 中实现此类系统的良好可扩展方法。这似乎是一个任何基本应用程序都应该拥有的简单系统,但我不知道如何以一种不会进行大量读取或读取比应有的数据(或敏感数据)更多的数据(或敏感数据)的方式来做到这一点。

对于这样的好友系统,你会做什么样的模型?

最佳答案

您正在描述 NoSQL 数据库的一个典型缺点。 Get to Know Cloud Firestore中实际上给出了类似的例子。系列。

就像其他人评论的那样,答案实际上取决于您的应用程序。这就是您必须要做的评估。比如根据应用程序的使用情况,哪个选项更便宜。

例如,如果您选择第三个选项并存储 friend 的用户数据,则您需要填充列表。这意味着每当用户更新其信息时,您都必须采取措施来保持复制数据的完整性。

然后,您可以查看应用的使用情况,并确定用户更改信息的频率,以及如果您不复制数据来为您的应用找到最便宜的方法,则需要检索完整用户的频率。

关于firebase - 用于获取用户好友列表的 Firestore 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72816720/

相关文章:

firebase - 如何在 Firebase 存储中搜索文件?

ios - 逐步下载 Firebase child iOS

java - Android studio Firestore 两个 Activity 之间的时间戳错误

nosql - 按 Cassandra 中的 map 值查询

mongodb - 不同/聚合查询 Mongodb 数组,修剪尾随空间

firebase - 如何检查通过 FCM 发送到主题的消息的统计信息?

firebase - fireauth检测用户创建

firebase - Flutter StreamSubscription 没有停止或暂停

javascript - 使用 Firebase Cloud Functions 访问地理点?

java - 应用这个词是否适合使用 Redis?