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

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

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

Перенос данных в Cloud Firestore

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

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

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

  3. Отражайте новые данные в Firestore в режиме реального времени. Используйте облачные функции для записи новых данных в вашу новую базу данных Cloud Firestore по мере их добавления в базу данных реального времени.

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

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

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

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

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

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

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

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

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

Рассмотрим приложение-путеводитель по городу, которое помогает пользователям находить известные достопримечательности в городах по всему миру. Поскольку в базе данных 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 уменьшают необходимость дублирования данных для общих шаблонов доступа. Например, рассмотрим экран в приложении путеводителя по городу, на котором показаны все столицы, упорядоченные по населению. В базе данных реального времени наиболее эффективным способом сделать это является ведение отдельного списка столичных городов, который дублирует данные из списка cities , как показано ниже:

{
   cities: {
    // ...
   },

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

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

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

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

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

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

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

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

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

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

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

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

  1. Экспортируйте свои данные из базы данных реального времени или используйте недавнюю резервную копию .
    1. Перейдите в раздел База данных реального времени в консоли 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 Firestore всякий раз, когда клиент записывает данные в базу данных реального времени. Убедитесь, что Cloud Firestore отдает приоритет новым данным, поступающим из Cloud Functions, по сравнению с любыми записями, которые вы делаете при переносе исторических данных.

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

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

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

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

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