我正在尝试为聊天系统构建一个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登录,我可以检索他发送的所有消息。但是,我无法知道消息之前是否有任何回复,因此我无法检索最后一条消息。
我怎样才能实际重组它以便我能实现上面提到的呢?有什么建议?
谢谢!
听起来你想:
如果这些是您的要求,我会精确模拟数据库中的那些。
因此,对于每个聊天室(某些用户之间的聊天),为该房间的消息建模:
chats: {
$roomId: {
$messageId: {
senderId: "..."
message: "..."
}
}
}
现在为每个用户建立一个单独的聊天列表和最新消息:
userRooms: {
$uid: {
$roomId: {
"message: "..."
}
}
}
现在,只要用户向房间发布消息,您就需要将该消息推送到/chats/$roomId
,并且该聊天室中的每个用户都将消息写入/userRooms/$uid/$roomId
(覆盖那里的退出消息)。
这种类型的数据复制称为扇出数据,因为您在数据库中的多个位置传播了一小段信息。它在NoSQL数据库中很常见,并且是它们扩展得如此之好的部分原因:它们为写入性能提供了写入复杂性。