聊天应用程序的Firebase数据库结构

hyp*_*kcb 1 firebase firebase-realtime-database

我正在尝试为聊天系统构建一个firebase数据库.我想要实现的是在用户成功登录后,他们将看到他们发送给不同用户的消息列表.每个消息预览都将显示最后一条消息.然后,用户可以选择消息以查看完整的聊天详细信息.它应该像Facebook Messenger一样工作.

我的设计结构如下:

chatMessage
    sender *(Assume this one is user)*
        threads
            threadID1
                messageID1
                    datetime, content, receiver, status
                messageID2
                    datetime, content, receiver, status
            threadID2
                messageID1
                    datetime, content, receiver, status
                messageID2
                    datetime, content, receiver, status
    sender *(Assume this one is admin)*
         threads
            threadID1
                messageID1
                    datetime, content, receiver, status
                messageID2
                    datetime, content, receiver, status
Run Code Online (Sandbox Code Playgroud)

上面的设计让我知道让我们说userID1登录,我可以检索他发送的所有消息.但是,我无法知道消息之前是否有任何回复,因此我无法检索最后一条消息.

我怎样才能实际重组它以便我能实现上面提到的呢?有什么建议?

谢谢!

Fra*_*len 7

听起来你想:

  1. 在用户之间聊天"房间"
  2. 显示每个用户聊天室的列表,以及该房间的最新消息

如果这些是您的要求,我会精确模拟数据库中的那些.

因此,对于每个聊天室(某个用户组之间的聊天),为该房间的消息建模:

chats: {
  $roomId: {
    $messageId: {
      senderId: "..."
      message: "..."
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在为每个用户建立一个单独的聊天列表和最新消息:

userRooms: {
  $uid: {
    $roomId: {
      "message: "..."
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,每当用户发布消息到一个房间,你将需要推动这一消息,/chats/$roomId 在该聊天室中的每个用户邮件到/userRooms/$uid/$roomId(覆盖退出消息出现).

这种类型的数据复制称为扇出数据,因为您在数据库中的多个位置传播了一小段信息.它在NoSQL数据库中很常见,并且是它们扩展得如此之好的部分原因:它们为写入性能提供了写入复杂性.

  • @hyperfkcb这是一个很棒的答案!扩大一点点; 这个结构确实显示了最新的消息,它不包括它的来源或时间戳.一个简单的改变是,不是在userRooms中复制消息文本,而是存储对最新消息的引用:*userRooms/$ uid/$ roomid/$ messageId = true*.然后,当用户登录应用程序时,可以读取该节点,该节点将检索哪个特定消息是最新的.然后阅读消息节点以获取其他信息.是的,这是两次读取,但根据所需的数据增加了一点灵活性.:-) (2认同)