我正在尝试弄清楚如何在Firebase中的父节点的所有实例中查询特定命名的子节点。可以假设查询的所有父节点都在其中具有此特定命名的子节点。
在此示例中,uid
是每个用户的唯一标识符,我正在尝试获取displayNames
的列表:
{
users: {
uid: {
displayName: "stringOfSomeKind"
}
uid2: {
displayName: "moreStrings"
}
uid3: {
displayName: "evenMoreStrings"
}
...
}
}
这样做的目的是让我查看当前是否有displayName
。 (我不能使用displayName
作为主键,因为当用户登录时,我只能使用uid
。)
如何有效地检查是否已经采用了其中一个displayNames
?我是否必须对数据进行非规范化才能有效地执行此操作?如果是这样,怎么样?
答案 0 :(得分:3)
Firebase世界完全不同!
当出现这种情况时,你必须考虑重新设计你的数据库结构,在你的情况下,uid是唯一的标识符,所以displayName-在技术上讲。
您必须维护其他数据,如:
{
users: {
uid: {
displayName: "stringOfSomeKind"
}
uid2: {
displayName: "moreStrings"
}
uid3: {
displayName: "evenMoreStrings"
}
...
}
displayNames: {
"display_name": "uid",
"display_name2": "uid2",
"display_name3": "uid3"
...
}
}
快乐帮助!
答案 1 :(得分:1)
从Firebase加载节点时,您还可以获取该节点下的所有数据。假设每个用户的数据多于其显示名称,那确实会导致不必要的数据加载。
如果您只想加载显示名称列表,则应该存储显示名称列表。
{
displayNames: {
"stringOfSomeKind": "uid",
"moreStrings": "uid2",
"evenMoreStrings": "uid3"
}
}
如果您来自关系/ SQL数据库的背景,这一开始可能看起来不自然。对我来说,它有助于意识到这些结构是索引,与您可能添加到关系数据库的“displayName”索引相同。不同之处在于,在NoSQL / Firebase中,您的代码维护索引,而在大多数RDBMS中,此类索引由系统维护。