Utiliser Cloud Firestore avec Firebase Realtime Database

Vous pouvez utiliser à la fois Firebase Realtime Database et Cloud Firestore dans votre application, et exploiter les avantages de chaque solution de base de données pour répondre à vos besoins. Par exemple, vous pouvez exploiter la prise en charge de la présence par Realtime Database, comme indiqué dans la section Créer une présence dans Cloud Firestore.

En savoir plus sur les différences entre les bases de données

Déplacement des données vers Cloud Firestore

Si vous avez décidé de migrer certaines de vos données de Realtime Database vers Cloud Firestore, suivez la procédure ci-dessous. Étant donné que chaque base de données a des besoins et des considérations structurelles uniques, il n'existe pas de chemin de migration automatisé. Vous pouvez plutôt suivre cette progression générale:

  1. Mappez la structure des données et les règles de sécurité de Realtime Database à Cloud Firestore. Realtime Database et Cloud Firestore reposent tous deux sur Firebase Authentication. Vous n'avez donc pas besoin de modifier l'authentification des utilisateurs pour votre application. Toutefois, les règles de sécurité et le modèle de données sont différents. Il est donc important de tenir compte de ces divergences avant de commencer à transférer des données vers Cloud Firestore.

  2. Déplacer les données historiques Lorsque vous configurez votre nouvelle structure de données dans Cloud Firestore, vous pouvez mapper et déplacer les données existantes de Realtime Database vers votre nouvelle instance Cloud Firestore. Toutefois, si vous utilisez les deux bases de données dans votre application, vous n'avez pas besoin de déplacer les données historiques hors de Realtime Database.

  3. Reflétez les nouvelles données dans Firestore en temps réel. Utilisez Cloud Functions pour écrire de nouvelles données dans votre nouvelle base de données Cloud Firestore lorsqu'elle est ajoutée à Realtime Database.

  4. Définir Cloud Firestore comme base de données principale pour les données migrées Une fois que vous avez migré certaines de vos données, utilisez Cloud Firestore comme base de données principale et réduisez l'utilisation de Realtime Database pour les données migrées. Réfléchissez aux versions de votre application qui sont toujours associées à Realtime Database pour ces données et à la manière dont vous prévoyez de continuer à les prendre en charge.

Veillez à tenir compte des coûts de facturation pour Realtime Database et Cloud Firestore.

Mapper vos données

Les données de Realtime Database sont structurées en une seule arborescence, tandis que Cloud Firestore prend en charge des hiérarchies de données plus explicites via des documents, des collections et des sous-collections. Si vous déplacez certaines de vos données de Realtime Database vers Cloud Firestore, vous pouvez envisager une architecture différente pour vos données.

Principales différences à prendre en compte

Si vous déplacez des données de votre arborescence Realtime Database existante vers des documents et des collections Cloud Firestore, tenez compte des principales différences entre les bases de données qui peuvent avoir un impact sur la façon dont vous structurez les données dans Cloud Firestore:

  • Les requêtes peu profondes offrent plus de flexibilité dans les structures de données hiérarchiques.
  • Les requêtes complexes offrent plus de précision et réduisent le besoin de données en double.
  • Les curseurs de requête offrent une pagination plus robuste.
  • Les transactions ne nécessitent plus de racine commune pour toutes vos données et sont plus efficaces.
  • Les coûts de facturation diffèrent entre Realtime Database et Cloud Firestore. Dans de nombreux cas, Cloud Firestore peut être plus coûteux que Realtime Database, en particulier si vous vous appuyez sur de nombreuses petites opérations. Envisagez de réduire le nombre d'opérations sur votre base de données et d'éviter les écritures inutiles. En savoir plus sur les différences de facturation entre Realtime Database et Cloud Firestore

Bonnes pratiques en action

L'exemple suivant reflète certaines des considérations que vous pouvez prendre en compte lorsque vous transférez vos données entre des bases de données. Vous pouvez exploiter les lectures superficielles et les fonctionnalités de requête améliorées pour des structures de données plus naturelles que celles que vous avez peut-être utilisées avec Realtime Database.

Prenons l'exemple d'une application de guide touristique qui aide les utilisateurs à trouver des points de repère remarquables dans les villes du monde entier. Étant donné que Realtime Database ne dispose pas de lectures superficielles, vous avez peut-être dû structurer les données en deux nœuds de premier niveau, comme suit:

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

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

Cloud Firestore effectue des lectures superficielles. Par conséquent, l'interrogation de documents dans une collection n'extrait pas de données des sous-collections. Par conséquent, vous pouvez stocker des informations sur les repères dans une sous-collection:

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

La taille maximale des documents est de 1 Mo, ce qui est une autre raison de stocker les repères en tant que sous-collection, en réduisant la taille de chaque document de ville plutôt que d'alourdir les documents avec des listes imbriquées.

Les fonctionnalités avancées d'interrogation de Cloud Firestore réduisent le besoin de dupliquer les données pour les modèles d'accès courants. Prenons l'exemple d'un écran de l'application de guide touristique qui affiche toutes les capitales triées par population. Dans Realtime Database, le moyen le plus efficace d'y parvenir consiste à gérer une liste distincte des capitales qui duplique les données de la liste cities, comme suit:

{
   cities: {
    // ...
   },

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

Dans Cloud Firestore, vous pouvez exprimer une liste de capitales par ordre de population en une seule requête:

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

En savoir plus sur le modèle de données Cloud Firestore et consulter nos solutions pour obtenir des idées sur la structuration de votre base de données Cloud Firestore

Sécurisez vos données

Que vous utilisiez Cloud Firestore Security Rules pour les clients Android, Apple ou Web, ou Identity Access Management (IAM) pour les serveurs, assurez-vous de sécuriser vos données dans Cloud Firestore et Realtime Database. L'authentification des utilisateurs est gérée par Authentication pour les deux bases de données. Vous n'avez donc pas besoin de modifier votre implémentation d'Authentication lorsque vous commencez à utiliser Cloud Firestore.

Principales différences à prendre en compte

  • Les SDK pour mobile et Web utilisent Cloud Firestore Security Rules, tandis que les SDK pour serveur utilisent la gestion des accès et de l'identité (IAM) pour sécuriser les données.
  • Les Cloud Firestore Security Rules ne sont pas en cascade, sauf si vous utilisez un caractère générique. Les documents et les collections n'héritent pas des règles.
  • Vous n'avez plus besoin de valider les données séparément (comme vous le faisiez dans Realtime Database).
  • Cloud Firestore vérifie les règles avant d'exécuter une requête pour s'assurer que l'utilisateur dispose des droits d'accès appropriés pour toutes les données renvoyées par la requête.

Déplacer les données historiques vers Cloud Firestore

Une fois que vous avez mappé vos structures de données et de sécurité aux modèles de données et de sécurité de Cloud Firestore, vous pouvez commencer à ajouter vos données. Si vous prévoyez d'interroger les données historiques après avoir déplacé votre application de Realtime Database vers Cloud Firestore, ajoutez une exportation de vos anciennes données vers votre nouvelle base de données Cloud Firestore. Si vous prévoyez d'utiliser à la fois Realtime Database et Cloud Firestore dans votre application, vous pouvez ignorer cette étape.

Pour éviter d'écraser les nouvelles données avec les anciennes, vous pouvez d'abord ajouter vos données historiques. Si vous ajoutez de nouvelles données aux deux bases de données simultanément, comme indiqué à l'étape suivante, assurez-vous de donner la priorité aux nouvelles données ajoutées à Cloud Firestore par Cloud Functions.

Pour migrer les données historiques vers Cloud Firestore, procédez comme suit:

  1. Exportez vos données depuis Realtime Database ou utilisez une sauvegarde récente.
    1. Accédez à la section Realtime Database de la console Firebase.
    2. Dans l'onglet Données, sélectionnez le nœud racine de votre base de données, puis Exporter au format JSON dans le menu.
  2. Créez votre base de données dans Cloud Firestore et ajoutez vos données.

    Tenez compte des stratégies suivantes lorsque vous transférez certaines de vos données vers Cloud Firestore:

    • Écrivez un script personnalisé qui transfère vos données à votre place. Nous ne pouvons pas vous proposer de modèle pour ce script, car chaque base de données a des besoins uniques. Toutefois, les experts Cloud Firestore sur notre canal Slack ou sur Stack Overflow peuvent examiner votre script ou vous conseiller en fonction de votre situation spécifique.
    • Utilisez les SDK serveur (Node.js, Java, Python ou Go) pour écrire des données directement dans Cloud Firestore. Pour obtenir des instructions sur la configuration des SDK de serveur, consultez la section Premiers pas.
    • Pour accélérer les migrations de données volumineuses, utilisez des écritures par lot et envoyez jusqu'à 500 opérations dans une seule requête réseau.
    • Pour ne pas dépasser les limites de débit Cloud Firestore, limitez les opérations à 500 écritures par seconde pour chaque collection.

Ajouter des données à Cloud Firestore

Pour maintenir la parité entre vos bases de données, ajoutez de nouvelles données aux deux bases de données en temps réel. Utilisez Cloud Functions pour déclencher une écriture dans Cloud Firestore chaque fois qu'un client écrit dans Realtime Database. Assurez-vous que Cloud Firestore donne la priorité aux nouvelles données provenant de Cloud Functions par rapport à toutes les écritures que vous effectuez à partir de la migration de vos données historiques.

Créez une fonction pour écrire de nouvelles données ou des données modifiées dans Cloud Firestore chaque fois qu'un client écrit des données dans Realtime Database. En savoir plus sur les déclencheurs Realtime Database pour Cloud Functions

Définir Cloud Firestore comme base de données principale pour les données migrées

Si vous avez décidé d'utiliser Cloud Firestore comme base de données principale pour certaines de vos données, veillez à tenir compte de toutes les fonctions de mise en miroir des données que vous avez configurées et à valider votre Cloud Firestore Security Rules.

  1. Si vous avez utilisé Cloud Functions pour maintenir la parité entre vos bases de données, assurez-vous de ne pas dupliquer les opérations d'écriture dans les deux bases de données dans une boucle. Configurez votre fonction pour écrire dans une seule base de données, ou supprimez-la complètement et commencez à abandonner la fonctionnalité d'écriture pour les données migrées dans les applications toujours associées à Realtime Database. La façon dont vous gérez cela pour votre application dépend de vos besoins spécifiques et de vos utilisateurs.

  2. Vérifiez que vos données sont correctement sécurisées. Validez votre configuration Cloud Firestore Security Rules ou IAM.