【问题标题】:Object references inside Firebase structure?Firebase 结构中的对象引用?
【发布时间】:2017-01-07 14:09:30
【问题描述】:

是否可以引用 Firebase 数据库中其他地方的对象?这是一个例子:

{
  "articles": {
    "-article1": {
      "title": "Article 1",
      "category": "Other",
      "owner": root.users['-user1']
    },
    "-article2": {
      "title": "Article 2",
      "category": "Other",
      "owner": root.users['-user2'].value
    }
  },
  "users": {
    "-user1": {
      "name": "User 1",
      "articles": {
        "-article1": root.articles['-article1'].value
      }
    },
    "-user2": {
      "name": "User 2",
      "articles": {
        "-article2": root.articles['-article2'].value
      }
    }
  }
}

这种方式应该会使查询变得更容易,因为我不需要先查询文章本身,然后从“用户”路径获取用户信息。然而,像上面那样做会产生文章->所有者->文章->所有者等的无限循环......除非,Firebase会看到这一点,而是将重复值设置为null。

无论如何,这可能吗?

提前致谢!

【问题讨论】:

    标签: firebase firebase-realtime-database


    【解决方案1】:

    在 Firebase 中,使用 childByAutoId (swift) 或 push().key (web) 为您的节点创建密钥通常是最佳做法。这会将键与其包含的数据分离,并使您能够使用“引用”

    这是一个示例,其中文章引用了创建它的用户,而用户引用了他们创建的文章。

    请注意,通常会有一个 /users 节点,其子用户节点键是用户的 uid。

      articles
        -YUj9sj9sjaalkd
          title: "Article 1",
          category: "Other",
          owner: "uid_1"
        -YE0989jkamskks
          title: "Article 2",
          category: "Other",
          owner: "uid_2"
    
      users
        uid_1
          name: "User 1",
          articles
            -YUj9sj9sjaalkd: true
        uid_2
          name: "User 2",
          articles
            -YE0989jkamskks: true
    

    【讨论】:

    • 这就是我现在的样子。这样我首先必须得到文章,然后我需要得到用户。所以这需要进行两次查询。我带来的示例只需要一个查询,因为用户信息已经在文章对象中作为参考。
    • @NordlingArt 查看原始问题,呈现的 Firebase 结构包含用户信息。它包含 owner:root.users['-user1'] 的 key:value 对,它是对用户的“引用”。即它不包含例如用户名。我试图通过将键名与数据分开来为您提供一种在不“锁定”键名的情况下引用数据的方法。
    • @NordlingArt 哦,是的,Firebase 的一部分正在对数据进行非规范化。扁平化数据使其更易于访问和灵活,代价可能是额外的查询。其中很多也取决于您的用例 - 最初的问题没有指定最终目标是 是否可以在 Firebase 的其他地方引用对象?。所以说这是一个只有用户和帖子的应用程序。在这种情况下,所有实际帖子都可以存储在创建它的用户节点中,这将完全消除查询。
    • @NordlingArt 在许多情况下查找连接数据并不像您想象的那么慢,因为请求是通过同一连接进行管道传输的。在这里查看我的解释:stackoverflow.com/questions/35931526/….
    • @jay - 你说得对,我只是在寻找另一种结构类型。扁平化数据库也适用于我。我会将您的答案标记为正确:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多