【问题标题】:What are the benefits of using a root collection in Firestore vs. a subcollection?在 Firestore 中使用根集合与使用子集合有什么好处?
【发布时间】:2023-03-16 20:19:02
【问题描述】:

随着集合组查询的出现,我不清楚使用根集合有什么好处。在 Firestore 团队的this article 中,我唯一能看到的是存在名称冲突的可能性,安全规则稍微复杂一些,并且您必须手动创建任何查询索引。还有其他理由使用根集合而不是子集合/集合组查询吗?

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    在决定使用哪个更好时,顶级集合还是子集合,请注意两者在速度或计费方面都不比另一个更好。但是,有一些细微的差别可以让您选择使用顶级集合而不是子集合。因此,唯一的区别可能来自我们构建数据库的方式,而不是性能。这是因为 Firestore 与 1 级时一样快,在 100 级时也是如此。

    假设我们使用子集合具有以下结构:

    Firestore-root
      |
      --- shops (collection)
           |
           --- $shopId (document)
                  |
                  --- products (sub-collection)
                        |
                        --- productId (document)
    

    这个架构也可以设计成:

    Firestore-root
      |
      --- shops (collection)
      |    |
      |    --- $shopId (document)
      |
      --- products (collection)
           |
           --- $productId (document)
                  |
                  --- shopId: $shopId
    

    对于 NoSQL 数据库,推荐的做法是将数据库扁平化。为什么?因为它看起来更有条理,而且每个顶级集合仅包含与集合本身相关联的文档。

    说到子集合,当我们看上面的例子时,每个产品都与“products”子集合、$shopId 和“shops”集合相关联。

    关于安全规则,复杂性与您需要使用的过滤器的数量和多样性有关。但是,对于顶级集合,它会更容易一些。

    最后,请记住,当我们谈论架构时,我们总是根据我们打算执行的查询来构建 Firestore 数据库。因此,您可以在这两个选项之间做出选择,看看其中哪一个可以让您的生活更轻松。

    编辑:

    还有关于结构 Firestore 数据的 docs state:

    根级集合适用于多对多关系,并在每个集合内提供强大的查询。

    【讨论】:

    • “您至少需要提前知道 $shopId”我不能对“产品”使用集合组查询吗?
    • 是的,您可以使用集合组查询,但前提是您需要从 all 商店获取 all 产品。如果您只想获取单个店铺对应的产品,则需要提前知道其文档 ID。 There are no wildcards in Firestore.
    • 如果我想得到一个商店对应的所有产品,我是不是也必须在根集合中通过 $shopId 查询?看起来我们在根集合和子集合的情况下都需要 $shopId。
    • 哦,是的。刚刚更新了我的答案,以免造成混乱。总之,这与您构建数据库的方式有关,而不是与性能有关。
    • 唯一的好处是结构清晰,可以创建多对多关系,有时还有更简单的安全规则。而已。刚刚用文档推荐根级集合的唯一原因更新了我的答案。现在可以了吗?
    【解决方案2】:

    这完全取决于您的应用程序结构,也取决于您在子集合中查询或查询整个集合或使用private/public fields 构造数据以授予特定用户访问权限的频率。然而,这两种方法都有自己的权衡,例如每个文档每秒写入 1 次或文档大小为 1mb 等。我的建议是首先考虑您的查询并设计您的数据库以最好地处理您需要执行的查询。我建议在Data structure 和Data model 上查看以下文档。如果您想了解更多关于安全的信息,我建议您查看documentation on security.

    【讨论】:

    • 你好@Andrew。这能回答你的问题吗?
    • 这个答案描述了使用子集合和子集合组查询的好处 - 我正在寻找相反的 - 使用平根集合有什么好处。
    猜你喜欢
    • 2019-06-13
    • 1970-01-01
    • 2018-12-02
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 2021-11-19
    • 1970-01-01
    相关资源
    最近更新 更多