該做什麼和不該做什麼
錯誤的方法
考慮以下結構
{
"users": {
// Uniquely generated IDs for children is common practice,
// it's actually really useful for automating child creation.
// Auto-incrementing an integer for a key can be problematic when a child is removed.
"-KH3Cx0KFvSQELIYZezv": {
"name": "Jon Snow",
"aboutMe": "I know nothing...",
"posts": {
"post1": {
"body": "Different roads sometimes leads to the same castle",
"isHidden": false
},
"post2": { ... },
// Possibly more posts
}
},
"-KH3Dx2KFdSLErIYZcgk": { ... }, // Another user
// A lot more users here
}
}
這是不該做的一個很好的例子。如上所述的多巢狀結構可能非常有問題,並且可能導致巨大的效能挫折。
Firebase 訪問節點的方式是下載所有子節點的資料,然後迭代所有相同級別的節點(所有父節點的子節點)。現在,想象一個包含多個使用者的資料庫,每個使用者都有數百(甚至數千) 個帖子。在這種情況下訪問帖子可能會載入數百兆位元組的未使用資料。在更復雜的應用程式中,巢狀可能比僅僅 4 層更深,這將導致更多無用的下載和迭代。
正確的方式
扁平化相同的結構看起來像這樣
{
// "users" should not contain any of the posts' data
"users": {
"-KH3Cx0KFvSQELIYZezv": {
"name": "Jon Snow",
"aboutMe": "I know nothing..."
},
"-KH3Dx2KFdSLErIYZcgk": { ... },
// More users
},
// Posts can be accessed provided a user key
"posts": {
"-KH3Cx0KFvSQELIYZezv": { // Jon Snow's posts
"post1": {
"body": "Different roads sometimes leads to the same castle",
"isHidden": false
},
"post2": { ... },
// Possibly more posts
},
"-KH3Dx2KFdSLErIYZcgk": { ... },
// other users' posts
}
}
通過迭代較少的節點來訪問目標物件,這可以節省大量開銷。所有的使用者沒有任何帖子不會在存在職位分支,並在這些使用者,以便迭代方式不對以上是完全無用的。