如何为聊天应用程序构建 Firestore

N.K*_*K.T 7 flutter google-cloud-firestore

我即将使用 firestore 创建一个 1 对 1 聊天应用程序。特点如下:

  • 用户可以看到他之前聊天过的联系人列表。
  • 聊天室中未见消息的数量。
  • 最后一条消息和时间。

我认为我的Message模型类如下:

  • 消息ID(唯一ID),
  • 发件人ID
  • 接收者ID
  • 信息
  • 时间
  • isSeen(布尔值,默认值false

现在假设user1user2进行了对话。我正在考虑chats通过以下方式为聊天创建一个单独的根集合():

chats(col) --> user1 --> chats(col) --> chatRoomId --> messages(col) --> messageId1
                                                                     --> messageId2
                                                                     --> messageId3
           --> user2 --> chats(col) --> chatRoomId --> messages(col) --> messageId1
                                                                     --> messageId2
                                                                     --> messageId3
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于 - 将会为两个用户分别存储重复的数据,例如相同的消息。而且更新消息也会很麻烦,因为消息需要在两个位置都更新。

那么,牢记所有要求,什么是更好的结构呢?

BJW*_*BJW 4

不确定这是否是最好的方法,但我构造 firestore 的方式:

我有一个用于群聊和一对一聊天的collection通话。包含以下信息:groupsgroups

  • chatID(与该特定行的 ID 相同groups
  • 成员(该聊天中所有参与应用程序用户的用户 ID,也用于检索用户的聊天)
  • 最近的消息文本
  • 最近发送的消息
  • 最近的消息发送者
  • 读者
  • chatTitle(可以为 null,因为 1 对 1 不需要)
  • chatType(指示是群组聊天还是一对一聊天)

groups在 ChatOverviewScreen 中,我有一个 firestore 查询,它仅检索包含其userIDin字段的文档members

因此,在 ChatOverviewScreen 中,您现在可以显示用户拥有的所有聊天,并且您已经知道检索属于特定聊天的消息所需的 ID 引用。

所有消息都存储在一个名为 的集合中,chats其中每个 documentID 也可以在groups文档中找到。中的每个文档都chats包含一个包含所有messages.

以下链接也非常有用:https://levelup.gitconnected.com/structure-firestore-firebase-for-scalable-chat-app-939c7a6cd0f5