代码之家  ›  专栏  ›  技术社区  ›  Marcelo Glasberg

Firestore:这种文档结构(在速度和成本方面)是否适合在聊天应用程序中允许多个收件人发送消息?

  •  1
  • Marcelo Glasberg  · 技术社区  · 7 年前

    Firestore chat-app: Is this a valid document structure for multi-recipient messages?


    假设一个聊天应用程序有1000万Firebase用户和数亿条消息。

    请注意,这些用户不是按稳定的组组织的,因为每条消息可能有一组完全不同的用户来接收它。

    我需要能够非常高效地(在时间和成本方面)找到, 在特定时间后发送给特定用户的所有消息。

    我的 将在列表中列出收件人用户 recipients 数组,例如:

    "dateTime" : 2019-01-24T20:37:28Z
    "recipients" : [user1033029, user9273842, user8293413, user6273581]
    

    但是,这不允许我高效地执行查询。

    将每个用户设置为一个字段

    "dateTime" : 2019-01-24T20:37:28Z
    "user1033029" : true
    "user9273842" : true
    "user8293413" : true
    "user6273581" : true
    

    然后,例如,如果我想知道今天下午3:00之后用户8293413的所有消息,我可以这样做:

    messages.where("user8293413", "==", true).where("dateTime", ">=", "2019-01-24T15:00:00Z")
    

    从文档中我知道Firestore将为所有字段创建索引, 因此,这意味着它将为特定的用户8293413创建索引。 这意味着搜索会很快,对吗?并且读取次数将保持在最低限度(每封邮件读取一次)。

    但是,由于我有1000万用户, Firestore必须创建1000万个索引

    这是个问题吗?那么多索引会影响性能吗?所有这些索引的存储成本如何?Firebase是否为大量索引做好了准备?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Alex Mamo    7 年前

    但是,由于我有1000万用户,Firestore将不得不创建1000万个索引(假设所有用户都收到消息)。

    没有办法做到这一点。根据官方文件关于 Firestore indexes :

    200

    如你所见,你被限制在200人以内。

    这是个问题吗?那么多索引会影响性能吗?

    当然是。由于无法超过200限制,因此不会影响性能。如果您将保持在限制以下,Firestore保证您的查询速度将非常快。

    Firebase是否为大量索引做好了准备?

    不适合这么多人。

    为了解决这个问题,我建议您更改数据库结构的逻辑,因为不允许创建那个数量的索引。为此,我建议你去看一个可能的 database schema 对于聊天应用程序,您只需在其中查询聊天信息,而无需使用太多索引。