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

时间:2017-12-19 02:01:54

标签: 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

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

我如何实际重组它以便我可以实现上面提到的?有什么建议吗?

谢谢!

1 个答案:

答案 0 :(得分:7)

听起来你想:

  1. 在用户之间聊天“房间”
  2. 显示每个用户聊天室的列表,以及该会议室的最新消息
  3. 如果这些是您的要求,我会精确模拟数据库中的那些。

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

    chats: {
      $roomId: {
        $messageId: {
          senderId: "..."
          message: "..."
        }
      }
    }
    

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

    userRooms: {
      $uid: {
        $roomId: {
          "message: "..."
        }
      }
    }
    

    现在,只要用户向某个会议室发送消息,您就需要将该消息推送到/chats/$roomId ,以便该聊天室中的每个用户将消息写入{{1} (覆盖那里的现有消息)。

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