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