Usa Cloud Firestore con Firebase Realtime Database

Puedes usar tanto Firebase Realtime Database como Cloud Firestore en la app y aprovechar los beneficios de cada solución de base de datos para satisfacer tus necesidades. Por ejemplo, te recomendamos aprovechar la compatibilidad de Realtime Database para la presencia, como se describe en Crear presencia en Cloud Firestore.

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

Mover datos a Cloud Firestore

Si decidiste que migrarás algunos de tus datos de Realtime Database a Cloud Firestore, ten en cuenta el siguiente flujo. Debido a que cada base de datos tiene detalles estructurales y necesidades únicas, no hay una ruta de migración automatizada. En su lugar, puedes seguir esta progresión general:

  1. Asignar 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 necesitas cambiar la autenticación del usuario en tu app. Sin embargo, las reglas de seguridad y el modelo de datos son diferentes y es importante tener en cuenta esas discrepancias antes de comenzar a mover datos a Cloud Firestore.

  2. Mover datos históricos. Durante la configuración de la nueva estructura de datos en Cloud Firestore, puedes asignar y mover datos existentes de Realtime Database a tu nueva instancia de Cloud Firestore. Sin embargo, si usas ambas bases de datos en tu app, no es necesario que muevas datos históricos desde Realtime Database.

  3. Duplicar datos nuevos en Firestore en tiempo real. Usa Cloud Functions para escribir los datos nuevos en la base de datos nueva de Cloud Firestore en la medida que se agregan a Realtime Database.

  4. Convierte Cloud Firestore en tu base de datos principal para los datos migrados. Cuando migres algunos datos, usa Cloud Firestore como tu base de datos principal y reduce el uso de Realtime Database para los datos migrados. Ten en cuenta las versiones de tu app que aún están vinculadas con Realtime Database para esos datos y cómo piensas mantenerlas activas.

Asegúrate de considerar los costos de facturación de Realtime Database y Cloud Firestore.

Asigna tus datos

Los datos de Realtime Database están estructurados como un solo árbol, mientras que Cloud Firestore utiliza jerarquías de datos más explícitas a través de documentos, colecciones y subcolecciones. Si mueves parte de tus datos desde Realtime Database a Cloud Firestore, te recomendamos considerar una arquitectura diferente para tus datos.

Diferencias principales que debes considerar

Si mueves datos del árbol existente de Realtime Database a documentos y colecciones de Cloud Firestore, ten en cuenta las siguientes diferencias principales entre las bases de datos que pueden afectar la forma de estructurar los datos en Cloud Firestore:

  • Las consultas superficiales ofrecen más flexibilidad en las estructuras de datos jerárquicas.
  • Las consultas complejas ofrecen un nivel de detalle mayor y reducen la necesidad de duplicar datos.
  • Los cursores de consulta ofrecen una paginación más robusta.
  • Las transacciones ya no necesitan 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 podría ser más costoso que Realtime Database, sobre todo si realizas muchas operaciones pequeñas. Te recomendamos reducir la cantidad de operaciones de tu base de datos y evitar escrituras innecesarias. Obtén más información sobre las diferencias en la facturación entre Realtime Database y Cloud Firestore.

Prácticas recomendadas en acción

En el siguiente ejemplo encontrarás algunos de los elementos que debes considerar cuando cambies los datos de una base de datos a otra. Puedes aprovechar las lecturas superficiales y las capacidades de consulta mejoradas para estructuras de datos más naturales que las que puedes haber usado con Realtime Firebase.

Considera una app de guía de ciudad que ayuda a los usuarios a encontrar puntos de referencia en ciudades de todo el mundo. Dado que Realtime Database no tiene lecturas superficiales, es posible que hayas 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 la consulta de documentos en una colección no extrae datos de subcolecciones. Por consiguiente, puedes almacenar información de los puntos de referencia en una subcolección:

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

Otro motivo para almacenar puntos de referencia como una subcolección es que los documentos tienen un tamaño máximo de 1 MB. Por lo tanto, es mejor mantener un tamaño pequeño en cada documento de ciudad, en vez 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, considera una pantalla en la app de guía de ciudad que muestre todas las ciudades capitales ordenadas según su población. En Realtime Database, la manera más eficiente de hacer esto es mantener una lista de capitales distinta 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')

Obtén más información sobre el modelo de datos de Cloud Firestore y consulta nuestras Soluciones para obtener más ideas sobre cómo estructurar tu base de datos de Cloud Firestore.

Protege los datos

Asegúrate de proteger tus datos en Cloud Firestore y Realtime Database, ya sea que uses las reglas de seguridad de Cloud Firestore para clientes Android, Apple o web, o bien Identity Access Management (IAM) para servidores. La autenticación de usuarios se controla mediante Authentication en ambas bases de datos, por lo que no es necesario cambiar la implementación de Authentication cuando comienzas a usar Cloud Firestore.

Diferencias principales que debes considerar

  • Los SDK para dispositivos móviles y la Web usan las reglas de seguridad de Cloud Firestore, mientras que los SDK de servidor usan 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 hiciste en Realtime Database).
  • Cloud Firestore verifica las reglas antes de ejecutar una consulta, a fin de garantizar que el usuario tenga el acceso adecuado para todos los datos que muestra la consulta.

Mueve datos históricos a Cloud Firestore

Después de asignar los datos y las estructuras de seguridad a los modelos de datos y seguridad de Cloud Firestore, puedes comenzar a agregar tus datos. Si piensas consultar los datos históricos después de mover la app de Realtime Database a Cloud Firestore, agrega una exportación de tus datos antiguos a la base de datos nueva de Cloud Firestore. Si piensas usar Realtime Database y Cloud Firestore en la app, puedes omitir este paso.

Para evitar sobrescribir datos nuevos con datos antiguos, te recomendamos agregar los datos históricos primero. Si agregas nuevos datos a ambas bases de datos de manera simultánea, como se describe en el paso siguiente, asegúrate de dar prioridad a los datos nuevos que Cloud Functions agrega a Cloud Firestore.

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

  1. Exporta los datos desde Realtime Database o usa una copia de seguridad reciente.
    1. Ve a la sección Realtime Database de Firebase console.
    2. En la pestaña Datos, selecciona el nodo del nivel raíz de la base de datos y elige Exportar JSON en el menú.
  2. Crea la base de datos nueva en Cloud Firestore y agrega tus datos.

    Ten en cuenta las siguientes estrategias a medida que mueves algunos datos a Cloud Firestore:

    • Escribe una secuencia de comandos personalizada que transfiera los datos por ti. Dado que cada base de datos tiene necesidades específicas, no podemos ofrecer una plantilla para esta secuencia de comandos. Sin embargo, los expertos en Cloud Firestore pueden revisar tu secuencia de comandos o darte consejos para tu caso específico a través del canal de Slack o en Stack Overflow.
    • Usa los SDK del servidor (Node.js, Java, Python o Go) para escribir datos directamente en Cloud Firestore. Para ver instrucciones sobre la configuración de los SDK del servidor, consulta Comenzar.
    • Para agilizar las migraciones de grandes volúmenes de datos, usa las escrituras en lotes y envía hasta 500 operaciones en una única solicitud de red.
    • A fin de mantenerte dentro de los límites de tarifas de Cloud Firestore, limita las operaciones a 500 escrituras por segundo para cada colección.

Agrega datos nuevos a Cloud Firestore

Para mantener la paridad entre tus bases de datos, agrega datos nuevos a ambas bases de datos en tiempo real. Usa 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 procedentes de Cloud Functions por sobre cualquier escritura que hagas desde tu migración de datos históricos.

Crea una función para escribir datos nuevos o cambiarlos a Cloud Firestore cada vez que un cliente escriba datos en Realtime Database. Obtén más información sobre los activadores de Realtime Database para Cloud Functions.

Convierte Cloud Firestore en tu base de datos principal para los datos migrados

Si decides usar Cloud Firestore como tu base de datos principal para algunos de tus datos, asegúrate de incluir todas las funciones de duplicación de datos que configuraste y validar tus reglas de seguridad de Cloud Firestore.

  1. Si usaste Cloud Functions para conservar la paridad entre las bases de datos, asegúrate de no duplicar las operaciones de escritura en ambas bases de datos en un bucle. Cambia la función para escribir en una sola base de datos o quita la función completamente y comienza a quitar la función de escritura para los datos migrados en las apps vinculadas a Realtime Database de forma gradual. La forma en que manejas esto para tu app depende de tus necesidades específicas y de los usuarios.

  2. Verifica que los datos estén protegidos de manera adecuada. Valida las reglas de seguridad de Cloud Firestore o la configuración de IAM.