Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 索引的数量有限制吗_Firebase - Fatal编程技术网

Firebase 索引的数量有限制吗

Firebase 索引的数量有限制吗,firebase,Firebase,我对Firebase非常陌生。我们有一个为用户创建通知的应用程序。同一个通知可能会传递给多个用户。因此,为了优化数据存储成本,我们将数据结构化如下: notifications { message1 { tiltle:"abc", desc:"desc" user1 : true user2 : true user3 : true } message2 { t

我对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(“”)查询消息。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());
        })
    });
});
这样,数据库就可以直接访问正确的节点,而忽略其他所有内容

建议阅读:


使用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());
        })
    });
});
这样,数据库就可以直接访问正确的节点,而忽略其他所有内容

建议阅读:


当您说查询速度慢时,这是什么意思?我们的一些数据具有类似的结构,有几百条(有时数千条)消息,每条(或更多)消息中有十几个左右的子消息,我们的查询几乎立即返回。对于索引,您应该通过中的.indexOn规则定义要索引的键。文档是一个很好的读物。所示的数据结构不适用于user1 user2等的.index,所以另一个结构可以解决这个问题。不过,应该首先解决响应速度慢的问题。Cross-post:我希望有人能回答标题中提出的问题:“索引的数量有限制吗?”。有人对此有答案吗?当你说查询速度慢时,这是什么意思?我们的一些数据具有类似的结构,有几百条(有时数千条)消息,每条(或更多)消息中有十几个左右的子消息,我们的查询几乎立即返回。对于索引,您应该通过中的.indexOn规则定义要索引的键。文档是一个很好的读物。所示的数据结构不适用于user1 user2等的.index,所以另一个结构可以解决这个问题。不过,应该首先解决响应速度慢的问题。Cross-post:我希望有人能回答标题中提出的问题:“索引的数量有限制吗?”。有人对此有答案吗?能否请您更新答案,以包含有关节点的信息。在您的答案(来自OP的问题)的数据结构中使用indexOn,我认为这将使其成为一个更完整的答案。在我的方法中,您不需要任何索引,因为没有调用
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,则可能需要使用