【问题标题】:How to structure Firestore database in chat app?如何在聊天应用程序中构建 Firestore 数据库?
【发布时间】:2019-05-29 05:17:54
【问题描述】:

存储聊天消息最简单的方法大概是这样的:

message:
 -message1 {
   "user1"
   "user2"
   "message"
   "date"
  }
 -message2
 -message3

当应用程序变大(大量消息)并且使用.whereEqualTo 完成数据库操作时,以这种方式构建聊天应用程序消息有什么缺点吗?就像数据库遍历所有消息一样?

因为如果这种方法存在问题,例如,我已经看到了这种结构化数据库的方式,它会将消息隔离在不同的聊天室中

chats: {
    -chat1 {
      "lastMessage"
      "timestamp"
      "users": {user1, user2}
    }
    -chat2
    -chat3
  }

messages: {
 -chat1 {
  "message"
  "date"
 }
}

但在本例中,添加新消息需要用户进行 2 次写入操作,一次写入新消息,一次使用新的 lastMessagetimestamp 客户端更新 chat 文档,或者创建云函数以添加新消息时,使用新值更新 chat 文档。

那么,第一个选项是否有效,还是我应该使用第二个示例?

【问题讨论】:

标签: android firebase google-cloud-firestore


【解决方案1】:

您作为第一个选项提供的内容与您在tblMessages 的关系数据库中建模的方式很接近。在 NoSQL 数据库中,这样的直译很少是您的最佳选择,因为它们有非常不同的权衡取舍。例如,您已经注意到需要对两个字段执行查询才能获取两个用户之间的消息。

在 NoSQL 数据库上建模数据时,我通常建议在您的数据库中为您在屏幕上看到的内容建模。因此,如果您的聊天应用程序具有聊天室的概念(即特定人群之间的持续聊天),我也会在您的数据库中对它们进行建模。

在 Cloud Firestore 中,这意味着您将拥有一个顶级集合,其中包含每个聊天室的文档,然后在每个此类文档下都有一个包含该聊天室消息的子集合:

ChatRooms (collection)
  ChatRoom1 (document)
    Messages (collection)
      Message1_1 (document)
      Message1_2 (document)
  ChatRoom2 (document)
    Messages (collection)
      Message2_1 (document)
      Message2_2 (document)

使用此模型,您无需查询即可在聊天室中显示消息,而是可以直接从该聊天室的子集合加载(所有)消息。它还具有对房间进行分区的优点,这意味着写入可以更好地扩展。

我通常建议在房间内建模chat room document IDs after the participants,这样您就可以轻松地根据参与者重建 ID。但是有更多有效的选择。

【讨论】:

  • 所以这类似于我的第二个选项,但合并到一个集合中,因为如果我想添加一个侦听器来通知用户在任何这些聊天室中的新消息,我仍然需要保留类似 @987654325 的内容@ 在chatRoom 文档中,对吗?
  • 我通常更喜欢预先计算我能做的任何事情,所以每个房间文档中肯定会有一个lastUpdated 字段。
  • 你可以在他们的官方文档中找到一个类似的用例。 firebase.google.com/docs/firestore/data-model
  • 我在链接的问题中的回答显示了如何为每个用户创建聊天室列表。
  • @FrankvanPuffelen 您能否详细说明为什么您建议为每条消息使用一个文档,而不是在代表聊天室的文档中包含一组消息?新来这里的firestore,并试图做出建筑选择。 (并且仍在尝试找出确保用户可以发送消息但不能以其他方式更改文档的最佳方法,不确定这是否会导致这种区别。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 2019-12-20
  • 2016-09-27
  • 2016-06-28
  • 2018-06-01
  • 2015-12-05
  • 2021-06-13
相关资源
最近更新 更多