Firebase is back at Google I/O on May 10! Register now

Usa Cloud Firestore con Firebase Realtime Database

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Puoi utilizzare sia Firebase Realtime Database che Cloud Firestore nella tua app e sfruttare i vantaggi di ciascuna soluzione di database per soddisfare le tue esigenze. Ad esempio, potresti voler sfruttare il supporto per la presenza di Realtime Database, come descritto in Creare presenza in Cloud Firestore .

Ulteriori informazioni sulle differenze tra i database .

Spostamento dei dati su Cloud Firestore

Se hai deciso di voler eseguire la migrazione di alcuni dei tuoi dati da Realtime Database a Cloud Firestore, considera il seguente flusso. Poiché ogni database ha esigenze e considerazioni strutturali uniche, non esiste un percorso di migrazione automatizzato. Invece, puoi 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 sull'autenticazione Firebase, quindi non è necessario modificare l'autenticazione utente per la tua app. Tuttavia, le regole di sicurezza e il modello di dati sono diversi ed è importante tenere attentamente conto di tali divergenze prima di iniziare a spostare i dati in Cloud Firestore.

  2. Sposta i dati storici. Mentre configuri la tua nuova struttura di dati in Cloud Firestore, puoi mappare e spostare i dati esistenti da Realtime Database alla tua nuova istanza di Cloud Firestore. Tuttavia, se utilizzi entrambi i database nella tua app, non è necessario spostare i dati cronologici fuori da Realtime Database.

  3. Eseguire il mirroring di nuovi dati su Firestore in tempo reale. Usa Cloud Functions per scrivere nuovi dati nel tuo nuovo database Cloud Firestore man mano che viene aggiunto a Realtime Database.

  4. Imposta Cloud Firestore come database principale per i dati migrati. 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. Considera le versioni della tua app che sono ancora legate a Realtime Database per quei dati e come prevedi di continuare a supportarle.

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

Mappa i tuoi dati

I dati in Realtime Database sono strutturati come un singolo albero, mentre Cloud Firestore supporta gerarchie di dati più esplicite attraverso documenti, raccolte e sottoraccolte. Se sposti alcuni dei tuoi dati da Realtime Database a Cloud Firestore, potresti prendere in considerazione un'architettura diversa per i tuoi dati.

Principali differenze da considerare

Se sposti i dati dall'albero Realtime Database esistente ai documenti e alle raccolte di Cloud Firestore, tieni presente le seguenti principali differenze 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ù robusta.
  • Le transazioni non richiedono più una radice comune per tutti i tuoi dati e sono più efficienti.
  • I costi di fatturazione differiscono tra Realtime Database e Cloud Firestore. In molti casi, Cloud Firestore potrebbe essere più costoso di Realtime Database, in particolare se fai affidamento su molte piccole operazioni. Prendere in considerazione la possibilità di ridurre il numero di operazioni sul database ed evitare scritture non necessarie. Scopri di più sulle differenze di fatturazione tra Realtime Database e Cloud Firestore.

Le migliori pratiche in azione

L'esempio seguente riflette alcune delle considerazioni che potresti fare mentre sposti i tuoi dati tra i database. Puoi sfruttare letture poco profonde e capacità di interrogazione migliorate per strutture di dati più naturali rispetto a quelle che potresti aver utilizzato con Realtime Database.

Prendi in considerazione un'app di guida della città che aiuta gli utenti a trovare punti di riferimento importanti nelle città di tutto il mondo. Poiché Realtime Database non dispone di letture superficiali, potresti aver dovuto 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 poco profonde, quindi l'esecuzione di query per i 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, che è un altro motivo per archiviare i punti di riferimento come una sottoraccolta, mantenendo ogni documento di città piccolo, piuttosto che gonfiare i documenti con elenchi nidificati.

Le funzionalità di query avanzate di Cloud Firestore riducono la necessità di duplicare i dati per modelli di accesso comuni. Ad esempio, considera una schermata nell'app della guida della città che mostra tutte le capitali ordinate per popolazione. In Realtime Database, il modo più efficiente per farlo è mantenere un elenco separato di capitali che duplica i dati dall'elenco delle cities , come segue:

{
   cities: {
    // ...
   },

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

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

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

Leggi ulteriori informazioni sul modello di dati di Cloud Firestore e dai un'occhiata alle nostre soluzioni per ulteriori idee su come strutturare il tuo database Cloud Firestore.

Proteggi i tuoi dati

Che tu stia utilizzando le regole di sicurezza di Cloud Firestore per client Android, Apple o Web o IAM (Identity Access Management) per i server, assicurati di proteggere i tuoi dati in Cloud Firestore e in Realtime Database. L'autenticazione dell'utente è gestita da Authentication per entrambi i database, quindi non è necessario modificare l'implementazione dell'autenticazione quando inizi a utilizzare Cloud Firestore.

Principali differenze da considerare

  • Gli SDK per dispositivi mobili e Web utilizzano le regole di sicurezza di Cloud Firestore, mentre gli SDK per server utilizzano Identity Access Management (IAM) per proteggere i dati.
  • Le regole di sicurezza di Cloud Firestore non vengono applicate a cascata a meno che non utilizzi un carattere jolly. I documenti e le raccolte non ereditano altrimenti le regole.
  • Non è più necessario convalidare i dati separatamente (come si faceva 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 i dati e le strutture di sicurezza ai dati e ai modelli di sicurezza di Cloud Firestore, 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 che Cloud Firestore nella tua app, puoi saltare questo passaggio.

Per evitare di sovrascrivere i nuovi dati con quelli vecchi, potresti voler aggiungere prima i tuoi 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 a Cloud Firestore, procedi nel seguente modo:

  1. Esporta i tuoi dati da Realtime Database o utilizza un backup recente .
    1. Vai alla sezione Database in tempo reale nella console Firebase.
    2. Dalla scheda Dati , seleziona il nodo a livello di root del tuo 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 mentre sposti alcuni dei tuoi dati in Cloud Firestore:

    • Scrivi uno script personalizzato che trasferisca i tuoi dati per te. Anche se non possiamo offrire un modello per questo script, poiché ogni database avrà esigenze uniche, gli esperti di Cloud Firestore sul nostro canale Slack o su Stack Overflow possono rivedere il tuo script o offrire consigli per la tua situazione specifica.
    • Utilizza gli SDK del server (Node.js, Java, Python o Go) per scrivere i dati direttamente in Cloud Firestore. Per istruzioni sull'impostazione degli SDK del server, consulta Per iniziare .
    • Per accelerare le migrazioni di dati di grandi dimensioni, utilizza le scritture in batch e invia fino a 500 operazioni in una singola richiesta di rete.
    • Per rimanere entro i limiti di velocità di Cloud Firestore , limita le operazioni a 500 scritture/secondo per ogni raccolta.

Aggiungi nuovi dati a Cloud Firestore

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

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

Imposta Cloud Firestore come database principale per i dati migrati

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 che hai impostato e di convalidare le regole di sicurezza di Cloud Firestore.

  1. Se hai utilizzato Cloud Functions per mantenere la parità tra i tuoi database, assicurati di non duplicare le operazioni di scrittura su entrambi i database in un ciclo. Cambia la tua funzione per scrivere su un singolo database o rimuovi completamente la funzione e inizia a eliminare gradualmente la funzionalità di scrittura per i dati migrati nelle app ancora legate a Realtime Database. Il modo in cui lo gestisci per la tua app dipende dalle tue esigenze specifiche e dai tuoi utenti.

  2. Verifica che i tuoi dati siano adeguatamente protetti. Convalida le regole di sicurezza di Cloud Firestore o la configurazione IAM.