Google Firestore - 高效获取单个文档,在子集合内执行点查询

Google Firestore - Efficiently fetch a single document, perform a point query within a subcollection

假设我正在设计一个新的 Firestore 数据库。假设我喜欢分层设计的想法,作为一个人为的例子,每个 Year 都有一个子序列 Weeks ,每个 .

今天检索单个文档的最性能效率方法是什么?即 2021-W51-星期四

允许答案包含对模型的更改,例如“非规范化”日模型,使其包含 yearweekdayName 字段(并查询它们)。

否则,简单的文档参考可能是最快的方法,例如:

DocumentReference ref = db
    .Collection("years").Document("2021")
    .Collection("weeks").Document("51")
    .Collection("days").Document("Thursday");

谢谢。

任何识别要获取的单个文档的查询与执行相同操作的任何其他查询的性能相同在 Firestore 运行的规模。集合或文档的组织在 规模 上并不重要。根据您的数据集,您可能会看到小规模的性能波动,但这并不是 Firestore 优化后的工作方式。

所有集合和所有子集合都至少有一个关于文档 ID 的索引,该索引以相同的方式工作,独立于彼此的集合和索引。如果您可以使用其路径识别唯一文档:

/db/XXXX/weeks/YY/days/ZZZZ

然后它的缩放比例与使用更扁平结构存储的文档相同:

/db/XXXXYYZZZZ

在规模上没有区别,因为集合上的索引可以扩展到无限数量的文档,没有理论上的上行限制。这就是 Firestore 的魔力:如果系统允许查询,那么它将始终表现良好。您根本不用担心扩展性和性能。索引自动跨计算资源分片以优化性能(与成本相比)。

以上所有内容都适用于文档字段(而不是文档 ID)。您可以将文档 ID 视为文档的一个字段,该字段在集合中必须是唯一的。默认情况下,每个字段都有自己的索引,并且可以大规模扩展。

没有像 Firestore 这样的SQL 数据库,您应该以简化查询的方式构建数据,只要这些查询可以得到大规模运行的索引的支持。这与 SQL 数据库形成对比,后者针对查询灵活性而非大规模可扩展性进行了优化。