用于一对一消息传递的 Firebase 数据库结构?

Posted

技术标签:

【中文标题】用于一对一消息传递的 Firebase 数据库结构?【英文标题】:Firebase database structure for one-on-one messaging? 【发布时间】:2021-10-05 13:12:34 【问题描述】:

我对 Firebase 比较陌生,我正在尝试找出构建我的数据库以进行 1:1 聊天的最佳方法。

它基本上必须像 Whatsapp 一样运行 - 当有人发送消息然后将对话放在列表顶部时,您的活动对话位于左侧,右侧是基本的一对一聊天。

现在我最好的方法是创建一个 Firestore“聊天”集合

chats : 
chat :  users : [user_id, user_id], messages : user_id, message, created_at created_at  

这个解决方案是否允许我:

根据登录用户获取所有聊天记录?

然后按日期对返回的聊天进行排序?

从消息集合中为每个返回的聊天获取最新消息?

在收到新消息时更改聊天顺序并更新最新消息?

如果所有这些都是可行的,这会有效还是有更好的方法?

任何帮助将不胜感激 - 谢谢!

【问题讨论】:

如果您有兴趣,我已经在我的tutorials 之一中解释了如何创建一个完整且功能齐全的 Firestore 聊天应用程序。 【参考方案1】:

登录用户如何与他们参与的任何特定聊天相关联?

鉴于“user_id”嵌套在 chat 文档中,目前您的结构似乎无法轻松处理此问题。

就个人而言,这就是我会做的。

首先我将创建 2 个集合,一个名为 chats 一个名为 usersusers 将具有以下结构:

"users": 
    "userID_1": 
        "name": "John",
        "surname": "Smith",
        "chats": [
            "chatID_1",
            "chatID_2",
            "chatID_3"
        ]
    ,
    "userID_2": 
        "name": "Betty",
        "surname": "Sue",
        "chats": [
            "chatID_1",
            "chatID_4"
        ]
    

聊天将改为这样存储:

"chats": 
    "chatID_1": 
        "chatName": "foo",
        "otherInfo": "..",
        "messages": 
             "messageID_1": "senderID": "..", "message": "..", "timestamp": 999,
             "messageID_2": "senderID": "..", "message": "..", "timestamp": 999
        
    ,
    "chatID_2": 
        "chatName": "bar",
        "otherInfo": "..",
        "messages": 
            ...
        
    

这样,当用户登录时,您可以通过查询users.userID.chats轻松获取他的所有聊天记录,并通过查询chats.chatID.messages检索任何选定聊天的内容。

【讨论】:

谢谢,这似乎是正确的做法,并且与我正在查看的另一篇文章保持一致 skcript.com/svr/… 没有问题,如果你喜欢,记得给答案投票 :) !

以上是关于用于一对一消息传递的 Firebase 数据库结构?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Firebase 消息传递一对一消息

用于聊天应用的 Firebase 实时数据库或 Firestore? [关闭]

用于 Flutter 的 Firebase 云消息传递 - 可选择处理后台消息错误

Apple WatchOs 以及用于推送通知的 Firebase 云消息传递

Firebase 云消息传递 - PHP Rest API 不适用于 iOS

如何使用 Firebase 规则从一侧删除消息?