我的Firestore数据库中具有以下结构:
messages:
m1:
title: "Message 1"
...
archived: false
m2:
title: "Message 2"
...
archived: true
假设我有2万条消息,并且我想使用“ where”子句获取已归档的消息,查询的速度是否会比按以下结构构建数据库慢??
nonArchivedMessages:
m1:
title: "Message 1"
...
archivedMessages:
m2:
title: "Message 2"
...
在我看来,使用第二种结构似乎更适合于大型数据集,但在某些情况下却隐含着问题,例如在不知道消息是否已归档的情况下获取消息。
答案 0 :(得分:2)
Cloud Firestore的保证之一是,检索一定数量的文档所花费的时间不取决于集合中文档的总数。
这意味着在您的第一个数据模型中,如果您加载100个存档文档并且(例如)花费1秒,则您知道加载100个存档文档将始终花费大约1秒,无论有多少文档里面有。
有了这些知识,两个数据模型之间的唯一区别是,在第一个模型中,您需要查询以捕获已归档的消息,而在第二个模型中,您不需要查询。 Cloud Firestore上的查询通过访问索引来运行,因此区别在于在第一个数据模型中读取了一个(多个)索引。尽管这对执行时间的影响很小,但与实际读取文档并将文档返回给客户端所花费的时间相比,这将是微不足道的。
所以:可能还有其他原因更喜欢第二种数据模型,但是两者之间读取存档消息的性能将是相同的。