Indexar seus dados

O Firebase permite que você realize consultas ad-hoc usando uma chave filha arbitrária. Se você souber com antecedência quais serão seus índices, poderá defini-los pela regra .indexOn nas regras de segurança do Firebase Realtime Database para melhorar o desempenho das consultas.

Definir índices de dados

O Firebase fornece ferramentas eficientes para classificação e consulta de dados. Especificamente, O Firebase permite que você faça consultas ad-hoc em uma coleção de nodes usando qualquer chave filha comum. Conforme seu aplicativo é expandido, o desempenho dessa consulta é degradado. No entanto, se você informar ao Firebase as chaves para consultar, ele as indexará nos servidores, melhorando o desempenho das suas consultas.

Indexar com orderByChild

A maneira mais fácil de explicar esse processo é com um exemplo. Toda a equipe do Firebase concorda que dinossauros são incríveis. Veja um snippet de uma amostra de banco de dados sobre dinossauros. Ele será usado para explicar como o .indexOn funciona com orderByChild().

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

Vamos imaginar que, no nosso app, muitas vezes nós precisamos classificar os dinossauros por nome, altura e comprimento, mas nunca por peso. Podemos melhorar o desempenho das nossas consultas dizendo ao Firebase essas informações. Como os nomes dos dinossauros são apenas as chaves, o Firebase já otimiza as consultas pelo nome do dinossauro, já que o nome é a chave do registro. Também é possível usar .indexOn para instruir o Firebase a otimizar as consultas de altura e comprimento:

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

Assim como outras regras, é possível especificar uma regra .indexOn em qualquer nível nas suas regras. Nós a posicionamos no nível raiz no exemplo acima, pois todos os dados sobre dinossauros são armazenados na raiz do banco de dados.

Indexar com orderByValue

Neste exemplo, demonstraremos como .indexOn funciona com orderByValue(). Vamos imaginar que estamos criando um placar com as pontuações de esportes praticados pelos dinossauros com os dados a seguir:

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

Como estamos usando orderByValue() para criar o placar, podemos otimizar as consultas adicionando uma regra .value ao nó /scores:

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