在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
});
后一个代码看起来更简洁,并且不需要将项密钥非规范化为用户记录,但我不清楚它是否是一种效率较低的方法(假设我在“用户”上创建索引)。
感谢。
答案 0 :(得分:1)
这是相当古老的,但在使用firebase支持的应用程序时,我发现自己经常处理类似的问题。
.equalTo更节省时间(特别是,如果一个用户拥有大量项目)。虽然n + 1订阅不会导致n + 1网络往返云,但是有这么多开放订阅会有一些性能损失。
此外,.equalTo方法不会导致数据的非规范化。
但是有一个问题:当你想要保护数据时,.equalTo方法可能会停止工作。
要允许用户调用orderByChild(" user")。equalTo(user.uid),他们必须拥有“'项目”的读取权限。采集。此读取权限对于以/ items。
为根的整个子文档有效摘要:如果要阻止user1查找user2的项目,则必须使用BYOI(构建自己的索引)方法。这样,您可以验证该用户只读取放入其索引的项目。
最后,免责声明:)我只在很短的时间内使用firebase我得到的是一些基准和文档。如果我以任何方式弄错了,请纠正我。