我正在努力使用firebase设计一个简单的数据共享应用程序。为了说明,请考虑类似于Facebook的消息传递应用程序:
我可以为此设置安全规则,但过滤或非规范化数据似乎过于繁琐和低效。示例数据模型可能如下所示:
{
"users": {
"user1": {
"friends": {
"user2": { "accepted": true }
}
},
"user2": {
"friends": {
"user1": { "accepted": true }
}
},
"user3": {
"friends": {}
}
},
"posts": {
"generatedId1": {
"message": "blah blah",
"user_id": "user1"
},
"generatedId2": {
"message": "lorem ipsum",
"user_id": "user2"
},
"generatedId3": {
"message": "hello world",
"user_id": "user3"
}
}
}
达到上述要求的安全规则如下所示:
{
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
},
"posts": {
"$post": {
".read": "root.child('users').child(data.child('user_id').val()).child('friends').child(auth.uid).child('accepted').val() === true",
".write": "newData.child('user_id').val() === auth.uid"
}
}
}
}
这可能不太对,但足够接近可以说明。我们可以看到用户只能读写自己的用户记录,只能添加自己用户ID的帖子,并且可以阅读有相应的朋友记录的帖子。
所以我的问题基本上归结为如何执行只返回用户可以看到的帖子的查询?由于安全规则不是过滤器,因此在这种情况下它们无法帮助我们。
到目前为止,我的理解是帖子应该非规范化,基本上复制每个用户的帖子。这非常低效 - 如果用户有100个朋友,这意味着重复数据100次。回顾性更新(即添加新朋友或删除现有朋友)也很复杂。
另一种选择是检索用户自己的朋友列表并在单独的查询中检索这些用户的帖子,但同样,如果用户有100个朋友,这将意味着执行100个单独的“查询”。
基本上,我试图实现多对多的关系。这里有什么指导/最佳实践?