Indexa tus datos

Firebase te permite hacer consultas ad hoc en tus datos usando una clave secundaria arbitraria. Si sabes con antelación cuáles serán tus índices, puedes definirlos a través de la regla .indexOn en tus reglas de seguridad de Firebase Realtime Database para mejorar el rendimiento de las consultas.

Define los índices de datos

Firebase proporciona herramientas potentes para ordenar y consultar tus datos. Específicamente, Firebase te permite hacer consultas ad hoc en una colección de nodos con cualquier clave secundaria común. A medida que tu app se expanda, el rendimiento de esta solicitud se reducirá. Sin embargo, si indicas a Firebase las claves que consultarás, Firebase las indexará en los servidores para mejorar el rendimiento de las consultas.

Indexa con orderByChild

La manera más sencilla de explicar esto es a través de un ejemplo. Aquí en Firebase somos amantes de los dinosaurios. A continuación, incluiremos un fragmento de una base de datos de muestra con información sobre dinosaurios. Lo usaremos para explicar cómo funciona .indexOn con orderByChild().

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

Imaginemos que, en nuestra app, a menudo debemos ordenar los dinosaurios por nombre, altura y longitud, pero nunca por peso. Para mejorar el rendimiento de nuestras consultas, podemos darle esa información a Firebase. Debido a que los nombres de los dinosaurios son solo las claves, Firebase optimiza con antelación las consultas por nombre del dinosaurio, dado que esta es la clave del registro. Podemos usar .indexOn para indicarle a Firebase que también optimice las consultas por altura y longitud.

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

Al igual que otras reglas, puedes especificar una regla de .indexOn en cualquier nivel de tus reglas. En el ejemplo anterior, la ubicamos en el nivel de raíz, ya que todos los datos de dinosaurios se almacenan en la raíz de la base de datos.

Indexa con orderByValue

En este ejemplo, demostraremos cómo funciona .indexOn con orderByValue(). Supongamos que creamos una tabla de clasificación con puntuaciones de deportes de dinosaurios que incluye los siguientes datos:

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

Debido a que usamos orderByValue() para crear la tabla de clasificación, podemos agregar una regla .value a nuestro nodo /scores para optimizar nuestras consultas:

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