Firebase vous permet d'effectuer des requêtes ad hoc sur vos données à l'aide d'une clé enfant arbitraire. Si vous savez à l'avance quels seront vos index, vous pouvez les définir via la règle .indexOn
dans vos règles de sécurité de base de données en temps réel Firebase 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'effectuer des requêtes ad hoc sur une collection de nœuds à l'aide de n'importe quelle clé enfant commune. Au fur et à mesure que votre application se développe, les performances de cette requête se dégradent. Cependant, si vous informez Firebase des clés que vous interrogerez, Firebase indexera ces clés sur les serveurs, améliorant ainsi les performances de vos requêtes.
Indexation avec orderByChild
La façon la plus simple d'expliquer cela est à travers 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. Nous l'utiliserons 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 longueur, mais jamais par poids. Nous pouvons améliorer les performances de nos requêtes en communiquant ces informations à Firebase. Étant donné que le nom des dinosaures n'est que la clé, Firebase optimise déjà 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 les requêtes de hauteur et de longueur :
{ "rules": { "dinosaurs": { ".indexOn": ["height", "length"] } } }
Comme les autres règles, vous pouvez spécifier une règle .indexOn
à n'importe quel niveau de vos règles. Nous l'avons placé 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()
. Disons que nous créons un classement des scores sportifs de dino avec les données suivantes :
{ "scores": { "bruhathkayosaurus" : 55, "lambeosaurus" : 21, "linhenykus" : 80, "pterodactyl" : 93, "stegosaurus" : 5, "triceratops" : 22 } }
Puisque nous utilisons orderByValue() pour créer le classement, nous pouvons optimiser nos requêtes en ajoutant une règle .value
à notre nœud /scores
:
{ "rules": { "scores": { ".indexOn": ".value" } } }