Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Usar o Cloud Firestore com o Firebase Realtime Database

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

Você pode usar o Firebase Realtime Database e o Cloud Firestore em seu aplicativo e aproveitar os benefícios de cada solução de banco de dados para atender às suas necessidades. Por exemplo, talvez você queira aproveitar o suporte do Realtime Database para presença, conforme descrito em Criar presença no Cloud Firestore .

Saiba mais sobre as diferenças entre os bancos de dados .

Como mover dados para o Cloud Firestore

Se você decidiu migrar alguns de seus dados do Realtime Database para o Cloud Firestore, considere o fluxo a seguir. Como cada banco de dados tem necessidades e considerações estruturais exclusivas, não há um caminho de migração automatizado. Em vez disso, você pode seguir esta progressão geral:

  1. Mapeie a estrutura de dados e as regras de segurança do Realtime Database para o Cloud Firestore. Tanto o Realtime Database quanto o Cloud Firestore contam com o Firebase Authentication, portanto, você não precisa alterar a autenticação do usuário para seu aplicativo. No entanto, as regras de segurança e o modelo de dados são diferentes e é importante considerar cuidadosamente essas divergências antes de começar a mover dados para o Cloud Firestore.

  2. Mova dados históricos. Ao configurar sua nova estrutura de dados no Cloud Firestore, você pode mapear e mover dados existentes do Realtime Database para sua nova instância do Cloud Firestore. No entanto, se você estiver usando os dois bancos de dados em seu aplicativo, não será necessário mover os dados históricos do Realtime Database.

  3. Espelhe novos dados no Firestore em tempo real. Use o Cloud Functions para gravar novos dados em seu novo banco de dados do Cloud Firestore à medida que ele for adicionado ao Realtime Database.

  4. Torne o Cloud Firestore seu banco de dados principal para os dados migrados. Depois de migrar alguns dos seus dados, use o Cloud Firestore como seu banco de dados principal e reduza o uso do Realtime Database para os dados migrados. Considere as versões do seu aplicativo que ainda estão vinculadas ao Realtime Database para esses dados e como você planeja continuar a oferecer suporte a elas.

Certifique-se de contabilizar os custos de faturamento do Realtime Database e do Cloud Firestore .

Mapeie seus dados

Os dados no Realtime Database são estruturados como uma única árvore, enquanto o Cloud Firestore oferece suporte a hierarquias de dados mais explícitas por meio de documentos, coleções e subcoleções. Se você mover alguns dados do Realtime Database para o Cloud Firestore, convém considerar uma arquitetura diferente para seus dados.

Principais diferenças a considerar

Se você mover dados da árvore existente do Realtime Database para documentos e coleções do Cloud Firestore, lembre-se das seguintes diferenças principais entre os bancos de dados que podem afetar a forma como você estrutura os dados no Cloud Firestore:

  • As consultas superficiais oferecem mais flexibilidade em estruturas de dados hierárquicas.
  • As consultas complexas oferecem mais granularidade e reduzem a necessidade de dados duplicados.
  • Os cursores de consulta oferecem uma paginação mais robusta.
  • As transações não exigem mais uma raiz comum para todos os seus dados e são mais eficientes.
  • Os custos de faturamento diferem entre o Realtime Database e o Cloud Firestore. Em muitos casos, o Cloud Firestore pode ser mais caro que o Realtime Database, principalmente se você contar com muitas pequenas operações. Considere reduzir o número de operações em seu banco de dados e evitar gravações desnecessárias. Saiba mais sobre as diferenças de faturamento entre o Realtime Database e o Cloud Firestore.

Boas práticas em ação

O exemplo a seguir reflete algumas das considerações que você pode fazer ao deslocar seus dados entre bancos de dados. Você pode aproveitar leituras superficiais e recursos de consulta aprimorados para estruturas de dados mais naturais do que você pode ter usado com o Realtime Database.

Considere um aplicativo de guia de cidades que ajude os usuários a encontrar pontos de referência notáveis ​​em cidades ao redor do mundo. Como o Realtime Database não possui leituras superficiais, talvez você precise estruturar os dados em dois nós de nível superior, da seguinte maneira:

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

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

O Cloud Firestore tem leituras superficiais, portanto, consultar documentos em uma coleção não extrai dados de subcoleções. Consequentemente, você pode armazenar informações de pontos de referência em uma subcoleção:

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

Os documentos têm um tamanho máximo de 1 MB, que é outro motivo para armazenar pontos de referência como uma subcoleção, mantendo cada documento de cidade pequeno, em vez de sobrecarregar os documentos com listas aninhadas.

Os recursos avançados de consulta do Cloud Firestore reduzem a necessidade de duplicar dados para padrões de acesso comuns. Por exemplo, considere uma tela no aplicativo de guia da cidade que mostra todas as capitais ordenadas por população. No Realtime Database, a maneira mais eficiente de fazer isso é manter uma lista separada de capitais que duplique os dados da lista de cities , da seguinte forma:

{
   cities: {
    // ...
   },

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

No Cloud Firestore, você pode expressar uma lista de capitais em ordem de população como uma única consulta:

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

Leia mais sobre o modelo de dados do Cloud Firestore e dê uma olhada em nossas soluções para mais ideias sobre como estruturar seu banco de dados do Cloud Firestore.

Proteja seus dados

Se você estiver usando as regras de segurança do Cloud Firestore para clientes Android, Apple ou Web ou o Identity Access Management (IAM) para servidores, certifique-se de proteger seus dados no Cloud Firestore e no Realtime Database. A autenticação do usuário é tratada pelo Authentication para ambos os bancos de dados, portanto, você não precisa alterar sua implementação de Authentication ao começar a usar o Cloud Firestore.

Principais diferenças a considerar

  • Os SDKs para dispositivos móveis e da Web usam as regras de segurança do Cloud Firestore, enquanto os SDKs de servidor usam o Identity Access Management (IAM) para proteger os dados.
  • As regras de segurança do Cloud Firestore não entram em cascata, a menos que você use um curinga. Documentos e coleções não herdam regras.
  • Você não precisa mais validar os dados separadamente (como fazia no Realtime Database ).
  • O Cloud Firestore verifica as regras antes de executar uma consulta para garantir que o usuário tenha o acesso adequado a todos os dados retornados pela consulta.

Mover dados históricos para o Cloud Firestore

Depois de mapear seus dados e estruturas de segurança para os modelos de dados e segurança do Cloud Firestore, você pode começar a adicionar seus dados. Se você planeja consultar dados históricos depois de mover seu aplicativo do Realtime Database para o Cloud Firestore, adicione uma exportação de seus dados antigos para o novo banco de dados do Cloud Firestore. Se você planeja usar o Realtime Database e o Cloud Firestore em seu aplicativo, pule esta etapa.

Para evitar a substituição de novos dados por dados antigos, convém adicionar seus dados históricos primeiro. Se você adicionar novos dados aos dois bancos de dados simultaneamente, conforme discutido na próxima etapa, certifique-se de dar prioridade aos novos dados adicionados ao Cloud Firestore pelo Cloud Functions.

Para migrar dados históricos para o Cloud Firestore, siga estas etapas:

  1. Exporte seus dados do Realtime Database ou use um backup recente .
    1. Acesse a seção Realtime Database no console do Firebase.
    2. Na guia Dados , selecione o nó de nível raiz do banco de dados e selecione Exportar JSON no menu.
  2. Crie seu novo banco de dados no Cloud Firestore e adicione seus dados .

    Considere as seguintes estratégias ao mover alguns dos seus dados para o Cloud Firestore:

    • Escreva um script personalizado que transfere seus dados para você. Embora não possamos oferecer um modelo para esse script, porque cada banco de dados terá necessidades exclusivas, os especialistas do Cloud Firestore em nosso canal Slack ou no Stack Overflow podem revisar seu script ou oferecer conselhos para sua situação específica.
    • Use os SDKs do servidor (Node.js, Java, Python ou Go) para gravar dados diretamente no Cloud Firestore. Para obter instruções sobre como configurar os SDKs do servidor, consulte Introdução .
    • Para agilizar grandes migrações de dados, use gravações em lote e envie até 500 operações em uma única solicitação de rede.
    • Para ficar dentro dos limites de taxa do Cloud Firestore , limite as operações a 500 gravações/segundo para cada coleção.

Adicionar novos dados ao Cloud Firestore

Para manter a paridade entre seus bancos de dados, adicione novos dados a ambos os bancos de dados em tempo real. Use o Cloud Functions para acionar uma gravação no Cloud Firestore sempre que um cliente gravar no Realtime Database. Certifique-se de que o Cloud Firestore dê prioridade aos novos dados provenientes do Cloud Functions sobre quaisquer gravações que você esteja fazendo com a migração de dados históricos.

Crie uma função para gravar dados novos ou alterados no Cloud Firestore sempre que um cliente gravar dados no Realtime Database. Saiba mais sobre os gatilhos do Realtime Database para o Cloud Functions.

Torne o Cloud Firestore seu banco de dados principal para os dados migrados

Se você decidiu usar o Cloud Firestore como seu banco de dados principal para alguns de seus dados, certifique-se de considerar todas as funções de espelhamento de dados que você configurou e valide suas regras de segurança do Cloud Firestore.

  1. Se você usou o Cloud Functions para manter a paridade entre seus bancos de dados, verifique se não está duplicando operações de gravação nos dois bancos de dados em um loop. Alterne sua função para gravar em um único banco de dados ou remova a função completamente e comece a eliminar gradualmente a funcionalidade de gravação para os dados migrados em aplicativos ainda vinculados ao Realtime Database. Como você lida com isso para seu aplicativo depende de suas necessidades específicas e de seus usuários.

  2. Verifique se seus dados estão devidamente protegidos. Valide as regras de segurança do Cloud Firestore ou a configuração do IAM.