【发布时间】: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