Firebase позволяет выполнять произвольные запросы к данным, используя произвольный дочерний ключ. Если вы заранее знаете, какие индексы будут использоваться, вы можете определить их с помощью правила .indexOn в правилах безопасности базы данных Firebase Realtime Database, чтобы повысить производительность запросов.
Определение индексов данных
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
В этом примере мы продемонстрируем, как работает метод .indexOn с orderByValue() . Допустим, мы создаём таблицу лидеров по результатам соревнований по динозавровой тематике, используя следующие данные:
{
"scores": {
"bruhathkayosaurus" : 55,
"lambeosaurus" : 21,
"linhenykus" : 80,
"pterodactyl" : 93,
"stegosaurus" : 5,
"triceratops" : 22
}
} Поскольку для создания таблицы лидеров мы используем orderByValue(), мы можем оптимизировать наши запросы, добавив правило .value в наш узел /scores :
{
"rules": {
"scores": {
".indexOn": ".value"
}
}
}