Используйте Cloud Firestore с базой данных Firebase Realtime

Вы можете использовать как Firebase Realtime Database , так и Cloud Firestore в своем приложении и использовать преимущества каждого решения базы данных в соответствии со своими потребностями. Например, вы можете захотеть использовать поддержку Realtime Database для присутствия, как описано в разделе Создание присутствия в Cloud Firestore .

Узнайте больше о различиях между базами данных .

Перемещение данных в Cloud Firestore

Если вы решили перенести часть своих данных из Realtime Database в Cloud Firestore , рассмотрите следующий поток. Поскольку у каждой базы данных есть уникальные потребности и структурные особенности, автоматизированного пути миграции не существует. Вместо этого вы можете следовать этой общей последовательности:

  1. Сопоставьте структуру данных и правила безопасности из Realtime Database с Cloud Firestore . Realtime Database и Cloud Firestore используют аутентификацию Firebase, поэтому вам не нужно менять аутентификацию пользователя для вашего приложения. Однако правила безопасности и модель данных различаются, и важно тщательно учитывать эти расхождения, прежде чем начинать перенос данных в Cloud Firestore.

  2. Перемещение исторических данных. При настройке новой структуры данных в Cloud Firestore вы можете сопоставить и переместить существующие данные из Realtime Database в новый экземпляр Cloud Firestore . Однако, если вы используете обе базы данных в своем приложении, вам не нужно перемещать исторические данные из Realtime Database .

  3. Зеркально отображайте новые данные в Firestore в режиме реального времени. Используйте Cloud Functions для записи новых данных в новую базу данных Cloud Firestore по мере их добавления в Realtime Database .

  4. Сделайте Cloud Firestore вашей основной базой данных для перенесенных данных. После того, как вы перенесли часть своих данных, используйте Cloud Firestore в качестве основной базы данных и сократите использование Realtime Database для перенесенных данных. Рассмотрите версии вашего приложения, которые все еще привязаны к Realtime Database для этих данных, и то, как вы планируете продолжать их поддерживать.

Обязательно учитывайте расходы на выставление счетов как за Realtime Database , так и за Cloud Firestore .

Сопоставьте свои данные

Данные в Realtime Database структурированы как единое дерево, в то время как Cloud Firestore поддерживает более явные иерархии данных через документы, коллекции и подколлекции. Если вы перемещаете часть своих данных из Realtime Database в Cloud Firestore , вам может потребоваться рассмотреть другую архитектуру для ваших данных.

Основные различия, которые следует учитывать

Если вы перемещаете данные из существующего дерева Realtime Database в документы и коллекции Cloud Firestore , помните о следующих основных различиях между базами данных, которые могут повлиять на структуру данных в Cloud Firestore :

  • Поверхностные запросы обеспечивают большую гибкость в иерархических структурах данных.
  • Сложные запросы обеспечивают большую детализацию и снижают необходимость в дублировании данных.
  • Курсоры запросов обеспечивают более надежную пагинацию.
  • Транзакции больше не требуют общего корня для всех ваших данных и стали более эффективными.
  • Биллинговые расходы различаются между Realtime Database и Cloud Firestore . Во многих случаях Cloud Firestore может быть дороже, чем Realtime Database , особенно если вы полагаетесь на множество мелких операций. Рассмотрите возможность сокращения количества операций в вашей базе данных и избегания ненужных записей. Узнайте больше о различиях в биллинге между Realtime Database и Cloud Firestore .

Лучшие практики в действии

Следующий пример отражает некоторые соображения, которые вы можете принять во внимание при перемещении данных между базами данных. Вы можете использовать неглубокие чтения и улучшенные возможности запросов для более естественных структур данных, чем вы могли использовать с Realtime Database .

Рассмотрим приложение-путеводитель по городу, которое помогает пользователям находить примечательные достопримечательности в городах по всему миру. Поскольку Realtime Database не имеет поверхностных чтений, вам, возможно, пришлось бы структурировать данные в двух узлах верхнего уровня, как показано ниже:

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

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

Cloud Firestore имеет неглубокие чтения, поэтому запрос документов в коллекции не извлекает данные из подколлекций. Следовательно, вы можете хранить информацию о достопримечательностях в подколлекцию:

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

Максимальный размер документа составляет 1 МБ, что является еще одной причиной хранить достопримечательности в виде подколлекции, сохраняя небольшой размер каждого документа о городе, а не перегружая документы вложенными списками.

Расширенные возможности запросов Cloud Firestore сокращают необходимость дублирования данных для общих шаблонов доступа. Например, рассмотрим экран в приложении City Guide, на котором показаны все столицы, упорядоченные по численности населения. В Realtime Database наиболее эффективным способом сделать это является ведение отдельного списка столиц, который дублирует данные из списка cities , как показано ниже:

{
   cities: {
    // ...
   },

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

В Cloud Firestore вы можете выразить список столиц в порядке численности населения в виде одного запроса:

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

Узнайте больше о модели данных Cloud Firestore и ознакомьтесь с нашими решениями , чтобы получить больше идей о том, как структурировать базу данных Cloud Firestore .

Защитите свои данные

Независимо от того, используете ли вы Cloud Firestore Security Rules для Android, Apple или веб-клиентов или Identity Access Management (IAM) для серверов, убедитесь, что вы защищаете свои данные в Cloud Firestore , а также Realtime Database . Аутентификация пользователей обрабатывается Authentication для обеих баз данных, поэтому вам не нужно менять реализацию Authentication, когда вы начинаете использовать Cloud Firestore .

Основные различия, которые следует учитывать

  • Мобильные и веб-SDK используют Cloud Firestore Security Rules , тогда как серверные SDK используют Identity Access Management (IAM) для защиты данных.
  • Cloud Firestore Security Rules не каскадируются, если вы не используете подстановочный знак. Документы и коллекции в противном случае не наследуют правила.
  • Вам больше не нужно проверять данные отдельно (как это было в Realtime Database ).
  • Cloud Firestore проверяет правила перед выполнением запроса, чтобы убедиться, что у пользователя есть соответствующий доступ ко всем данным, возвращаемым запросом.

Переместить исторические данные в Cloud Firestore

После сопоставления структур данных и безопасности с моделями данных и безопасности Cloud Firestore вы можете начать добавлять данные. Если вы планируете запрашивать исторические данные после перемещения приложения из Realtime Database в Cloud Firestore , добавьте экспорт старых данных в новую базу данных Cloud Firestore . Если вы планируете использовать в своем приложении как Realtime Database , так и Cloud Firestore , вы можете пропустить этот шаг.

Чтобы избежать перезаписи новых данных старыми, вам может потребоваться сначала добавить исторические данные. Если вы добавляете новые данные в обе базы данных одновременно, как обсуждается в следующем шаге, убедитесь, что вы отдаете приоритет новым данным, добавленным в Cloud Firestore с помощью Cloud Functions .

Чтобы перенести исторические данные в Cloud Firestore , выполните следующие действия:

  1. Экспортируйте данные из Realtime Database или используйте последнюю резервную копию .
    1. Перейдите в раздел Realtime Database в консоли Firebase .
    2. На вкладке «Данные» выберите корневой узел базы данных и выберите в меню пункт «Экспорт JSON» .
  2. Создайте новую базу данных в Cloud Firestore и добавьте свои данные .

    При перемещении части данных в Cloud Firestore рассмотрите следующие стратегии:

    • Напишите индивидуальный скрипт, который переносит ваши данные для вас. Хотя мы не можем предложить шаблон для этого скрипта, поскольку у каждой базы данных будут уникальные потребности, эксперты Cloud Firestore на нашем канале Slack или на Stack Overflow могут рассмотреть ваш скрипт или дать совет для вашей конкретной ситуации.
    • Используйте серверные SDK (Node.js, Java, Python или Go) для записи данных непосредственно в Cloud Firestore . Инструкции по настройке серверных SDK см. в разделе Начало работы .
    • Чтобы ускорить миграцию больших объемов данных, используйте пакетную запись и отправляйте до 500 операций в одном сетевом запросе.
    • Чтобы не выходить за пределы ограничений скорости Cloud Firestore , ограничьте количество операций записи до 500 в секунду для каждой коллекции.

Добавить новые данные в Cloud Firestore

Чтобы поддерживать паритет между базами данных, добавляйте новые данные в обе базы данных в режиме реального времени. Используйте Cloud Functions для запуска записи в Cloud Firestore всякий раз, когда клиент записывает в Realtime Database . Убедитесь, что Cloud Firestore отдает приоритет новым данным, поступающим из Cloud Functions над любыми записями, которые вы делаете из миграции исторических данных.

Создайте функцию для записи новых или изменяющихся данных в Cloud Firestore каждый раз, когда клиент записывает данные в Realtime Database . Узнайте больше о триггерах Realtime Database для Cloud Functions .

Сделайте Cloud Firestore основной базой данных для перенесенных данных.

Если вы решили использовать Cloud Firestore в качестве основной базы данных для некоторых своих данных, обязательно учтите все настроенные вами функции зеркалирования данных и проверьте Cloud Firestore Security Rules .

  1. Если вы использовали Cloud Functions для поддержания паритета между своими базами данных, убедитесь, что вы не дублируете операции записи в обеих базах данных в цикле. Переключите свою функцию на запись в одну базу данных или полностью удалите функцию и начните постепенно отказываться от функциональности записи для перенесенных данных в приложениях, все еще привязанных к Realtime Database . То, как вы справитесь с этим для своего приложения, зависит от ваших конкретных потребностей и ваших пользователей.

  2. Убедитесь, что ваши данные надежно защищены. Проверьте Cloud Firestore Security Rules или настройки IAM.