为您的数据编制索引

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" } } }