Firestore 子集合的优势

Advantages of firestore sub-collections

firestore 文档没有深入讨论使用子集合与顶级集合所涉及的权衡,但确实指出它们不太灵活且更少 'scalable'。鉴于您牺牲了在子集合中设置数据的灵活性,除了令人满意的结构之外,还必须有一些明确的优点。

例如,与从更小的集合中获取所有项目相比,在大型集合中对单个键进行 firestore 查询的时间如何?

假设我们要查询一个大型集合 'People' 以获取一个家庭中的所有人。或者,首先按家庭将数据划分为家庭单位。

人 -> 人:{家庭:'Smith'}

对比

家庭 -> 家庭:{name:'Smith'} -> 人 -> 人

我希望后者更有效率,但这是正确的吗?每个都有大O估计吗? 子集合的任何其他优点(例如对于交易)?

我有一些关于子集合的要点,您在对数据库建模时需要注意这些要点。

1 – 子集合为您提供了一个更加结构化的数据库。

2 - 默认情况下对查询进行索引:查询性能与结果集的大小成正比,而不是与数据集的大小成正比。 因此,集合的大小并不重要,性能取决于结果集的大小。

3 – 每个文档的最大大小为 1MB。例如,如果您的客户文档中有一个订单数组,那么为每个客户创建一个订单子集合可能是个好主意,因为您无法预见一个客户会有多少订单。通过这样做,您无需担心文档的最大大小。

4 – 定价:Firestore 向您收取文档读取、写入和删除费用。因此,当您创建许多子集合而不是在文档中使用数组时,您将需要执行更多的读取、写入和删除,从而增加您的账单。

我也在想同样的事情。该文档主要讨论数组与 sub-collections。我的结论是,与 top-level collection 相比,使用 sub-collection 没有明显的优势。 Sub collections 之前有一些明显的技术限制,但我认为这些限制随着最近引入的 collection group queries.

而被移除

以下是两种方法的一些优点:

子collection:

  • 您的数据库 "feels" 更加结构化,因为您列出的 top-level collection 更少。
  • 无需存储 parent 文档的 reference/foreign key/id,因为它由数据库结构暗示。您可以通过 collection 文档参考 parent 进入 parent

Top-level collection:

  • 文档更容易删除。使用 sub collections 您需要确保在删除 parent 文档之前先删除所有 sub collection 文档。没有 API,因此您可能需要推出自己的辅助函数。
  • 在每个(子)文档中直接使用 parent id 可能会更容易处理查询结果,具体取决于应用程序。

回答关于效率的原始问题:

people顶级集合中查询所有family'Smith'的人确实不是任何人 比请求 'Smith' family 子集合 .

中的所有 people 更慢

了解 Cloud Firestore 视频系列的 How to Structure Your Data 集中对此进行了解释。

需要注意顶级集合和子集合之间的一些权衡。根据您打算使用的特定查询,您可能需要创建 composite indexes 来查询顶级集合或创建 collection group indexes 来查询子集合。这两种索引类型都计入 200 index exemptions limit

在了解 Cloud Firestore 视频系列的 Understanding Collection Group Queries blog post and in Maps, Arrays and Subcollections, Oh My! 集底部附近详细讨论了这些权衡。

我已经链接到两个视频的相关部分。

Todd 在 firebase youtube 视频中回答了这个问题

1) There's a limit to how many documents you can create per minute in a single collection if the documents have an always-increasing value (like a timestamp)

2) Very large collections don't do as well from a performance standpoint when you're offline. But they are generally good options to consider.