当我的数据非规范化时(Firebase),如何按上次更新时间对我的聊天组进行排序?

2024-04-16

我正在使用 Firebase(和 AngularJS)构建一个聊天应用程序,并且我有一个与上的数据结构类似的数据结构此 Firebase 文档页面 https://firebase.google.com/docs/database/web/structure-data#fanout。这种结构有利于不必检索大量不需要的数据,但我似乎不明白一件非常简单的事情。

当用户连接到我的应用程序时,我的数据如下所示:

如何检索他们最近更新的 10 个群组并在群组中发布新消息时保持此列表更新?

// An index to track Ada's memberships
{
  "users": {
    "alovelace": {
      "name": "Ada Lovelace",
      // Index Ada's groups in her profile
      "groups": {
         // the value here doesn't matter, just that the key exists
         "techpioneers": true,
         "womentechmakers": true
      }
    },
    ...
  },
  "groups": {
    "techpioneers": {
      "name": "Historical Tech Pioneers",
      "members": {
        "alovelace": true,
        "ghopper": true,
        "eclarke": true
      },
      "lastUpdateTime": [SOME TIMESTAMP HERE]
    },
    ...
  }
}

如果您愿意阅读更多信息


如你所见,我添加了"lastUpdateTime": [SOME TIMESTAMP HERE]上面的代码,因为这就是我为我的应用程序所做的事情。我无法弄清楚用户组列表的“刷新过程”应该是什么。

如果我的用户有 100 个组,我是否应该检索组 ID 列表并一一获取实际组,以便只能保留最近的 10 个组(我很确定这不是正确的方法)?

此外,每当有人在群组中发布消息时,它都会更新lastUpdateTime在 Firebase 中,但如何使用户组列表与此保持同步?

我尝试过一些非常丑陋的子事件、orderBys 以及每当有东西触发时执行的整个函数链的组合,但它不起作用,而且看起来非常复杂,毫无意义。扁平化数据的整个想法是将查询/获取保持在最低限度,我觉得到目前为止我所做的事情太繁重了。


要显示最近更新的 10 个组的列表:

ref.child("groups").orderByChild("lastUpdateTime").limitToLast(10)

如果您使用此方法,请进一步展平您的数据,因为查询现在最终将检索每个组的成员,而显示组列表不需要这样做。

如果您想要按上次更新的顺序获得用户订阅的组列表,您有以下几种选择:

  • 存储每个用户订阅的最后更新时间戳
  • 加载用户组并在客户端重新排序

存储每个用户订阅的最后更新时间戳

存储订阅该组的每个用户上次更新该组的时间戳:

“用户组”:{ “爱乐蕾丝”:{ // 该值是该组上次更新的时间戳 “科技先锋”:14952982198532978, “女性科技创客”:14852982198532979 },

您会注意到,我在这里将组成员身份与用户配置文件分开,因为您不应该嵌套如此松散相关的数据。

然后您可以使用以下命令以正确的顺序获取用户组的列表:

ref.child("usersgroups/alovelace").orderByValue()

这种方法的主要问题是您需要更新所有成员的群组的时间戳。因此写入变得更加昂贵。

加载用户组并在客户端重新排序

这听起来可能会比较慢,但实际上不会太糟糕。由于您只加载用户所属的组,因此该数字不会太高。 Firebase 会通过管道处理请求,因此性能比您预期的要好得多。看通过使用查询而不是重复观察单个事件来加快为我的社交网络应用程序获取帖子的速度 https://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using-query-instead-of-obse/35932786#35932786

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我的数据非规范化时(Firebase),如何按上次更新时间对我的聊天组进行排序? 的相关文章

随机推荐