该做什么和不该做什么
错误的方法
考虑以下结构
{
"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
}
}
通过迭代较少的节点来访问目标对象,这可以节省大量开销。所有的用户没有任何帖子不会在存在职位分支,并在这些用户,以便迭代方式不对以上是完全无用的。