【问题标题】:DB structure to handle chat groups similar to Telegram/FB Messenger用于处理类似于 Telegram/FB Messenger 的聊天组的 DB 结构
【发布时间】:2018-04-01 12:55:11
【问题描述】:

目前正在开发一个用户可以加入多个聊天组的聊天应用,类似于 Telegram 和 Facebook Messenger 的应用。很直接。我们主要使用 Firebase 数据库来存储聊天组和消息详细信息。

示例数据库结构:

仅获取用户拥有的聊天组:

root/
users/
  chatGroups/
    $uid/
      $chatGroupId: true

然后我们从不同的节点获取聊天组的详细信息,与该组中的最新聊天消息相同:

root/
chatGroups/
  entries/
    $groupId/
      group details here...
  messages/
    $groupId/
      $messageId/
        message details here..

以上所有内容都用于获取单个组项的数据,如下所示:

一切正常。我们最初最多得到 5 个聊天组,然后对列表进行排序。问题在于我们必须监听聊天群组的更新——拥有最新聊天消息的群组会排在列表顶部。

我们的结构只监听特定用户拥有的组列表——我们可以检测到用户加入 (onChildAdded) 和离开 (onChildRemoved) 的组,但它不包含我们的时间戳需要按最近更改的时间戳对聊天组列表进行排序。

之前有没有人用 Firebase 尝试过这种类似的行为(我们正在为 Android 和 Web 做一个客户端——Javascript)?任何想法或建议将不胜感激。如果您需要一些相关细节以使事情更清楚,请告诉我。

【问题讨论】:

  • 在这种情况下,如果聊天组,我会考虑在每个用户的索引中保留lastUpdated 时间戳,所以$chatGroupId: 1508508569108。根据组中成员的数量,更新这些时间戳可能是一项非常昂贵的扇出操作。但我没有立即看到许多其他选择。
  • @FrankvanPuffelen 谢谢Puf。是的。我们想到了同样的事情。我们预计一个聊天组中最多有 300 个用户,所以是的,给每个用户写信会很昂贵。
  • 这听起来确实有点过分。一个用户平均会在多少个组中?因为如果它更小,您还可以为每个用户保留组 ID 的索引,为每个组加载元数据/lastmodified,并在客户端对它们进行排序。
  • 我的猜测是每个用户有 10-20 个组,我们还有一个类似管理员的用户,可能超过 50 到可能 100。目前,我们只是直接附加用户和拉取所有数据。对于客户端,我继续启用磁盘持久性,希望它有助于减少调用(没有重复调用)。但是,如果我们确实发现它确实给用户带来了糟糕的用户体验(更长的等待时间等),我们计划继续实施手动刷新(下拉刷新),我们认为这是最便宜的解决方法到目前为止。
  • 在这种情况下,我会考虑在这 10 到 20 个组中保留听众,这意味着只有当组的时间戳发生变化时,您才会获得流量 - 更可能是随着时间的推移保持稳定的流量。

标签: javascript android firebase firebase-realtime-database


【解决方案1】:

由于 Firebase 中没有关于何时添加、更新或删除孩子的自动创建的元数据,而且由于这些操作不包含您正在搜索的信息,您需要通过添加本地来创建自己的机制每个操作的时间戳或writing a server-side timestamp。

还有另一种方法可以使用非规范化。将这些聊天添加到名为 uxChats 的新创建部分。聊天只需要包含text message 和timestamp。如果您使用的是FirebaseUI,那么您可以使用以下代码行反转顺序:

LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
layoutManager.setReverseLayout(true);
layoutManager.setStackFromEnd(true);
recyclerView.setLayoutManager(layoutManager)

最新聊天排在最前面。

希望对 AL 有所帮助。

【讨论】:

  • 嗨,亚历克斯。谢谢。我们已经知道这些行为和通常的机制。我的目标是让某人提出一个最能利用 Firebase DB 行为的结构,以便我们可以生成 UX -- 最新的聊天自动放在上面。
  • 用新的想法更新了答案。
猜你喜欢
  • 2019-04-27
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 2015-08-10
  • 2011-05-20
相关资源
最近更新 更多