Utilice Cloud Firestore con Firebase Realtime Database

Puedes usar Firebase Realtime Database y Cloud Firestore en tu aplicación y aprovechar los beneficios de cada solución de base de datos para satisfacer tus necesidades. Por ejemplo, es posible que desee aprovechar el soporte de presencia de Realtime Database, como se describe en Crear presencia en Cloud Firestore .

Obtenga más información sobre las diferencias entre las bases de datos .

Mover datos a Cloud Firestore

Si ha decidido que desea migrar algunos de sus datos de Realtime Database a Cloud Firestore, considere el siguiente flujo. Debido a que cada base de datos tiene necesidades y consideraciones estructurales únicas, no existe una ruta de migración automatizada. En su lugar, puedes seguir esta progresión general:

  1. Asigne la estructura de datos y las reglas de seguridad de Realtime Database a Cloud Firestore. Tanto Realtime Database como Cloud Firestore dependen de Firebase Authentication, por lo que no es necesario cambiar la autenticación de usuario para su aplicación. Sin embargo, las reglas de seguridad y el modelo de datos son diferentes y es importante tener en cuenta cuidadosamente esas divergencias antes de comenzar a mover datos a Cloud Firestore.

  2. Mover datos históricos. Mientras configura su nueva estructura de datos en Cloud Firestore, puede asignar y mover datos existentes desde Realtime Database a su nueva instancia de Cloud Firestore. Sin embargo, si utiliza ambas bases de datos en su aplicación, no necesita mover datos históricos fuera de Realtime Database.

  3. Refleje nuevos datos en Firestore en tiempo real. Utilice Cloud Functions para escribir nuevos datos en su nueva base de datos de Cloud Firestore a medida que se agrega a Realtime Database.

  4. Haga de Cloud Firestore su base de datos principal para los datos migrados. Una vez que hayas migrado algunos de tus datos, usa Cloud Firestore como tu base de datos principal y reduce el uso de Realtime Database para los datos migrados. Considere las versiones de su aplicación que todavía están vinculadas a Realtime Database para esos datos y cómo planea continuar admitiéndolas.

Asegúrese de tener en cuenta los costos de facturación tanto de Realtime Database como de Cloud Firestore .

Mapea tus datos

Los datos en Realtime Database están estructurados como un único árbol, mientras que Cloud Firestore admite jerarquías de datos más explícitas a través de documentos, colecciones y subcolecciones. Si mueve algunos de sus datos de Realtime Database a Cloud Firestore, es posible que desee considerar una arquitectura diferente para sus datos.

Principales diferencias a considerar

Si mueves datos de tu árbol de Realtime Database existente a documentos y colecciones de Cloud Firestore, ten en cuenta las siguientes diferencias importantes entre las bases de datos que podrían afectar la forma en que estructuras los datos en Cloud Firestore:

  • Las consultas superficiales ofrecen más flexibilidad en estructuras de datos jerárquicas.
  • Las consultas complejas ofrecen más granularidad y reducen la necesidad de datos duplicados.
  • Los cursores de consulta ofrecen una paginación más sólida.
  • Las transacciones ya no requieren una raíz común para todos sus datos y son más eficientes.
  • Los costos de facturación difieren entre Realtime Database y Cloud Firestore. En muchos casos, Cloud Firestore puede ser más costoso que Realtime Database, especialmente si depende de muchas operaciones pequeñas. Considere reducir la cantidad de operaciones en su base de datos y evitar escrituras innecesarias. Obtenga más información sobre las diferencias en la facturación entre Realtime Database y Cloud Firestore.

Mejores prácticas en acción

El siguiente ejemplo refleja algunas de las consideraciones que podría hacer al cambiar sus datos entre bases de datos. Puede aprovechar lecturas superficiales y capacidades de consulta mejoradas para estructuras de datos más naturales que las que haya utilizado con Realtime Database.

Considere una aplicación de guía urbana que ayude a los usuarios a encontrar puntos de referencia notables en ciudades de todo el mundo. Dado que Realtime Database carece de lecturas superficiales, es posible que haya tenido que estructurar los datos en dos nodos de nivel superior, de la siguiente manera:

// /cities/$CITY_KEY
{
  name: "New York",
  population: 8000000,
  capital: False
}

// /city-landmark/$CITY_KEY/$LANDMARK_KEY
{
  name: "Empire State Building",
  category: "Architecture"
}

Cloud Firestore tiene lecturas superficiales, por lo que consultar documentos en una colección no extrae datos de subcolecciones. En consecuencia, puede almacenar información sobre puntos de referencia en una subcolección:

// /cities/$CITY_ID
{
  name: "New York",
  population: 8000000,
  capital: False,
  landmarks: [... subcollection ...]
}

Los documentos tienen un tamaño máximo de 1 MB, lo cual es otra razón para almacenar puntos de referencia como una subcolección, manteniendo cada documento de ciudad pequeño, en lugar de inflar los documentos con listas anidadas.

Las capacidades de consulta avanzadas de Cloud Firestore reducen la necesidad de duplicar datos para patrones de acceso comunes. Por ejemplo, considere una pantalla en la aplicación de guía de ciudades que muestra todas las capitales ordenadas por población. En Realtime Database, la forma más eficaz de hacer esto es mantener una lista separada de ciudades capitales que duplique los datos de la lista cities , de la siguiente manera:

{
   cities: {
    // ...
   },

   capital-cities: {
     // ...
   }
}

En Cloud Firestore, puedes expresar una lista de ciudades capitales en orden de población como una sola consulta:

db.collection('cities')
    .where('capital', '==', true)
    .orderBy('population')

Lea más sobre el modelo de datos de Cloud Firestore y eche un vistazo a nuestras Soluciones para obtener más ideas sobre cómo estructurar su base de datos de Cloud Firestore.

Asegure sus datos

Ya sea que esté utilizando las reglas de seguridad de Cloud Firestore para Android, Apple o clientes web, o la administración de acceso de identidad (IAM) para servidores, asegúrese de proteger sus datos en Cloud Firestore y en Realtime Database. La autenticación del usuario se maneja mediante Autenticación para ambas bases de datos, por lo que no necesita cambiar su implementación de Autenticación cuando comienza a usar Cloud Firestore.

Principales diferencias a considerar

  • Los SDK móviles y web utilizan las reglas de seguridad de Cloud Firestore, mientras que los SDK de servidor utilizan Identity Access Management (IAM) para proteger los datos.
  • Las reglas de seguridad de Cloud Firestore no se aplican en cascada a menos que uses un comodín. De lo contrario, los documentos y las colecciones no heredan reglas.
  • Ya no es necesario validar los datos por separado (como lo hacía en Realtime Database ).
  • Cloud Firestore verifica las reglas antes de ejecutar una consulta para asegurarse de que el usuario tenga el acceso adecuado a todos los datos devueltos por la consulta.

Mover datos históricos a Cloud Firestore

Una vez que haya asignado sus estructuras de seguridad y datos a los modelos de seguridad y datos de Cloud Firestore, puede comenzar a agregar sus datos. Si planeas consultar datos históricos después de mover tu aplicación de Realtime Database a Cloud Firestore, agrega una exportación de tus datos antiguos a tu nueva base de datos de Cloud Firestore. Si planeas usar Realtime Database y Cloud Firestore en tu aplicación, puedes omitir este paso.

Para evitar sobrescribir datos nuevos con datos antiguos, es posible que desee agregar primero sus datos históricos. Si agrega datos nuevos a ambas bases de datos simultáneamente, como se analiza en el siguiente paso, asegúrese de dar prioridad a los datos nuevos agregados a Cloud Firestore por Cloud Functions.

Para migrar datos históricos a Cloud Firestore, sigue estos pasos:

  1. Exporte sus datos desde Realtime Database o utilice una copia de seguridad reciente .
    1. Vaya a la sección Base de datos en tiempo real en Firebase console.
    2. En la pestaña Datos , seleccione el nodo de nivel raíz de su base de datos y seleccione Exportar JSON en el menú.
  2. Crea tu nueva base de datos en Cloud Firestore y agrega tus datos .

    Considere las siguientes estrategias al mover algunos de sus datos a Cloud Firestore:

    • Escriba un script personalizado que transfiera sus datos por usted. Si bien no podemos ofrecer una plantilla para este script, porque cada base de datos tendrá necesidades únicas, los expertos de Cloud Firestore en nuestro canal Slack o en Stack Overflow pueden revisar su script u ofrecer consejos para su situación específica.
    • Utilice los SDK del servidor (Node.js, Java, Python o Go) para escribir datos directamente en Cloud Firestore. Para obtener instrucciones sobre cómo configurar los SDK del servidor, consulte Introducción .
    • Para acelerar las migraciones de datos de gran tamaño, utilice escrituras por lotes y envíe hasta 500 operaciones en una sola solicitud de red.
    • Para mantenerte dentro de los límites de velocidad de Cloud Firestore , limita las operaciones a 500 escrituras por segundo para cada colección.

Agregar nuevos datos a Cloud Firestore

Para mantener la paridad entre sus bases de datos, agregue nuevos datos a ambas bases de datos en tiempo real. Utilice Cloud Functions para activar una escritura en Cloud Firestore cada vez que un cliente escriba en Realtime Database. Asegúrate de que Cloud Firestore dé prioridad a los datos nuevos provenientes de Cloud Functions sobre cualquier escritura que estés realizando a partir de tu migración de datos históricos.

Cree una función para escribir datos nuevos o cambiantes en Cloud Firestore cada vez que un cliente escribe datos en Realtime Database. Obtenga más información sobre los activadores de bases de datos en tiempo real para Cloud Functions.

Haga de Cloud Firestore su base de datos principal para los datos migrados

Si ha decidido utilizar Cloud Firestore como su base de datos principal para algunos de sus datos, asegúrese de tener en cuenta las funciones de duplicación de datos que haya configurado y valide sus reglas de seguridad de Cloud Firestore.

  1. Si usó Cloud Functions para mantener la paridad entre sus bases de datos, asegúrese de no duplicar operaciones de escritura en ambas bases de datos en un bucle. Cambie su función para escribir en una única base de datos, o elimine la función por completo y comience a eliminar gradualmente la funcionalidad de escritura para los datos migrados en aplicaciones que aún están vinculadas a Realtime Database. La forma en que maneje esto para su aplicación depende de sus necesidades específicas y de sus usuarios.

  2. Verifique que sus datos estén correctamente protegidos. Valide sus reglas de seguridad de Cloud Firestore o su configuración de IAM.