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
一旦你达到这一点,是的,你将不得不做两次读取来访问这两个信息位。但要记住几件事:

  • 私有信息只能由根据您的规则编写它的用户读取,因此您可以很容易地在用户登录后在此单一节点上设置侦听器,然后您将始终拥有它
  • Firebase通过持续的实时连接进行连接,这意味着进行多次读取可能不像您想象的那样昂贵

  • 关于重复数据的另一个问题是,通过在客户端上处理同步,而不必在客户端中对其进行编码,可以使非规范化变得无痛。

    您似乎已经阅读了相关的文档,这些文档指示了场景中的问题。我还建议你阅读其中的一些。如果这些没有解决您的问题,请共享您打算用于读取数据的代码,因为这是在这种情况下提供帮助的关键。感谢您提供有关数据结构的提示!我没有考虑对我所考虑的问题的影响。我将使用你提供的结构。对于重复数据,我曾考虑过使用云函数,但为了降低复杂性,我坚持不复制(尽可能多)的计划。