Работа с данными - 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, обязательно
}
}
}
}
Объяснение по некоторым полям
-
users — основной узел для хранения данных о пользователях.
- nickname, avatarUrl, description - Основная информация о пользователе.
- subscriptions и subscribers - Хранят подписки и подписчиков пользователя как ключи объектов для быстрого доступа и экономии места. В users каждый пользователь хранится внутри своего uid, который выдается в Firebase Auth == он уникален и неизменяем. Таки образом у нас тут получается +- эффективное хранение данных.
-
posts - основной узел для хранения всех данных, связанных с постами.
- authorId, content, images - Идентификация автора и содержание поста. Список изображений является массивом URL.
- likes, reposts, favorites - Отслеживание взаимодействий пользователей с постом через объектную модель, чтобы определить, взаимодействовал ли пользователь.
- comments - Структура для хранения комментариев каждого поста, содержат ID жителя, текст и временную метку.
- views - Число просмотров для отслеживания популярности поста. Благодаря встроенным методам в Firebase Realtime Database, у нас есть возможность создавать целые queries c фильтром и/или сортировкой данных по ключу. В результате узлы данных в этой древовидной структуре мы не дублируем.
-
notifications - хранит историю уведомлений о взаимодействиях с контентом пользователя.
- Уведомления классифицируются по типу (лайк, репост, комментарий) и содержат временную метку, что позволяет отслеживать и отображать уведомления по времени.
Firebase Storage
Все картинки храним в Firebase Storage, это такой же бакет для хранения файлов как S3, только у него еще есть глубокая интеграция с другими сервисами Firebase.
Например, мы можем написать cloud function (хранимую процедуру) для Firebase, которая внутри себя будет модифицировать данные в Realtime Database, Storage и отправлять пуш-уведомление через Firebase Cloud Messaging.
И это все в одном куске кода (== методе) без интеграции с чем-либо сторонним. Таким образом мы можем бесшовно реализовать интеграцию с любым из других сервисов Firebasе.