DB结构来处理类似电报/ FB信使

问题描述:

聊天组目前做一个聊天应用,在那里用户可以加入多个聊天组,类似于电报和Facebook Messenger中有事。非常直截了当。我们主要使用Firebase数据库来存储聊天组和消息详细信息。DB结构来处理类似电报/ FB信使

示例数据库结构:

只得到聊天组的用户有:

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

然后,我们从不同的节点,同时在最新的聊天消息得到了聊天群的细节该组:以上

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

一切得到的数据,看起来像这样的单组项目:

enter image description here

所有工作正常。我们最初最多可以获得最多5个聊天组,然后对这个列表进行排序。问题在于,我们必须监听聊天群组的更新 - 最近聊天消息的群组将进入列表的顶部。

我们只听特定用户所在组的列表 - 我们可以检测用户加入的组(onChildAdded)和左(onChildRemoved),但它不包含我们需要排序的时间戳聊天组列表由最近更改的时间戳记组成。

有没有人尝试过(我们正在做一个客户端Android版和Web两种 - JavaScript)的之前,火力地堡这个类似的行为?任何想法或建议,将不胜感激。如果你需要一些相关的细节让事情更清楚,请告诉我。

+1

在这样的情况下,我会考虑保持'lastUpdated'时间戳,如果聊天组每个用户的指标,所以'$ chatGroupId:1508508569108'。根据组中成员的数量,更新这些时间戳可能是相当昂贵的扇出操作。但我不会立即看到许多其他选择。 –

+0

@FrankvanPuffelen谢谢Puf。是啊。我们想到了同样的事情。我们预计聊天群组中最多有300个用户,所以对每个用户写信都会很昂贵。 –

+0

这的确听起来有点过分。一个用户平均有多少个组?因为如果更小,您还可以为每个用户保留一个组ID的索引,为每个组加载元数据/上次修改的组,并在客户端对它们进行排序。 –

因为在火力地堡时,加入一个孩子,更新或删除,也因为那些操作不包含您正在搜索的信息,有关无自动创建的元数据,您需要通过添加创建自己的机制本地时间戳为每个操作或由writing a server-side timestamp

还有一个办法,可以在其中使用非规范化。将这些聊天添加到名为uxChats的新创建的部分。聊天记录只需要包含text messagetimestamp。如果你正在使用FirebaseUI那么你可以反向只是用这个代码行的顺序:

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

最新聊天的推移顶部。

希望它可以帮助AL。

+0

嗨,亚历克斯。谢谢。我们已经意识到行为和通常的机制。我的目标是建议一个能够最好地利用Firebase DB行为的结构,以便我们可以生成UX - 最新的聊天自动功能*。 –

+0

用新想法更新了答案。 –