假设我的Firebase数据库中有以下数据结构:
{
"allProjects": {
"foo": true,
"bar": true,
"baz": true
},
"allUsers": {
"user1": true,
"user2": true,
"user3": true
},
"projects": {
"foo": {
"name": "foo",
"members": {
"user1": true
}
},
"bar": {
"name": "bar",
"members": {
"user2": true
}
},
"baz": {
"name": "baz",
"members": {
"user1": true,
"user3": true
}
}
},
"users": {
"user1": {
"name": "user1"
},
"user2": {
"name": "user2"
},
"user3": {
"name": "user3"
}
}
}
我正在尝试编写一些规则,以便保护我的数据。以下是一些要求:
/project/:id/members/:userId === true
)这是我能够提出的:
{
".read": false,
".write": false,
"allProjects": {
".read": "auth !== null"
},
"allUsers": {
".read": "auth !== null"
},
"projects": {
"$projectId": {
// requirement 1
".read": "data.child('members').hasChild(auth.uid)"
}
},
"users": {
"$userId": {
// requirement 2
".read": "???",
}
}
}
答案 0 :(得分:2)
典型的方法是保留每个用户可以看到的用户列表。
user_friends: {
"user1": {
"user3": true
}
"user3": {
"user1": true
}
}
然后,当用户添加到项目中或从项目中删除时,您需要使此派生列表保持最新。或者,您可以在计划维护操作中计算此派生列表。
像这样复制数据是SQL数据库和大多数NoSQL数据库之间的重大差异之一。在Firebase中,我们经常存储额外的数据以允许我们的用例。要获得精彩的介绍,我建议您阅读NoSQL data modeling并观看Firebase for SQL developers。
顺便说一下,我注意到您已将元数据和合并到/projects/$projectid
下的用户列表中。不建议这样做。为获得最佳效果,请将它们拆分为两个顶级列表。
"projects": {
"foo": {
"name": "foo",
},
"bar": {
"name": "bar",
},
"baz": {
"name": "baz",
}
},
"members": {
"foo": {
"user1": true
},
"bar": {
"user2": true
},
"baz": {
"user1": true,
"user3": true
}
},