Utilizzare Cloud Firestore con Firebase Realtime Database

Puoi utilizzare sia Firebase Realtime Database che Cloud Firestore nella tua app e sfruttare i vantaggi di ciascuna soluzione di database in base alle 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 in Cloud Firestore

Se hai deciso di eseguire la migrazione di alcuni dati da Realtime Database a Cloud Firestore, considera il seguente flusso. Poiché ogni database ha esigenze e considerazioni strutturali specifiche, non esiste un percorso di migrazione automatico. 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. Sposta 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 è necessario spostare i dati storici da Realtime Database.

  3. Esegui il mirroring dei nuovi dati in Firestore in tempo reale. Utilizza Cloud Functions per scrivere nuovi dati nel nuovo database Cloud Firestore man mano che vengono aggiunti a Realtime Database.

  4. Imposta Cloud Firestore come database principale per i dati sottoposti a migrazione. Dopo aver eseguito la migrazione di alcuni dati, utilizza Cloud Firestore come database principale e riduci l'utilizzo di Realtime Database per i dati migrati. Valuta le versioni della tua app ancora collegate a Realtime Database per questi dati e come prevedi di continuare a supportarle.

Assicurati di tenere conto dei costi di fatturazione sia per Realtime Database sia per 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 e sottoraccolte. Se sposti alcuni dati da Realtime Database a Cloud Firestore, ti consigliamo di prendere in considerazione un'architettura diversa per i tuoi dati.

Differenze principali da considerare

Se sposti i dati dall'albero Realtime Database esistente ai documenti e alle raccolte Cloud Firestore, tieni presente le seguenti differenze principali tra i database che potrebbero influire sulla strutturazione dei dati in Cloud Firestore:

  • Le query poco profonde offrono una 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ù efficienti.
  • 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. Valuta la possibilità di ridurre il numero di operazioni sul database ed evitare scritture non necessarie. Scopri di più sulle differenze nella fatturazione tra 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 le letture superficiali e le funzionalità di query migliorate per strutture di dati più naturali rispetto a quelle che potresti aver utilizzato con Realtime Database.

Prendi in considerazione un'app di guide cittadine che aiuti gli utenti a trovare punti di riferimento importanti nelle città di tutto il mondo. Poiché Realtime Database non supporta le letture superficiali, potresti dover 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 esegue letture superficiali, pertanto la query dei documenti in una raccolta non estrae i dati dalle sottoraccolte. Di conseguenza, puoi memorizzare le informazioni sui punti di riferimento in una sottoraccolta:

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

I documenti hanno una dimensione massima di 1 MB, un altro motivo per archiviare i punti di riferimento come sottoraccolta, mantenendo ogni documento della città di piccole dimensioni, anziché gonfiare i documenti con elenchi nidificati.

Le funzionalità di query avanzate di Cloud Firestore riducono la necessità di duplicare i dati per i pattern di accesso comuni. Ad esempio, immagina una schermata nell'app di guide cittadine che mostra tutte le capitali ordinate in base alla popolazione. In Realtime Database, il modo più efficiente per farlo è mantenere un elenco distinto 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

Che tu utilizzi Cloud Firestore Security Rules per i client Android, Apple o web oppure Identity Access Management (IAM) per i server, assicurati di proteggere i tuoi dati sia in Cloud Firestore sia in Realtime Database. L'autenticazione utente è gestita da Authentication per entrambi i database, quindi non è necessario modificare l'implementazione di Authentication quando inizi a utilizzare Cloud Firestore.

Differenze principali da considerare

  • Gli SDK mobile e web utilizzano Cloud Firestore Security Rules, mentre gli SDK per il server 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. In caso contrario, i documenti e 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 abbia l'accesso appropriato per tutti i dati restituiti dalla query.

Spostare i dati storici in Cloud Firestore

Dopo aver mappato le strutture di dati e sicurezza ai modelli di dati e sicurezza di Cloud Firestore, puoi iniziare ad aggiungere i tuoi dati. Se prevedi di eseguire query sui dati storici dopo aver spostato l'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 vecchi, ti consigliamo di aggiungere prima i dati storici. Se aggiungi nuovi dati a entrambi i database contemporaneamente, come discusso nel passaggio successivo, assicurati di dare la precedenza ai nuovi dati aggiunti a Cloud Firestore da Cloud Functions.

Per eseguire la migrazione dei dati storici in Cloud Firestore:

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

    Valuta le seguenti strategie durante il trasferimento di alcuni dati in 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 avrà esigenze specifiche, gli Cloud Firestoreesperti del nostro canale Slack o di Stack Overflow possono esaminare il tuo script o offrirti consigli per la tua situazione specifica.
    • 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 velocizzare le migrazioni di grandi quantità di dati, utilizza le scritture collettive e invia fino a 500 operazioni in un'unica richiesta di rete.
    • Per rispettare i limiti di frequenza Cloud Firestore, limita 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 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 rispetto a qualsiasi scrittura effettuata durante la migrazione dei dati storici.

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

Imposta Cloud Firestore come database principale per i dati sottoposti a migrazione

Se hai deciso di utilizzare Cloud Firestore come database principale per alcuni dei tuoi dati, assicurati di tenere conto di eventuali funzioni di mirroring dei dati che hai configurato e convalida 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. Passa la funzione alla scrittura in un singolo database o rimuovila completamente e inizia a eliminare gradualmente la funzionalità di scrittura per i dati di cui è stata eseguita la migrazione nelle app ancora collegate a Realtime Database. Il modo in cui gestisci questa operazione per la tua app dipende dalle tue esigenze specifiche e dai tuoi utenti.

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