我是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的警告,它告诉我们在对子节点执行查询时使用索引。用户数量将不断增加,这意味着我们需要在新用户注册时创建索引。
鉴于这种情况,我想知道可以创建的索引数量是否有限制?创建大量索引会产生什么影响?
答案 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
}
}
这样,数据库可以直接访问正确的节点并忽略其他所有节点。
推荐阅读: