Utilizzare Cloud Firestore con Firebase Realtime Database

Nella tua app puoi utilizzare sia Firebase Realtime Database sia Cloud Firestore e sfrutta i vantaggi di ogni soluzione di database per soddisfare le tue esigenze. Ad esempio, potresti sfruttare il supporto della presenza di Realtime Database, come descritto in Creare la presenza in Cloud Firestore.

Scopri di più sulle differenze tra i database.

Spostamento dei dati su Cloud Firestore in corso...

Se hai deciso di eseguire la migrazione di alcuni dati da Realtime Database a Cloud Firestore, considera la procedura seguente. Poiché ogni database ha esigenze particolari e considerazioni strutturali, percorso di migrazione automatizzato. Puoi invece seguire questa progressione generale:

  1. Mappa la struttura dei dati e le regole di sicurezza da Realtime Database a Cloud Firestore, Sia Realtime Database che Cloud Firestore si basano su Firebase Authentication, quindi non devi modificare l'autenticazione utente per la tua app. Tuttavia, le regole di sicurezza e il modello di dati sono diversi ed è importante tenere conto attentamente di queste differenze prima di iniziare a spostare i dati in Cloud Firestore.

  2. Spostare i dati storici. Durante la configurazione della nuova struttura di dati in Cloud Firestore, puoi mappare e spostare i dati esistenti da Realtime Database alla nuova istanza Cloud Firestore. Tuttavia, se utilizzi entrambi i database nella tua app, non devi spostare i dati storici da Realtime Database.

  3. Esegui il mirroring dei nuovi dati a Firestore in tempo reale. Usa Cloud Functions per scrivere nuovi dati nel tuo nuovo Cloud Firestore ogni volta che viene aggiunto a Realtime Database.

  4. Imposta Cloud Firestore come database principale per i dati di cui è stata eseguita la migrazione. Dopo aver eseguito la migrazione di alcuni dati, utilizza Cloud Firestore come database principale e di ridurre l'utilizzo di Realtime Database per i e i dati di Google Cloud. Prendi in considerazione le versioni della tua app che sono ancora collegate a Realtime Database per questi dati e per sapere come prevedi di continuare a supportarli.

Assicurati di tenere conto dei costi di fatturazione per Realtime Database e Cloud Firestore.

Mappa i dati

I dati in Realtime Database sono strutturati come un singolo albero, mentre Cloud Firestore supporta gerarchie di dati più esplicite tramite documenti, raccolte sottoraccolte. Se sposti alcuni dati da Realtime Database a Cloud Firestore, ti consigliamo di valutare un'architettura diversa per i tuoi dati.

Principali differenze da considerare

Se sposti i dati dalla struttura Realtime Database esistente a Cloud Firestore documenti e raccolte, tieni presente le seguenti differenze principali tra i database che potrebbero influire sulla struttura dei dati in Cloud Firestore:

  • Le query superficiali offrono maggiore flessibilità nelle strutture di dati gerarchiche.
  • Le query complesse offrono una maggiore granularità e riducono la necessità di dati duplicati.
  • I cursori di query offrono un'impaginazione più affidabile.
  • Le transazioni non richiedono più una radice comune per tutti i dati e sono più in modo efficace.
  • I costi di fatturazione variano tra Realtime Database e Cloud Firestore. In molti casi, Cloud Firestore potrebbe essere più costoso di Realtime Database, soprattutto se utilizzi molte piccole operazioni. Prendi in considerazione riducendo il numero di operazioni sul database ed evitando scritture non necessarie. Scopri di più sulle differenze in fatturazione tra il giorno Realtime Database e Cloud Firestore.

Best practice in azione

L'esempio seguente riflette alcune delle considerazioni che potresti fare durante il trasferimento dei dati tra i database. Puoi sfruttare letture superficiali e di query per strutture di dati più naturali rispetto a quelle che avresti potuto con Realtime Database.

Prendi in considerazione un'app per guide cittadine che aiuti gli utenti a trovare punti di riferimento importanti nelle città in tutto il mondo. Dato che Realtime Database non ha letture superficiali, potresti aver dovuto a strutturare i dati in due nodi di primo livello, come segue:

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

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

Cloud Firestore ha letture superficiali, quindi l'esecuzione di query sui documenti in una raccolta non recupera i dati dalle sottoraccolte. Di conseguenza, puoi memorizzare il punto di riferimento informazioni in una sottoraccolta:

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

I documenti hanno una dimensione massima di 1 MB, che è un altro motivo per l'archiviazione. i punti di riferimento come una sottoraccolta, riducendo ogni documento della città documenti gonfi con elenchi nidificati.

Le funzionalità di query avanzate di Cloud Firestore riducono la necessità di dati duplicati per pattern di accesso comuni. Ad esempio, considera una schermata l'app Guida urbana che mostra tutte le capitali ordinate per popolazione. In Realtime Database, il modo più efficiente per farlo è mantenere una elenco delle capitali che duplica i dati dell'elenco cities, come segue:

{
   cities: {
    // ...
   },

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

In Cloud Firestore, puoi esprimere un elenco di capitali in ordine di popolazione come una singola query:

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

Scopri di più sul modello di dati Cloud Firestore e consulta le nostre soluzioni per altre idee su come strutturare il tuo database Cloud Firestore.

Proteggi i tuoi dati

Se utilizzi Cloud Firestore Security Rules per Client Android, Apple o web oppure Identity Access Management (IAM) per i server, assicurati di proteggere anche i dati in Cloud Firestore come Realtime Database. L'autenticazione utente è gestita da Authentication per entrambi i database, in modo che non sia necessario modificare l'implementazione di Authentication quando inizi utilizzando Cloud Firestore.

Differenze principali da considerare

  • Gli SDK per web e dispositivi mobili usano Cloud Firestore Security Rules, mentre il server Gli SDK utilizzano Identity Access Management (IAM) per proteggere i dati.
  • Cloud Firestore Security Rules non si applicano in modo ricorsivo, a meno che non utilizzi un carattere jolly. Documenti e mentre le raccolte non ereditano le regole.
  • Non è più necessario convalidare i dati separatamente (come facevi in Realtime Database).
  • Cloud Firestore controlla le regole prima di eseguire una query per assicurarsi che l'utente disponga dell'accesso appropriato per tutti i dati restituiti dalla query.

Sposta i dati storici in Cloud Firestore

Dopo aver mappato le strutture di dati e sicurezza al database di Cloud Firestore di dati e sicurezza, puoi iniziare ad aggiungere i tuoi dati. Se prevedi di eseguire query sui dati storici dopo aver spostato la tua app da Realtime Database a Cloud Firestore, aggiungi un'esportazione dei vecchi dati al nuovo Database Cloud Firestore. Se prevedi di utilizzare sia Realtime Database sia Cloud Firestore nella tua app, puoi saltare questo passaggio.

Per evitare di sovrascrivere i nuovi dati con quelli precedenti, ti consigliamo di aggiungere i dati storici. Se aggiungi nuovi dati a entrambi i database contemporaneamente, di cui abbiamo parlato nel passaggio successivo, assicurati di dare la precedenza ai nuovi dati aggiunti Cloud Firestore per Cloud Functions.

Per eseguire la migrazione dei dati storici a Cloud Firestore:

  1. Esporta i dati da Realtime Database oppure utilizza un backup recente.
    1. Vai alla sezione Realtime Database nella console Firebase.
    2. Nella scheda Dati, seleziona il nodo di livello principale del database e seleziona Esporta JSON dal menu.
  2. Crea il tuo nuovo database in Cloud Firestore e aggiungi i tuoi dati.

    Prendi in considerazione le seguenti strategie quando sposti alcuni dati su Cloud Firestore:

    • Scrivi uno script personalizzato che esegua il porting dei dati per te. Anche se non possiamo offrire un modello per questo script, perché ogni database ha esigenze specifiche, Esperti di Cloud Firestore sul nostro canale Slack o su Stack Overflow puoi rivedere il tuo copione o offrirti consigli specifici per la tua situazione.
    • Utilizza gli SDK server (Node.js, Java, Python o Go) per scrivere i dati direttamente in Cloud Firestore. Per istruzioni sulla configurazione degli SDK di server, consulta Inizia.
    • Per accelerare le migrazioni di dati di grandi dimensioni, utilizza scritture in batch e inviare fino a 500 operazioni in una singola richiesta di rete.
    • Per rimanere al di sotto di Cloud Firestore limiti di frequenza: limitare le operazioni a 500 scritture al secondo per ogni raccolta.

Aggiungi nuovi dati a Cloud Firestore

Per mantenere la parità tra i database, aggiungi nuovi dati a entrambi i database in in tempo reale. Utilizza Cloud Functions per attivare una scrittura in Cloud Firestore ogni volta che un client scrive in Realtime Database. Assicurati che Cloud Firestore dà la precedenza ai nuovi dati provenienti da Cloud Functions su qualsiasi scrittura che stai effettuando dalla migrazione dei dati storici.

Crea una funzione per scrivere dati nuovi o modificarli in Cloud Firestore ogni volta che un cliente scrive dati in Realtime Database. Scopri di più su Realtime Database attivatori per Cloud Functions.

Imposta Cloud Firestore come database principale per i dati di cui è stata eseguita la migrazione

Se hai deciso di utilizzare Cloud Firestore come database principale per alcuni dei tuoi dati, assicurati di tenere conto di tutte le funzioni di mirroring dei dati configura e convalida il tuo Cloud Firestore Security Rules.

  1. Se hai utilizzato Cloud Functions per mantenere la parità tra i database, assicurati di non duplicare le operazioni di scrittura in entrambi i database in un loop. Cambia la funzione per scrivere su un singolo database o rimuovi completamente e iniziare a eliminare gradualmente la funzionalità di scrittura per di dati migrati in app ancora collegate a Realtime Database. Come gestisci questo dipende dalle tue esigenze specifiche e dagli utenti.

  2. Verifica che i dati siano protetti correttamente. Convalida il tuo Cloud Firestore Security Rules o configurazione IAM.