Puedes usar Firebase Realtime Database y Cloud Firestore en tu app y aprovechar los beneficios de cada solución de bases de datos para que se ajusten a tus necesidades. Por ejemplo, es posible que desees aprovechar la asistencia 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.
Transfiere datos a Cloud Firestore
Si decidiste que quieres migrar algunos de tus datos de Realtime Database a Cloud Firestore, considera 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:
Asigna 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.
Mover datos históricos. Cuando configures tu nueva estructura de datos en Cloud Firestore, podrás 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.
Duplicar datos nuevos en Firestore en tiempo real. Usa Cloud Functions para escribir datos nuevos en tu Cloud Firestore nuevo de la base de datos a medida que se agrega a Realtime Database.
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 para Realtime Database y Cloud Firestore.
Asigna tus datos
Los datos de Realtime Database se estructuran 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 transfieres algunos de tus datos de Realtime Database a Cloud Firestore, recomendamos que consideres 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 caro que Realtime Database, sobre todo si dependes de 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 Database.
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 revisa nuestras Soluciones para obtener más ideas sobre cómo estructurar tu base de datos de Cloud Firestore.
Protege los datos
Ya sea que uses Cloud Firestore Security Rules para Clientes de Android, Apple o Web, o Identity and Access Management (IAM) para los servidores, asegúrate también de proteger tus datos en Cloud Firestore como Realtime Database. 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 Cloud Firestore Security Rules, mientras que los SDK de servidor usan Identity Access Management (IAM) para proteger los datos.
- Cloud Firestore Security Rules 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.
Transferir 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 planeas consultar datos históricos después de trasladar tu app de Realtime Database a Cloud Firestore, agrega una exportación de tus datos antiguos a la nueva base de datos de Cloud Firestore. Si planeas usar Realtime Database y Cloud Firestore en tu app, puedes omitir este paso.
Para evitar sobrescribir datos nuevos con datos antiguos, te recomendamos agregar los datos históricos primero. Si agregas datos nuevos 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:
- Exporta tus datos de Realtime Database o usa una copia de seguridad reciente.
- Ve a la sección Realtime Database en la consola de Firebase.
- En la pestaña Datos, selecciona el nodo del nivel raíz de la base de datos y elige Exportar JSON en el menú.
Crea tu nueva base de datos en Cloud Firestore y agrega tus datos.
Considera las siguientes estrategias a medida que transfieres algunos de tus 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 en nuestro canal de Slack o en Stack Overflow pueden revisar tu secuencia de comandos o darte consejos para tu caso específico.
- 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.
- Para mantenerte dentro de los límites de tarifas de Cloud Firestore, limita las operaciones a 500 operaciones de escritura 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 escribe 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 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 tu Cloud Firestore Security Rules.
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.
Verifica que los datos estén protegidos de manera adecuada. Valida tu configuración de Cloud Firestore Security Rules o IAM.