获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

Use Cloud Firestore con Firebase Realtime Database

Puede usar Firebase Realtime Database y Cloud Firestore en su aplicación y aprovechar los beneficios de cada solución de base de datos para satisfacer sus necesidades. Por ejemplo, es posible que desee aprovechar la compatibilidad de Realtime Database con la presencia, 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, puede 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 se basan en Firebase Authentication, por lo que no necesita 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 de Realtime Database a su nueva instancia de Cloud Firestore. Sin embargo, si usa ambas bases de datos en su aplicación, no necesita mover los datos históricos fuera de Realtime Database.

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

  4. Convierta a Cloud Firestore en su base de datos principal para los datos migrados. Una vez que haya migrado algunos de sus datos, use Cloud Firestore como su base de datos principal y reduzca 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 brindándoles soporte.

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

Mapea tus datos

Los datos en Realtime Database están estructurados como un solo á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 tener en cuenta

Si mueve datos de su árbol de base de datos en tiempo real existente a documentos y colecciones de Cloud Firestore, tenga en cuenta las siguientes diferencias principales entre las bases de datos que pueden afectar la forma en que estructura los datos en Cloud Firestore:

  • Las consultas superficiales ofrecen más flexibilidad en las 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 robusta.
  • 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 las lecturas superficiales y las capacidades de consulta mejoradas para obtener estructuras de datos más naturales que las que puede haber usado con Realtime Database.

Considere una aplicación de guía de ciudades 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 de 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, que es otra razón para almacenar puntos de referencia como una subcolección, manteniendo cada documento de la 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 ciudades capitales ordenadas por población. En Realtime Database, la forma más eficiente de hacer esto es mantener una lista separada de ciudades capitales que duplique los datos de la lista de cities , de la siguiente manera:

{
   cities: {
    // ...
   },

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

En Cloud Firestore, puede 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.

Proteja sus datos

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

Principales diferencias a tener en cuenta

  • Los SDK móviles y web usan las reglas de seguridad de Cloud Firestore, mientras que los SDK del servidor usan la administración de acceso a la identidad (IAM) para proteger los datos.
  • Las reglas de seguridad de Cloud Firestore no se aplican en cascada a menos que use un comodín. De lo contrario, los documentos y las colecciones no heredan reglas.
  • Ya no necesita 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 para todos los datos que devuelve la consulta.

Mover datos históricos a Cloud Firestore

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

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

Para migrar datos históricos a Cloud Firestore, siga 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 la consola de Firebase.
    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. Cree su nueva base de datos en Cloud Firestore y agregue sus datos .

    Considere las siguientes estrategias a medida que mueve 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 de Slack o en Stack Overflow pueden revisar su script u ofrecer consejos para su situación específica.
    • Use 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 Primeros pasos .
    • Para acelerar las grandes migraciones de datos, use escrituras por lotes y envíe hasta 500 operaciones en una sola solicitud de red.
    • Para mantenerse dentro de los límites de frecuencia de Cloud Firestore , limite 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. Use Cloud Functions para activar una escritura en Cloud Firestore cada vez que un cliente escribe en Realtime Database. Asegúrate de que Cloud Firestore dé prioridad a los nuevos datos que provienen 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 escriba datos en Realtime Database. Obtenga más información sobre los disparadores de Realtime Database para Cloud Functions.

Convierta a Cloud Firestore en su base de datos principal para los datos migrados

Si ha decidido usar 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 las operaciones de escritura en ambas bases de datos en un bucle. Cambie su función para escribir en una sola base de datos, o elimine la función por completo y comience a eliminar gradualmente la funcionalidad de escritura para los datos migrados en las aplicaciones que aún están vinculadas a Realtime Database. La forma en que maneja esto para su aplicación depende de sus necesidades específicas y sus usuarios.

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