Usar o Cloud Firestore com o Firebase Realtime Database

Você pode usar o Firebase Realtime Database e o Cloud Firestore no 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 .

Movendo dados para o Cloud Firestore

Se você decidiu migrar alguns dos 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 existe 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 dependem do Firebase Authentication, então você não precisa alterar a autenticação do usuário do 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 migrar 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 no 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 no novo banco de dados do Cloud Firestore à medida que ele é adicionado ao Realtime Database.

  4. Faça do 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 dos seus dados do Realtime Database para o Cloud Firestore, considere 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:

  • Consultas superficiais oferecem mais flexibilidade em estruturas de dados hierárquicas.
  • Consultas complexas oferecem mais granularidade e reduzem a necessidade de dados duplicados.
  • Os cursores de consulta oferecem 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ê depende de muitas operações pequenas. Considere reduzir o número de operações no 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.

Melhores práticas em ação

O exemplo a seguir reflete algumas das considerações que você pode fazer ao transferir seus dados entre bancos de dados. Você pode aproveitar leituras superficiais e recursos de consulta aprimorados para estruturas de dados mais naturais do que as usadas 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ê tenha que estruturar os dados em dois nós de nível superior, como segue:

// /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, a consulta de documentos em uma coleção não extrai dados de subcoleções. Conseqüentemente, 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 tamanho máximo de 1 MB, o que é outro motivo para armazenar pontos de referência como uma subcoleção, mantendo cada documento da 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 de cidades 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 cities , como segue:

{
   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 Cloud Firestore e dê uma olhada em nossas soluções para mais ideias sobre como estruturar seu banco de dados Cloud Firestore.

Proteja seus dados

Esteja você usando regras de segurança do Cloud Firestore para clientes Android, Apple ou Web, ou gerenciamento de acesso de identidade (IAM) para servidores, certifique-se de proteger seus dados no Cloud Firestore e também no Realtime Database. A autenticação do usuário é gerenciada pelo Authentication para ambos os bancos de dados. Portanto, você não precisa alterar a implementação do Authentication ao começar a usar o Cloud Firestore.

Principais diferenças a considerar

  • Os SDKs móveis e da Web usam 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 são transmitidas em cascata, a menos que você use um curinga. Caso contrário, 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 apropriado 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ê poderá 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 dos dados antigos ao novo banco de dados do Cloud Firestore. Se você planeja usar o Realtime Database e o Cloud Firestore no seu aplicativo, pule esta etapa.

Para evitar a substituição de novos dados por dados antigos, talvez você queira adicionar primeiro seus dados históricos. Se você adicionar novos dados a ambos os bancos de dados simultaneamente, conforme discutido na próxima etapa, dê precedência 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. Vá para a seção Realtime Database no console do Firebase.
    2. Na guia Dados , selecione o nó de nível raiz do seu 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 transfira seus dados para você. Embora não possamos oferecer um modelo para este 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 Primeiros passos .
    • 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 permanecer dentro dos limites de taxa do Cloud Firestore , limite as operações a 500 gravações/segundo para cada coleção.

Adicione 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ê precedência aos novos dados provenientes do Cloud Functions sobre quaisquer gravações feitas na 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 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 dos seus dados, certifique-se de levar em conta todas as funções de espelhamento de dados que você configurou e validar suas regras de segurança do Cloud Firestore.

  1. Se você usou o Cloud Functions para manter a paridade entre seus bancos de dados, certifique-se de não duplicar operações de gravação em ambos os bancos de dados em um loop. Mude sua função para gravar em um único banco de dados ou remova-a completamente e comece a descontinuar a funcionalidade de gravação para os dados migrados em aplicativos ainda vinculados ao Realtime Database. A maneira como você lida com isso em seu aplicativo depende de suas necessidades específicas e de seus usuários.

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