索引数量是否有限制

时间:2016-02-06 09:04:23

标签: firebase

我是Firebase的新手。我们有一个为用户创建通知的应用程序。可能会向多个用户发送相同的通知。因此,我们按如下方式构建数据以优化数据存储成本:

notifications
{
    message1
    {
        tiltle:"abc",
        desc:"desc"
        user1 : true
        user2 : true
        user3 : true
    }

    message2
    {
        tiltle:"efg",
        desc:"desc"
        user1 : true
        user2 : true
        user3 : true
    }
}

用户使用orderByChild("<userId>").equalTo(true)查询邮件。

我们无法使用附加到邮件的用户数组,因为用户可以将邮件标记为已读取,在这种情况下我们需要从邮件中删除用户。

现在问题是我们看到查询很慢。此外,我们看到来自firebase的警告,它告诉我们在对子节点执行查询时使用索引。用户数量将不断增加,这意味着我们需要在新用户注册时创建索引。

鉴于这种情况,我想知道可以创建的索引数量是否有限制?创建大量索引会产生什么影响?

1 个答案:

答案 0 :(得分:2)

使用NoSQL时,您通常会最终为应用程序中所需的用例建模数据。对于您当前的用例“为用户获取消息”,这不是一个理想的数据结构。您正在使数据库考虑每个查询的所有消息。虽然这可能是关系数据库中的常规做法,但使用NoSQL时,最好以不同的方式进行建模。

鉴于用例“为用户获取消息”,这个数据模型是有道理的:

combinations n xs = [ x₀ : xs'' | (x₀,xs') <- foci xs
                                , xs'' <- combinations (n-1) xs' ]

现在,如果您要为用户加载消息,请执行以下操作:

notifications: {
    message1: {
        tiltle:"abc",
        desc:"desc"
        user1 : true
        user2 : true
        user3 : true
    }
    message2: {
        tiltle:"efg",
        desc:"desc"
        user1 : true
        user2 : true
        user3 : true
    }
},
messages_per_user: {
    user1: {
        message1: true
        message2: true
    }
    user2: {
        message1: true
        message2: true
    }
    user3: {
        message1: true
        message2: true
    }
}

这样,数据库可以直接访问正确的节点并忽略其他所有节点。

推荐阅读: