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