我应该在Firebase Cloud Firestore数据库的大型数据集上使用冗余还是简单查询



我有一个集合itemsCollection,其中包含大量的小itemDocs。每个itemDoc都有一个子集合,即统计信息。每个itemDoc还有一个字段"owner",表示哪个用户拥有itemDoc。

itemsCollection
itemDoc1
statistics
itemDoc2
statistics
itemDoc3
statistics
itemDoc4
statistics
...

我还有一个集合usersCollection,它包含基本的用户信息。

usersCollection
user1
user2
user3
...

由于每个itemDoc都属于特定的用户,因此有必要向每个用户显示他们拥有的itemDoc。我一直在使用查询:

db.collection("itemsCollection").where("owner", "==", "user1")

我想知道这是否会有效地扩展,即每当itemsCollection达到数百万条记录时?如果不是,最好的解决方案是将每个itemDoc及其统计信息子集合复制为用户文档中的子集合,还是我应该做其他事情?

正如Firebase的产品经理Alex Dufter在Firebase Dev Summit 2017的一天中所解释的那样,Firestore在很多方面都受到了多年来对Firebase实时数据库的反馈的启发。他们面临两类问题:

  1. 数据建模和查询。Firebase实时数据库无法查询多个属性,因为它通常涉及重复数据或客户端过滤,我们都知道这有点混乱。

  2. 实时数据库不会自动扩展。

有了这个新产品,他们说你现在可以构建一个应用程序,并将其扩展到全球范围,而无需更改一行代码。Cloud Firestore也是专门为移动和web应用程序开发而构建的NoSQL database。它可以灵活地构建各种应用程序,并可扩展到任何大小。

因此,因为新数据库是在知道这一点的情况下构建的,所以duplication data is not nedeed anymore。因此,您不必担心使用这行代码,即使您的数据将增长到数百万条记录,它也是will scale automatically。但有一件事你需要记住,如果你要使用多个条件,不要忘记使用索引,只需在Firebase控制台中添加它们。以下是官方文档中的两个简单示例:

citiesRef.whereEqualTo("state", "CO").whereEqualTo("name", "Denver");
citiesRef.whereEqualTo("state", "CA").whereLessThan("population", 1000000);

最新更新