了解“更扁平”结构为何更好的最简单方法是查看如何保护它以及如何实现功能。
你的第一个结构是:
users: {
uidOfJacob: {
stackId: 884522,
ssn: "999-99-9999",
profile: {
displayName: "Jacob Philips"
}
},
uidOfPuf: {
stackId: 209103,
ssn: "999-99-9999",
profile: {
displayName: "Frank van Puffelen"
}
}
}
您可以通过以下方式保护它:
{
"rules": {
"users": {
"$uid": {
".read": "auth.uid == $uid",
".write": "auth.uid == $uid"
"profile": {
".read": true
}
}
}
}
}
拥有公开信息的主要原因之一是能够显示该信息的列表。在 JavaScript 中:
ref.child('users').child(???).child('profile').on('child_added'...
这行不通,因为我们在??? 中输入了什么。 Firebase 操作需要能够从一个位置读取整个列表,并且用户需要对该整个位置(而不仅仅是单个子节点)具有读取权限。
如果我们构造数据以将公共信息与私人信息分开,我们会得到:
users: {
uidOfJacob: {
stackId: 884522,
ssn: "999-99-9999",
profile: {
displayName: "Jacob Philips"
}
},
uidOfPuf: {
stackId: 209103,
ssn: "999-99-9999",
profile: {
displayName: "Frank van Puffelen"
}
}
},
"profile": {
uidOfJacob: {
displayName: "Jacob Philips"
},
uidOfPuf: {
displayName: "Frank van Puffelen"
}
}
您可以通过以下方式保护它:
{
"rules": {
"users": {
"$uid": {
".read": "auth.uid == $uid",
".write": "auth.uid == $uid"
}
},
"profiles": {
".read": true,
"$uid": {
".write": "auth.uid == $uid"
}
}
}
}
现在要获取公开用户配置文件的列表,您可以:
ref.child('profiles').on('child_added'...
这会起作用,因为每个人都拥有profiles 的读取权限。