【问题标题】:Retrieve superficial data of a big Firebase Database检索大型 Firebase 数据库的表面数据
【发布时间】:2023-04-05 14:19:01
【问题描述】:

我在 Firebase 中有一个大型数据库。在我看来,它的结构是错误的。 试图获取参考快照,处理结果需要太多时间。 但是,我不需要检索所有数据。我不需要更深层的项目,但我不知道如何获得表面的。

所以结构是这样的:

clients {
    1234 {
      name: 'Paul',
      last_name: 'Mcartney',
      city: 'Liverpool',
      account_movements: {
           item1: {
              ...
           }
      }
    }
    1234 { ... }
    1236 { ... }
}

假设我需要的是除了他的account_movements 之外的所有客户数据。

【问题讨论】:

  • 当您从 Firebase 读取数据时,您总是会获得完整的节点。没有办法获取每个节点的属性子集,也没有办法只获取密钥。另见stackoverflow.com/questions/37365866/…
  • 这个要求通常意味着您应该进一步非规范化您的数据。例如:您可能应该将每个客户端下的account_movements 删除到它们自己的顶级节点中。

标签: firebase firebase-realtime-database


【解决方案1】:

因为您正在谈论一个大型数据库,所以我建议您稍微重构一下您的数据库。正如弗兰克所说,当你试图读取一个节点时,你会得到整个节点。这意味着每次将侦听器添加到特定引用时,您都在下载该对象的全部信息。请注意,您无法仅下载每个节点的一部分属性,这就是您需要denormalize 数据库的原因。因为 Firebase 中的一条重要规则是使数据库尽可能扁平化,所以我建议您从每个用户那里获取 account_movements 并将其单独添加为顶级节点。为了更好地理解,我建议你阅读这篇文章,Structuring your Firebase Data correctly for a Complex App 并查看本教程,Denormalization is normal with the Firebase Database

希望对你有帮助。

【讨论】:

  • 感谢@Alex_Mamo 提供您的信息。我怀疑非规范化将是唯一的解决方案。您的回答完成以确认这一点。
【解决方案2】:

您可以使用自己的 id 创建新节点“account_movements”并将它们添加到用户,也可以为没有用户详细信息的用户创建另一个节点。第二种解决方案需要更多空间,但更容易进行读取操作,因为您只需要创建 1 个调用(有或没有详细信息的用户)而不是读取 account_movements 的 id 来创建第二个调用。在此示例中,您可以使用用户 ID 命名 account_movements 的 ID。但这并不总是可能的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-09
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多