Firebase 索引的数量有限制吗
我对Firebase非常陌生。我们有一个为用户创建通知的应用程序。同一个通知可能会传递给多个用户。因此,为了优化数据存储成本,我们将数据结构化如下:Firebase 索引的数量有限制吗,firebase,Firebase,我对Firebase非常陌生。我们有一个为用户创建通知的应用程序。同一个通知可能会传递给多个用户。因此,为了优化数据存储成本,我们将数据结构化如下: notifications { message1 { tiltle:"abc", desc:"desc" user1 : true user2 : true user3 : true } message2 { t
notifications
{
message1
{
tiltle:"abc",
desc:"desc"
user1 : true
user2 : true
user3 : true
}
message2
{
tiltle:"efg",
desc:"desc"
user1 : true
user2 : true
user3 : true
}
}
用户使用orderByChild(“”)查询消息。equalTo(true)
我们不能使用附加到消息的用户数组,因为用户可以将消息标记为已读,在这种情况下,我们需要从消息中删除该用户
现在的问题是,我们看到查询速度很慢。此外,我们还看到firebase发出的警告,警告我们在子节点上执行查询时使用索引。用户数量将不断增加,这意味着我们需要在新用户注册时创建索引
在这种情况下,我想知道对可以创建的索引数量是否有任何限制?以及创建大量索引会产生什么影响 使用NoSQL时,您通常会为应用程序中需要的用例建模数据。对于您当前的用例“为用户获取消息”,这不是一个理想的数据结构。您正在使数据库考虑每个查询的所有消息。虽然这在关系数据库中可能是正常的做法,但使用NoSQL时,最好采用不同的建模方式 考虑到用例“为用户获取消息”,此数据模型很有意义:
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
}
}
现在,如果要为用户加载消息,请执行以下操作:
ref.child('messages_per_user').child('user1').on('value', function(snapshot) {
snapshot.forEach(function(messageSnapshot) {
ref.child('notifications').child(messageSnapshot.key).once('value', function(notificationSnapshot) {
console.log(notificationSnapshot.val());
})
});
});
这样,数据库就可以直接访问正确的节点,而忽略其他所有内容
建议阅读:
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
}
}
现在,如果要为用户加载消息,请执行以下操作:
ref.child('messages_per_user').child('user1').on('value', function(snapshot) {
snapshot.forEach(function(messageSnapshot) {
ref.child('notifications').child(messageSnapshot.key).once('value', function(notificationSnapshot) {
console.log(notificationSnapshot.val());
})
});
});
这样,数据库就可以直接访问正确的节点,而忽略其他所有内容
建议阅读:
orderBy…
。在初始数据结构中,需要无限多的索引,因为每个用户id都需要一个索引(我认为)。还是我弄错了?不,你说得对。我的想法更多的是关于数据的排序。如果结构中有三条消息(如firebase中所示):message1、message10、message2,则可能需要按照正确的顺序处理它们:message1、message2、message10,这需要某种方式来对它们进行排序。啊,明白了。我把它们当作推送ID。但事实上,否则您需要一些值(而不是true)来对它们进行排序。这是必要的,他们最终摆脱了顶级“名单”只存储每个用户的项目。建议的结构适用于我们的读取。但我们需要对firebase进行写入的数量存在问题。假设有一条消息适用于大约1000个用户。看起来我们需要对每个用户路径进行一次修补(这意味着1000次调用)到Firebase。有没有一种方法可以在一个HttpRequest中请求多个位置的批量补丁?(我们想要避免多个HttpRequest的原因是我们对基础设施的限制。)能否请您更新答案,以便在您的答案(来自OP的问题)中的数据结构中包含有关节点的信息。indexOn,我认为这将使其成为一个更完整的答案。在我的方法中,您不需要任何索引,因为没有调用orderBy…
。在初始数据结构中,需要无限多的索引,因为每个用户id都需要一个索引(我认为)。还是我弄错了?不,你说得对。我的想法更多的是关于数据的排序。如果结构中有三条消息(如firebase中所示):message1、message10、message2,则可能需要使用