Indexer vos données

Firebase vous permet d'effectuer des requêtes ad hoc sur vos données à l'aide d'une clé enfant arbitraire. Si vous connaissez à l'avance vos index, vous pouvez les définir à l'aide de la règle .indexOn dans vos règles de sécurité Firebase Realtime Database pour améliorer les performances des requêtes.

Définition des index de données

Firebase fournit des outils puissants pour trier et interroger vos données. Plus précisément, Firebase vous permet d'exécuter des requêtes ad hoc sur un ensemble de nœuds à l'aide une clé enfant commune. À mesure que votre application se développe, les performances de cette requête se dégradent. Toutefois, si vous indique à Firebase les clés que vous allez interroger, il indexera ces clés sur les serveurs, ce qui améliore les performances de vos requêtes.

Indexation avec orderByChild

Le moyen le plus simple de l'expliquer est de donner un exemple. Chez Firebase, nous sommes tous d'accord pour dire que les dinosaures sont plutôt cool. Voici un extrait d'un exemple de base de données de faits sur les dinosaures. Mer l'utilisera pour expliquer comment .indexOn fonctionne avec orderByChild().

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

Imaginons que dans notre application, nous ayons souvent besoin de classer les dinosaures par nom, taille et mais jamais en poids. Nous pouvons améliorer les performances de nos requêtes en transmettant ces informations à Firebase. Comme les noms des dinosaures ne sont que des clés, Firebase a déjà optimise les requêtes par nom de dinosaure, puisqu'il s'agit de la clé de l'enregistrement. Nous pouvons utiliser .indexOn pour indiquer à Firebase d'optimiser également la hauteur et la longueur des requêtes:

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

Comme pour les autres règles, vous pouvez spécifier une règle .indexOn à n'importe quel niveau de vos règles. Nous l'avons placée au niveau racine pour l'exemple ci-dessus, car toutes les données sur les dinosaures sont stockées à la racine de la base de données.

Indexation avec orderByValue

Dans cet exemple, nous allons montrer comment .indexOn fonctionne avec orderByValue(). Imaginons que nous créions un classement des scores sportifs des dinosaures avec les données suivantes :

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

Étant donné que nous utilisons orderByValue() pour créer le classement, nous pouvons optimiser nos requêtes en ajoutant une règle .value au niveau de notre nœud /scores:

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