Вы можете использовать в своём приложении как Firebase Realtime Database , так и Cloud Firestore , используя преимущества каждого решения в соответствии со своими потребностями. Например, вы можете использовать поддержку присутствия в Realtime Database , как описано в разделе «Создание присутствия в Cloud Firestore .
Узнайте больше о различиях между базами данных .
Перемещение данных в Cloud Firestore
Если вы решили перенести часть данных из Realtime Database в Cloud Firestore , рассмотрите следующую последовательность действий. Поскольку каждая база данных имеет уникальные потребности и структурные особенности, автоматизированного пути миграции не существует. Вместо этого вы можете следовать следующей общей последовательности действий:
Сопоставьте структуру данных и правила безопасности из Realtime Database с Cloud Firestore . Как Realtime Database , так и Cloud Firestore используют аутентификацию Firebase, поэтому вам не нужно менять аутентификацию пользователей для вашего приложения. Однако правила безопасности и модель данных различаются, и важно тщательно учитывать эти различия, прежде чем начинать перенос данных в Cloud Firestore.
Перемещение исторических данных. При настройке новой структуры данных в Cloud Firestore вы можете сопоставить и перенести существующие данные из Realtime Database в новый экземпляр Cloud Firestore . Однако, если вы используете обе базы данных в своём приложении, вам не нужно переносить исторические данные из Realtime Database .
Зеркально отображайте новые данные в Firestore в режиме реального времени. Используйте Cloud Functions для записи новых данных в новую базу данных Cloud Firestore по мере их добавления в Realtime Database .
Сделайте 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 снижают необходимость дублирования данных для общих шаблонов доступа. Например, представьте себе экран в приложении «Городской путеводитель», на котором показаны все столицы, упорядоченные по численности населения. В 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 или веб-клиентов, или управление идентификацией и доступом (IAM) для серверов, убедитесь, что вы защищаете свои данные как в Cloud Firestore , так и в Realtime Database . Аутентификация пользователей выполняется службой аутентификации для обеих баз данных, поэтому вам не нужно менять реализацию аутентификации при начале использования 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 , выполните следующие действия:
- Экспортируйте данные из Realtime Database или используйте последнюю резервную копию .
- Перейдите в раздел Realtime Database в консоли Firebase .
- На вкладке Данные выберите корневой узел базы данных и выберите в меню пункт Экспорт JSON .
Создайте новую базу данных в 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 .
Если вы использовали Cloud Functions для поддержания паритета между базами данных, убедитесь, что операции записи в обеих базах данных не дублируются в цикле. Переключите функцию на запись в одну базу данных или полностью удалите её и начните постепенно отказываться от записи перенесённых данных в приложениях, всё ещё привязанных к Realtime Database . Способ реализации этого для вашего приложения зависит от ваших конкретных потребностей и пользователей.
Убедитесь, что ваши данные надежно защищены. Проверьте Cloud Firestore Security Rules или настройки IAM.