gpt4 book ai didi

firebase - 如何在Firebase中查询相关记录?

转载 作者:行者123 更新时间:2023-12-03 00:29:17 25 4
gpt4 key购买 nike

鉴于 Firebase 中的数据库结构:

{
"users": {
"user1": {
"items": {
"id1": true
}
},
"user2": {
"items": {
"id2": true
}
}
},

"items": {
"id1": {
"name": "foo1",
"user": "user1"
},
"id2": {
"name": "foo2",
"user": "user2"
}
}
}

哪种方法可以更有效地查询属于特定用户的项目?

Firebase 文档似乎建议这样做:

var itemsRef = new Firebase("https://firebaseio.com/items");
var usersItemsRef = new Firebase("https://firebaseio/users/" + user.uid + "/items");
usersItemsRef.on("child_added", function(data){
itemsRef.child(data.key()).once("value", function(itemData){
//got the item
});
});

但使用 .equalTo() 查询也可以:

var ref = new Firebase("https://firebaseio.com/items");
ref.orderByChild("user").equalTo(user.uid).on("child_added", function(data){
//got the item
});

后一种代码似乎更简洁,不需要将项目键非规范化到用户记录中,但我不清楚这是否是一种效率较低的方法(假设我在“用户”上创建索引)。

谢谢。

最佳答案

这是相当古老的问题,但是在开发 firebase 支持的应用程序时,我发现自己经常处理类似的问题。

.equalTo 更省时(特别是,如果一个用户拥有大量项目)。尽管 n+1 订阅不会导致到云的 n+1 网络往返,但拥有如此多的开放订阅会带来一些性能损失。

此外,.equalTo 方法不会导致数据非规范化。

但是有一个问题:当您想要保护数据时,.equalTo 方法可能根本停止工作。

要允许用户调用 orderByChild("user").equalTo(user.uid),他们必须具有“items”集合的读取权限。此读取权限对根目录为/items 的整个子文档有效。

总结:如果要阻止 user1 查找 user2 的项目,则必须使用 BYOI(构建自己的索引)方法。这样您就可以验证用户只读取放入其索引的项目。

最后,免责声明:) 我只使用 firebase 很短一段时间,我得到的只是一些基准测试和文档。如果我有任何错误,请纠正我。

关于firebase - 如何在Firebase中查询相关记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27152546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com