聊天应用中的Firebase实时数据库结构

时间:2017-06-14 05:05:02

标签: android firebase firebase-realtime-database structure

抱歉我的英语水平不好,我来自阿根廷。

我在Firebase中有以下消息数据结构:

"messages"
   "-KezmqXSdKCNFFA432Uc___-KfCEwklG_y3naRDIUiY"
         "messageDate": "20170620"
         "messageTime": "18:44" 
         "message": "Hi"
   "-KezFDSAADFASFFS3221___-KASDF32324SDFASD1FS"
         "messageDate": "20170620"
         "messageTime": "22:23" 
         "message": "How are you?"

-KezmqXSdKCNFFA432Uc -KfCEwklG_y3naRDIUiY -KezFDSAADFASFFS3221 -KASDF32324SDFASD1FS 是用户。

我的问题是我在“messages”节点中创建了一个childEventListener来接收新用户的消息,但是我收到了所有用户的所有新消息(我每个应用程序登录一个用户),因为我的childListener在“消息“节点。

如果我在添加邮件时有1000个用户,新邮件会到达1000个用户,这是否正确? (假设在应用程序中,您可以检查该消息所属的用户)。

谢谢!

7 个答案:

答案 0 :(得分:21)

如果你做了类似这样的结构:

-chats
   - chatUID
       - members
           - userUID
       - lastMessageSent:messageUID
       - ... more properties  

-chatMessages
   - chatUID
     - messageUID
         - sentBy: userUID
         - messageDate:""
         - messageTime:""
         - message:""

-userChats
    - userUID
       - chatUID

你可以将一个监听器附加到/ userChats / userUID,它将显示活动的聊天记录,以及一个监听/ chatMessages / chatUID的监听器,它将获取特定聊天对话的所有聊天消息。

这种方式设置firebase安全规则要容易得多,而且用户只会收到他们所在的聊天消息。

答案 1 :(得分:3)

我知道答案来晚了,但是对于将来的读者来说,尽管Linxy的答案比较整洁,但我想指出一种更有效的方法,它同时尝试了两种结构:

ChatMessages
   smallerUID_biggerUID
      messageUID
         sentBy : userUID
         messageDate : ""
         message : ""
      .
      .
   .
   .
UserChats
   userUID
      pairUID
        lastMessage : ""       
      .
      .
   .
   .

通过这种方式,我们可以直接搜索哪些用户应该出现在活动的聊天选项卡中,并获取thouse用户的信息(用户名,profilePicture),而不是先找到chatId,然后再找到与该chatId相关联的用户。这样做的原因是,如果我们知道要与之通信的用户ID,则我们总是可以计算chatId。因此,对于“消息”选项卡,我们在客户端计算出chatId(smallerUID_biggerUID),并在引用该消息时搜索消息。

答案 2 :(得分:2)

要构建数据库,请阅读以下文章:Structuring your Firebase Data correctly for a Complex App。您可以在这里找到您问题的答案。

作为结论,尝试尽可能地压缩(非规范化)数据库。

希望它有所帮助。

答案 3 :(得分:1)

{
    "users": {
        "userId": {
            "conversations": {
                "conversationId": {
                    "unseenCount": 0
                },
                "conversationId2": {
                    "unseenCount": 3
                }
        }
    },
    "conversations": {
        "conversationId": {
            "displayedMessage": "Message",
            "members": {
                "userId1": true,
                "userId2": true
            },
            "messages": {
                "messageId": {
                    "type": "text",
                    "text": "Hello",
                    "createdAt": "",
                    "senderId": "userId",
                    "status": "sent",
                    "payload": ""
                }
            },
            "lastMessage": "my last message"
        }
}

}

答案 4 :(得分:1)

感谢@Linxy的出色回答

我已经创建了一个有关@Linxy答案的firebase数据库

enter image description here

这是完整的JSON导出

{
  "Chats" : {
    "-Lsfsd234xda" : {
      "lastMessageSent" : "-LrDEBo1-Message",
      "members" : [ "-LrDEBoLokW-5mhaT3ys", "-LrDEBoLokW-5mhaT3yz" ],
      "more_properties" : "goes here"
    }
  },
  "Users" : {
    "-LrDEBoLokW-5mhaT3ys" : {
      "id" : "-LrDEBoLokW-5mhaT3ys",
      "userDisplayName" : "Qadir Hussain",
      "userEmail" : "XXXXX.XXXX@gmail.com",
      "userPhotoUrl" : "https://lh3.googleusercontent.com/a-/AAuE7XXXXXXXXX"
    },
    "-LrDEBoLokW-5mhaT3yz" : {
      "id" : "-LrDEBoLokW-5mhaT3ys",
      "userDisplayName" : "Ishaq Bhojani",
      "userEmail" : "XXXXXXX.XXXXXX@gmail.com",
      "userPhotoUrl" : "https://lh3.googleusercontent.com/a-/AAuE7mB3KTbXXXXXXXX"
    }
  },
  "chatMessages" : {
    "-Lsfsd234xda" : {
      "-LrDEBo-MessageUID" : {
        "message" : "Hi there!",
        "messageDate" : "10/10/2019",
        "messageTime" : "10:16pm",
        "sentBy" : "-LrDEBoLokW-5mhaT3ys"
      },
      "-LrDEBo1-MessageUID" : {
        "message" : "Hello",
        "messageDate" : "10/10/2019",
        "messageTime" : "10:17pm",
        "sentBy" : "-LrDEBoLokW-5mhaT3yz"
      }
    }
  },
  "userChats" : {
    "-LrDEBoLokW-5mhaT3ys" : {
      "0" : "-Lsfsd234xda",
      "1" : "-Lsfsd234xda1",
      "chatUID" : "-Lsfsd234xda"
    }
  }
}

答案 5 :(得分:0)

这种结构不支持你想要做的事情,最好通过使用类似频道的东西来改变它,其中一个频道包含两个人之间的消息,所以当其中任何一个发送消息时另一个消息将会收到通知。

答案 6 :(得分:-2)

我认为这将是最好的结构:

{
  messages: {
    A8Fcn28ak9ask46: {
      chat_id: "combination of sender and receivers number",
      sender_id: "person sending the message", 
      receiver_id: "person send it to",
      text: "message that the user types",
      timestamp: "123981849404"
    },
    ...
  }
 }

然后,当您获得结果时,您可以正向和反向过滤chat_id的内容,这将获得两个人之间的对话。

希望有帮助。