2016-07-29 38 views
7

當然,我的數據庫中的用戶具有可公開訪問的信息以及他們應該看到的其他信息。我正在考慮兩種不同的方式來實現這一點。Firebase:如何構建公共/私人用戶數據

選項1:/users/$uid只能由該用戶閱讀並且/users/$uid/profile可以被任何人閱讀。

選項2:保留/users/$uid只能由該用戶讀取,並且有公開的/profiles/$uid。這遵循一個更平坦的數據結構的建議,但我不明白在這種情況下它有多好。

回答

12

要理解爲什麼「扁平」結構更好,最簡單的方法就是看你如何保護它以及如何實現功能。

你的第一個結構是:

users: { 
    uidOfJacob: { 
    stackId: 884522, 
    ssn: "999-99-9999", 
    profile: { 
     displayName: "Jacob Philips" 
    } 

    }, 
    uidOfPuf: { 
    stackId: 209103, 
    ssn: "999-99-9999", 
    profile: { 
     displayName: "Frank van Puffelen" 
    } 
    } 
} 

你會用它固定:

{ 
    "rules": { 
    "users": { 
     "$uid": { 
     ".read": "auth.uid == $uid", 
     ".write": "auth.uid == $uid" 
     "profile": { 
      ".read": true 
     } 
     } 
    } 
    } 
} 

其中一個主要的原因有公共信息是能夠顯示的信息列表。在JavaScript中:

ref.child('users').child(???).child('profile').on('child_added'... 

這是行不通的,因爲我們在???中放了什麼。 Firebase操作需要能夠從一個位置讀取整個列表,並且用戶需要具有該整個位置的讀取權限(而不僅限於各個子節點)。

如果我們結構中的數據對公衆信息來自私人信息分開,我們得到:

{ 
    "rules": { 
    "users": { 
     "$uid": { 
     ".read": "auth.uid == $uid", 
     ".write": "auth.uid == $uid" 
     } 
    }, 
    "profiles": { 
     ".read": true, 
     "$uid": { 
     ".write": "auth.uid == $uid" 
     } 
    } 
    } 
} 

不得到的名單:

users: { 
    uidOfJacob: { 
    stackId: 884522, 
    ssn: "999-99-9999", 
    profile: { 
     displayName: "Jacob Philips" 
    } 

    }, 
    uidOfPuf: { 
    stackId: 209103, 
    ssn: "999-99-9999", 
    profile: { 
     displayName: "Frank van Puffelen" 
    } 
    } 
}, 
"profile": { 
    uidOfJacob: { 
    displayName: "Jacob Philips" 
    }, 
    uidOfPuf: { 
    displayName: "Frank van Puffelen" 
    } 
} 

你會先固定好公共用戶配置文件,你會這樣做:

ref.child('profiles').on('child_added'... 

這將工作,因爲每個人都有讀權限o n profiles

+0

我當前的用例是在用戶標識已知時查看配置文件信息,這就是爲什麼我很難看出差異。更多的嵌套方法可以防止獲取配置文件列表,這些配置文件稍後可能會派上用場。 –

+0

這基本上意味着新用戶在註冊後需要在數據庫中寫入兩次:1.用於「用戶」節點的新條目(與其子節點一起使用的uid)2.用於「配置文件」節點的新條目(具有displayName子節點的uid) ? @FrankVanPuffelen – Ewoks

+2

@Ewoks是的,這是正確的。 Frank的方法在NoSQL數據庫設計中很常見,其中讀寫性能的提高是以寫性能下降爲代價的。 –