Работа с данными - ppv-vldmr/masters-mobdev-project GitHub Wiki

Firebase

Схема основных данных

{
  "users": {
    "userId123": {
      "nickname": "string", // Никнейм пользователя, string, обязательно 
      "avatarUrl": "string", // URL аватара, string, опционально 
      "description": "string", // Описание профиля, string, опционально
      "subscriptions": { // Подписки пользователя
        "userId456": 1234567890, // ID пользователя, на которого подписан, number, значение в виде timestamp == когда добавлено
      },
      "subscribers": { // Подписчики пользователя
        "userId789": 1234567890, // ID подписчика, number, значение в виде timestamp == когда добавлено
      },
      "favourite_posts": { // Посты в избранном
        "postId123": "string", // ID поста, обязательно
        "timestamp": 1234567890 // Время добавления поста в избранное, number, обязательно
      },
      "joined_at": 1234567890 // Время регистрации пользователя, number, обязательно, значение в виде timestamp == когда добавлено
    }
  },
  "posts": {
    "postId123": {
      "authorId": "userId123", // ID автора поста, string, обязательно
      "content": "string", // Текст поста, string, обязательно
      "images": [ // Список URL изображений в посте
        "imageUrl1", 
        "imageUrl2"
      ],
      "likes": { // Лайки на посте
        "userId456": true, // ID пользователя, поставившего лайк
      },
      "reposts": { // Репосты поста
        "userId789": true, // ID пользователя, сделавшего репост
      },
      "comments": { // Комментарии к посту
        "commentId123": {
          "userId": "userId456", // ID комментатора, string, обязательно
          "content": "string", // Текст комментария, string, обязательно
          "timestamp": 1234567890 // Время добавления комментария, number, обязательно
        }
      },
      "favorites": { // Пользователи, добавившие пост в избранное
        "userId789": true // ID пользователя, добавившего в избранное
      },
      "views": 100 // Число просмотров, number, обязательно,
      "timestamp": 1234567890, Время создания поста, number, обязательно
    }
  },
  "notifications": {
    "userId123": {
      "notificationId123": {
        "type": "like", // Тип уведомления (like, repost, comment), string, обязательно
        "fromUserId": "userId456", // ID пользователя, вызвавшего уведомление, string, обязательно
        "postId": "postId123", // ID поста, к которому относится уведомление, string, обязательно
        "timestamp": 1234567890 // Время события, number, обязательно
      }
    }
  }
}

Объяснение по некоторым полям

  1. users — основной узел для хранения данных о пользователях.

    • nickname, avatarUrl, description - Основная информация о пользователе.
    • subscriptions и subscribers - Хранят подписки и подписчиков пользователя как ключи объектов для быстрого доступа и экономии места. В users каждый пользователь хранится внутри своего uid, который выдается в Firebase Auth == он уникален и неизменяем. Таки образом у нас тут получается +- эффективное хранение данных.
  2. posts - основной узел для хранения всех данных, связанных с постами.

    • authorId, content, images - Идентификация автора и содержание поста. Список изображений является массивом URL.
    • likes, reposts, favorites - Отслеживание взаимодействий пользователей с постом через объектную модель, чтобы определить, взаимодействовал ли пользователь.
    • comments - Структура для хранения комментариев каждого поста, содержат ID жителя, текст и временную метку.
    • views - Число просмотров для отслеживания популярности поста. Благодаря встроенным методам в Firebase Realtime Database, у нас есть возможность создавать целые queries c фильтром и/или сортировкой данных по ключу. В результате узлы данных в этой древовидной структуре мы не дублируем.
  3. notifications - хранит историю уведомлений о взаимодействиях с контентом пользователя.

    • Уведомления классифицируются по типу (лайк, репост, комментарий) и содержат временную метку, что позволяет отслеживать и отображать уведомления по времени.

Firebase Storage

Все картинки храним в Firebase Storage, это такой же бакет для хранения файлов как S3, только у него еще есть глубокая интеграция с другими сервисами Firebase.
Например, мы можем написать cloud function (хранимую процедуру) для Firebase, которая внутри себя будет модифицировать данные в Realtime Database, Storage и отправлять пуш-уведомление через Firebase Cloud Messaging.
И это все в одном куске кода (== методе) без интеграции с чем-либо сторонним. Таким образом мы можем бесшовно реализовать интеграцию с любым из других сервисов Firebasе.