Я добавил имя пользователя и изображение пользователя в модель EventUpdate, чтобы упростить запрос.Я слышал, что денормализация - это путь к базе данных NoSQL.
Правильно, denormalization
и является обычной практикой, когда дело доходит до Firebase.Если вы новичок в базах данных NoQSL, я рекомендую вам посмотреть это видео, Денормализация нормальна с базой данных Firebase для лучшего понимания.Это для базы данных реального времени Firebase, но к Cloud Firestore применяются те же правила.
Но если пользователь обновляет свой пользовательский образ, я должен обновить все eventUpdates, созданные этим пользователем.Похоже, что-то, что вы не хотите делать.Но есть ли лучший способ сделать это?
Да, это тоже правильно.Вам необходимо обновить все места, где существует это изображение.Поскольку вы выбрали google-cloud-firestore
в качестве тега, я рекомендую вам посмотреть мой ответ из этой записи , потому что в случае многих операций записи Firestore может быть немного дорогостоящим.См. Также Ценовые планы Firestore .
Относительно Firestore, вместо того, чтобы держать весь объект, вы можете удерживать только ссылку на изображение.В этом случае нет ничего, что вам нужно обновить.Это всегда торговля между этими двумя методами, и, к сожалению, между ними нет никакого пути.Вы или держите объекты или только ссылки на объекты.Для этого, пожалуйста, смотрите мой ответ из этой записи .
Как мне создать структуру данных, оптимизированную для выполнения следующего запроса: get eventUpdatesот меня и моих друзей, упорядоченных по дате.
Как я вижу, ваша схема больше похожа на схему базы данных Firebase в реальном времени, чем на облачное хранилище пожаров.И чтобы ответить на ваш вопрос, да, вы можете создать.Итак, говоря о Firestore, вы можете создать коллекцию с именем eventUpdates
, которая может содержать eventUpdate
объектов и запрашивать ее в соответствии с отметкой времени, такой запрос необходим:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference eventUpdatesRef = rootRef.collection("eventUpdates");
Query query = eventUpdatesRef.orderBy("timestamp", Query.Direction.ASCENDING);
Но обратите внимание, чтополе timestamp
должно иметь тип Date
, а не long
.Также посмотрите на мой ответ из этого поста , чтобы узнать, как добавить свойство даты в базу данных Cloud Firestore.
Какмагазин любит?Я могу сохранить счетчик в eventUpdate.Но это становится проблемой, когда я денормализирую eventUpdates (см. Текущее решение под EDIT)
Вы можете просто добавлять лайки, но я рекомендую посмотреть последнюю часть моего ответа из этого поста.Поэтому вы можете рассмотреть возможность добавления этого количества в базу данных Firebase в реальном времени, а не в Cloud Firestore.Обе базы данных работают очень хорошо вместе.
Эта структура, кажется, работает, но моя проблема с этим решением состоит в том, что мне нужно сделать много вызовов записи, чтобы обновить один eventUpdate из-за всех копий в каждомподача (1000 подписчиков означает 1000 копий).И, похоже, мне нужно это много делать.
Вы также можете взглянуть на мой ответ из этого сообщения .
Мне кажется, что firebase не подходит для моего проекта, и я подумываю заменить его на базу данных SQL, или кто-нибудь здесь может передумать с лучшим решением?
Я так не думаю.Есть много приложений, которые имеют точно такой же механизм, как ваш, и работают очень хорошо.