2017-09-16 37 views
0

我想将数据存储在$user下,其中一些数据可以被公众读取,并且一些数据只能由用户读取。安全规则会是这个样子:如何在一个节点下存储公共/私人数据,并仍然查询整个节点

{ 
    "rules": {  
    "users": { 
     "$uid": { 
     "public":{ 
      ".read": "auth != null", 
     }, 
     "private": { 
      ".read": "$uid === auth.uid" 
     } 
     } 
    } 
    } 
} 

但是,security rules are not filters,如果我是$user试图在users/$user读,读会失败,正确的吗?有没有办法做到这一点,或者当我试图获得实际用户的所有$user信息时,我总是需要在users/$user/publicusers/$user/private上执行读取操作?

请注意,我想避免重复数据,以减少重复数据与源节点保持同步的需要,以及在删除源节点时减少数据库的卫生设施。我的模式是唯一的键是唯一的重复数据,它始终指向一个源节点作为查询的地方。

+2

您似乎已经阅读了指示场景问题的相关文档。我也推荐阅读一些关于使用规则来过滤数据的问题(https://stackoverflow.com/search?tab=votes&q=%5bfirebase%5d%20rules%20are%20not%20filters)。如果这些不能解决您的问题,请分享您打算用于读取数据的代码 - 因为这对于解决这种情况至关重要。 –

回答

1

您所提出将正常工作,如果你永远只能在一次读取用户信息的结构 - 读取公共信息时,你可以简单地随时添加/public,或直接读取$uid节点的用户访问,并希望当阅读公共和私人。

但是,如果您打算进行任何类型的查询,则此数据结构根本无法工作,因为在读取公共数据时无法查询而无需读取私有数据。相反,你需要扯起publicprivate$uid级以上:

users 
    - public 
    - $uid 
    - private 
    - $uid 

一旦你到这一点,是的,你就必须做两次读取访问信息的两个位。记住一些东西,但:

  1. 私人信息只能由谁按照你的规则创作的,所以你可以很容易地只建立一个监听器此单个节点上,只要用户登录用户读取然后你会永远拥有它。
  2. Firebase通过正在进行的实时连接进行连接,这意味着进行多次读取不像您想象的那么昂贵。

关于重复数据需要考虑的另一件事是,Cloud Functions for Firebase可以通过处理sync-on-update而无需在客户端周围编码来实现非规范化。

+0

感谢您对数据结构的建议!我没有考虑到我正在考虑的内容对查询的影响。我要使用你提供的结构。对于我想过使用云功能的重复数据,但坚持不重复(尽可能)的计划以降低复杂性。 – skwny

相关问题