En esta ocasión como continuación de mi serie sobre las herramientas de Firebase vamos a hablar sobre Firestore, esta es la nueva base de datos de Firebase completamente NoSQL basada en índices documentos. en la cual podemos guardar muchos tipos de datos y mantiene viva la característica primordial de Firebase, “Es en tiempo real”.

Base de datos o no…

Esto nace del hecho de que es una base de datos que ante todo si no has trabajado con NoSQL no parece una base de datos. Para esto hay que ver que una base de datos tiene 2 características primordiales que son.

Almacenamiento de datos:

Si, una base de datos como su nombre lo indica debe ser un almacenamiento de datos persistente que nos permita guardar información por mucho tiempo y manejar las operaciones básicas que conocemos como CRUD. Esto significa que podamos Crear, Editar y Eliminar. En firestore claro que podemos hacer todo esto y podemos implementar muchas cosas más como reglas sobre los registros, y triggers usando Cloud Functions

Algo importante de cómo funciona es que se basa en Colecciones y Documentos. Esto lo podemos ver como que una Colección es una tabla y los documentos son los registros de la misma. Una de las principales características es que los campos dentro de los documentos no son rígidos por lo que podemos tener documentos completamente distintos dentro de una colección.

Búsqueda de los datos:

La búsqueda en Firestore es muy completa y ante todo como norma de una base NoSQL es sumamente rápida. Esta búsqueda se puede llevar a cabo de distintas formas, desde buscar la llave exacta de un documento en la colección hasta poder validar los valores del documento en sí.

Algo importante de las búsquedas es que cuando filtramos por un dato X, debemos ordenar por ese mismo dato. En caso queramos combinar varios datos y ordenar por uno deberemos crear un índice, esto debido a que los índices mantienen la alta velocidad de query.

Tipos de datos: 

En  Firestore hay muchos tipos de datos ya que contemplan desde mapas de objetos hasta el clásico String o cadena de texto:

String:

La clásica cadena de texto que podemos utilizar para almacenar básicamente cualquier cosa. Algo importante a destacar es que este campo es como el Text de SQL ya que no tiene un límite de caracteres.

Number:

El campo numérico siempre es necesario y en este caso algo que a mi personalmente me encanta es que dentro del mismo campo almacenamos tanto enteros como decimales sin importar el tamaño del número y/o sus decimales. 

Boolean:

¿1 o 0? El campo de tipo booleano es la base del desarrollo en muchos sentidos y claro que los documentos en nuestro base pueden tener una propiedad de esta naturaleza. Se escribe solamente true o false.

Map:

Este tipo de dato es sumamente poderoso ya que nos permite guardar un objeto de tipo JSON en nuestra base de datos de una forma eficiente. Ahora bien recordemos que con un gran poder…. viene una gran responsabilidad.

Este campo para algunos se vuelve el depósito de todos esos locos parámetros que podemos necesitar y eso es algo que no querrás pues será más complejo hacer tus búsquedas.

Array:

Este campo es muy bueno si debemos guardar un listado simple de datos por ejemplo queremos guardar las palabras de una oración separadas en lugar de usar un String este campo las guardara para obtenerlas por la posición deseada.

Null:

Este campo para algunos es un poco raro pero es fundamental, ante todo para prever muchos posible errores ya que como sabemos no es lo mismo decir que un campo no tiene un valor a simplemente decir que no existe. 

Timestamp:

Esto es algo que necesitan todas las bases de datos, un campo de Fecha y hora. Estos campos suelen ser principalmente para guardar un registro de acciones como lo son creaciones y ediciones.

Geopoint:

Así como el campo MAP este es peculiar de Firestore y nos permite almacenar específicamente coordenadas basadas en Latitud y Longitud, si bien podríamos almacenar esta información en nuestros campos STRING este campo nos permitirá realizar búsquedas precisamente de los parámetros e incluso con parámetros de distancia.

Reference

Este campo es lo más cercano a una llave foránea de una base SQL, aquí almacenamos un dato que se ve cómo <collection>/<unique key>. Algo genial de esto es que cuando obtenemos este campo de un documento en nuestra aplicación, es super simple tomarlo por su nombre y usar el método .get().

Operaciones de datos:

Una base de datos necesita más que almacenar datos para ser completamente funcional y es que debemos poder operar en ellos, como platicamos al principio la búsqueda es un pilar pero también tenemos que poder  crear, editar y eliminar. A continuación las veremos un poco más a detalle:

Crear (add):

Este método es muy útil ante todo cuando trabajamos con listas de datos ya que podemos hacer que Firebase se encargue de generar la llave única para cada elemento dentro de la colección y nosotros solamente utilizar el método setData()  para que se almacene la información en el nuevo destino que Firebase haya dictaminado.

Si quisiéramos generar nosotros dichas llaves o usar alguna anterior como referencia para crearla lo mejor es usar el método de edición ya que al no encontrar uno, simplemente actualizará de null a lo que le demos.

Editar (update):

Esta acción es de suma importancia porque si bien podríamos unificar la acción de crear y editar en una función la idea de estar separadas es que podamos modificar puntualmente un dato sin tener que cambiar todo el documento así como poder incluso regular los accesos en las reglas.

Eliminar (delete):

Podemos eliminar desde un documento hasta una colección completa. Para eso solamente debemos tener la referencia o “ruta” de lo que queremos eliminar. Un punto importante es que si eliminamos todos los documentos de una colección esta misma deja de existir.

Tiempo real:

Una de las cosas más destacadas de Firebase en si es que las bases de datos son en tiempo real. Ahora bien si no las conoces esto solo genera una reacción “¿Como así?”.

Esto significa que si queremos podemos realizar una escucha sobre todos los cambios que se realizan a cierto documento, colección o bien aquellos documentos que encajen con nuestra consulta. Para ser preciso, podemos detectar los siguientes eventos:

  • Crear
  • Editar
  • Eliminar

Data Sin Conexión:

Para ello se utiliza la caché de los dispositivos. Debemos asignar el tamaño máximo de dicha caché y como se manejara. 

Al realizar una búsqueda y no tener conexión se revisa en la caché si existe el documento eso obtenemos si no existe recibiremos un error. Esto función también para los datos que escribimos, los cuales se guardan por un tiempo mientras la aplicación no se cierre por completo.

Seguridad:

Una de las principales preguntas que recibimos al hablar de Firebase en general es la seguridad ya que como no podemos ver el manejo del servidor, reglas de firewall, etc. A veces nos sentimos un poco raros.

Ahora bien, tranquilos. Firebase tiene un set de reglas de seguridad increibles, muy granulares que nos permiten decir que propiedades debe tener los usuarios que tengan acceso de lectura a cada colección por separado así como para la escritura. Incuso podemos manejar si tienen acceso a cada documento. 

Un ejemplo de esto es que los usuarios solo puedan editar sus propios perfiles y podemos validarlos en base a sus UID.