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

时间:2017-11-15 23:35:34

标签: firebase nosql google-cloud-firestore

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

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

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

usersCollection
    user1
    user2
    user3
    ...

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

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

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

1 个答案:

答案 0 :(得分:0)

Firebase的产品经理Alex Dufter在Firebase Dev Summit 2017的某一天解释说,Firestore多年来在Firebase实时数据库上的反馈中受到多方面的启发。他们面临两类问题:

  1. 数据建模和查询。 Firebase实时数据库无法查询多个属性,因为它涉及复制数据或cliend-side过滤,我们都知道这是一种混乱。

  2. 实时数据库不会自动缩放。

  3. 有了这个新产品,他们说你现在可以构建一个应用程序并将其扩展到全球规模而不需要改变一行代码。 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);