要理解爲什麼「扁平」結構更好,最簡單的方法就是看你如何保護它以及如何實現功能。
你的第一個結構是:
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
。
我當前的用例是在用戶標識已知時查看配置文件信息,這就是爲什麼我很難看出差異。更多的嵌套方法可以防止獲取配置文件列表,這些配置文件稍後可能會派上用場。 –
這基本上意味着新用戶在註冊後需要在數據庫中寫入兩次:1.用於「用戶」節點的新條目(與其子節點一起使用的uid)2.用於「配置文件」節點的新條目(具有displayName子節點的uid) ? @FrankVanPuffelen – Ewoks
@Ewoks是的,這是正確的。 Frank的方法在NoSQL數據庫設計中很常見,其中讀寫性能的提高是以寫性能下降爲代價的。 –