为您的数据编制索引

Firebase 允许您使用任意子键对数据进行临时查询。如果您事先知道您的索引将是什么样子,您可通过 Firebase Realtime Database 安全规则中的 .indexOn 规则来定义索引,以改善查询性能。

定义数据索引

Firebase 提供了强大的工具供您对数据进行排序查询。尤其值得一提的是,Firebase 允许您使用任何常见子键对节点集合进行临时查询。但随着应用的规模不断发展,这种查询的性能会逐步降低。但是,如果您告诉 Firebase 您将查询的键,Firebase 将在服务器上将这些键编入索引,从而改善查询的性能。

使用 orderByChild 编制索引

要介绍这一操作,最简单的方式是举例说明。Firebase 团队的所有成员都觉得恐龙很酷。以下是摘自恐龙信息示例数据库中的代码片段。我们将使用该代码片段来解释 .indexOn 如何与 orderByChild() 搭配使用。

{
  "lambeosaurus": {
    "height" : 2.1,
    "length" : 12.5,
    "weight": 5000
  },
  "stegosaurus": {
    "height" : 4,
    "length" : 9,
    "weight" : 2500
  }
}

假设在我们的应用中,我们经常需要按照名字、高度和长度来对恐龙进行排序,而从不会按照重量排序。我们可以通过告诉 Firebase 这些信息来改善查询性能。由于恐龙的名字本身就是键,Firebase 已经优化了通过恐龙名字进行的查询,因为这是已经记录在案的键。我们可以使用 .indexOn 告诉 Firebase 也优化使用高度和长度进行的查询:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

与其他规则一样,您可以在规则的任何层级指定 .indexOn 规则。在上例中,我们将其置于根目录一级,因为所有恐龙数据都存储在数据库的根目录下。

使用 orderByValue 编制索引

在此示例中,我们将演示如何将 .indexOnorderByValue() 搭配使用。比方说,我们正在使用以下数据制作一个恐龙体育成绩排行榜:

{
  "scores": {
    "bruhathkayosaurus" : 55,
    "lambeosaurus" : 21,
    "linhenykus" : 80,
    "pterodactyl" : 93,
    "stegosaurus" : 5,
    "triceratops" : 22
  }
}

由于我们使用 orderByValue() 制作排行榜,我们可以通过在 /scores 节点上添加 .value 规则来优化查询:

{
  "rules": {
    "scores": {
      ".indexOn": ".value"
    }
  }
}