Firebase позволяет вам делать запросы ad-hoc к вашим данным, используя произвольный дочерний ключ. Если вы заранее знаете, какими будут ваши индексы, вы можете определить их с помощью правила .indexOn
в правилах безопасности Firebase Realtime Database, чтобы улучшить производительность запросов.
Определение индексов данных
Firebase предоставляет мощные инструменты для упорядочивания и запроса ваших данных. В частности, Firebase позволяет вам делать запросы ad-hoc к коллекции узлов, используя любой общий дочерний ключ. По мере роста вашего приложения производительность этого запроса снижается. Однако, если вы сообщите 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" } } }