В чем разница между Cloud Firestore и Firebase Realtime Database?

«В чем разница между Cloud Firestore и Firebase Realtime Database?» — вопрос из категории Базы данных, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Firebase — это платформа для разработки мобильных и веб-приложений (BaaS), которая включает множество сервисов: аутентификацию, хостинг, облачные функции и две основные облачные базы данных.

Cloud Firestore и Firebase Realtime Database (RTDB) — это две разные NoSQL облачные БД в экосистеме Firebase.

Сравнительная таблица:

Характеристика Cloud Firestore Firebase Realtime Database (RTDB)
Модель данных Документы в коллекциях (более структурированная) Единое JSON-дерево
Запросы Сложные составные запросы с сортировкой и фильтрацией по нескольким полям. Индексирование автоматическое. Базовые запросы. Сортировка/фильтрация обычно по одному ключу.
Масштабирование Автоматическое горизонтальное. Нет необходимости в шардинге. Требует ручного шардинга при очень высоких нагрузках.
Оффлайн-работа Поддержка из коробки с персистентным кэшем. Требует явного включения персистентности (.persistenceEnabled).
Стоимость Оплата за операции (чтение, запись, удаление) и объем хранимых данных. Оплата за объем переданного трафика и одновременных подключений.
Надежность Многорегиональная репликация, гарантии консистентности. Базовая репликация внутри региона.

Пример кода для Firestore:

import FirebaseFirestore

let db = Firestore.firestore()

// Добавление документа
let userRef = db.collection("users").document("user123")
try await userRef.setData([
    "name": "Anna",
    "age": 30,
    "city": "Berlin"
])

// Сложный запрос: пользователи из Берлина старше 25
let querySnapshot = try await db.collection("users")
    .whereField("city", isEqualTo: "Berlin")
    .whereField("age", isGreaterThan: 25)
    .order(by: "age")
    .getDocuments()

Пример кода для Realtime Database:

import FirebaseDatabase

let ref = Database.database().reference()

// Запись данных в дерево
ref.child("users/user123").setValue([
    "name": "Anna",
    "age": 30,
    "city": "Berlin"
])

// Чтение данных и подписка на изменения
ref.child("users/user123/name").observe(.value) { snapshot in
    if let name = snapshot.value as? String {
        print(name) // "Anna"
    }
}

Рекомендация по выбору:

  • Выберите Firestore для новых проектов. Он предлагает более мощные запросы, удобную структуру данных и лучшее масштабирование.
  • Рассмотрите Realtime Database если нужна минимальная задержка (чаты, игры в реальном времени) или проект уже использует RTDB.