Firebase 如何在一个节点下存储公共/私有数据,并且仍然查询整个节点
我希望将数据存储在Firebase 如何在一个节点下存储公共/私有数据,并且仍然查询整个节点,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我希望将数据存储在$user下,其中一些数据可供公众读取,而一些数据仅可供用户读取。安全规则如下所示: { "rules": { "users": { "$uid": { "public":{ ".read": "auth != null", }, "private": { ".read": "$uid === auth.uid" } }
$user
下,其中一些数据可供公众读取,而一些数据仅可供用户读取。安全规则如下所示:
{
"rules": {
"users": {
"$uid": {
"public":{
".read": "auth != null",
},
"private": {
".read": "$uid === auth.uid"
}
}
}
}
}
但是,如果我是$user
尝试在users/$user
处读取的$user
,读取将失败,对吗?有没有办法做到这一点,或者在尝试获取实际用户的所有$user
信息时,我是否总是需要在用户/$user/public
和用户/$user/private
上执行读取
请注意,我希望避免复制数据,以减少在源节点中保持复制数据最新的需要,以及在删除源节点时减少数据库卫生。我的模式是这样的,唯一的键是唯一的重复数据,它总是指向一个源节点作为查询的位置。如果您一次只读取一个用户的信息,您所建议的结构将很好工作——您可以在读取公共信息时简单地添加
/public
,或者在以用户身份访问并希望同时读取公共和私有时,直接读取$uid
节点
但是,如果您计划执行任何类型的查询,那么此数据结构将无法工作,因为在读取公共数据时,如果不读取私有数据,将无法进行查询。相反,您需要将public
和private
提升到$uid
级别之上:
users
- public
- $uid
- private
- $uid
一旦你达到这一点,是的,你将不得不做两次读取来访问这两个信息位。但要记住几件事:
关于重复数据的另一个问题是,通过在客户端上处理同步,而不必在客户端中对其进行编码,可以使非规范化变得无痛。
您似乎已经阅读了相关的文档,这些文档指示了场景中的问题。我还建议你阅读其中的一些。如果这些没有解决您的问题,请共享您打算用于读取数据的代码,因为这是在这种情况下提供帮助的关键。感谢您提供有关数据结构的提示!我没有考虑对我所考虑的问题的影响。我将使用你提供的结构。对于重复数据,我曾考虑过使用云函数,但为了降低复杂性,我坚持不复制(尽可能多)的计划。