【问题标题】:Firebase database structure for one-on-one messaging?用于一对一消息传递的 Firebase 数据库结构?
【发布时间】: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 聊天应用程序。

标签: firebase google-cloud-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/…
  • 没有问题,如果你喜欢,记得给答案投票 :) !
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 2016-10-25
相关资源
最近更新 更多