在Firebase

时间:2016-02-07 15:46:12

标签: firebase

我正在尝试弄清楚如何在Firebase中的父节点的所有实例中查询特定命名的子节点。可以假设查询的所有父节点都在其中具有此特定命名的子节点。

在此示例中,uid是每个用户的唯一标识符,我正在尝试获取displayNames的列表:

{
  users: {
    uid: {
      displayName: "stringOfSomeKind"
    }
    uid2: {
      displayName: "moreStrings"
    }
    uid3: {
      displayName: "evenMoreStrings"
    }
    ...
  }
}

这样做的目的是让我查看当前是否有displayName。 (我不能使用displayName作为主键,因为当用户登录时,我只能使用uid。)

如何有效地检查是否已经采用了其中一个displayNames?我是否必须对数据进行非规范化才能有效地执行此操作?如果是这样,怎么样?

2 个答案:

答案 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中,此类索引由系统维护。