2017-09-16 33 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

相關問題