Я пытаюсь выяснить, как обновить мои данные соответственно в Firebase.Firebase: атомные транзакции и многооконные обновления
Мое приложение - социальная сеть. Предположим, что мне нужно обновить число просмотров в объекте user
, а также в post
, когда приходит посетитель. Мне также необходимо обновить значениена тех же объектах.
views
иupdatedAt
полей имеют определенное.write
разрешение вpost
иuser
детей, так что любой желающий может изменить их, в отличие от других детей.views
ребенок должен быть обновлен с помощьюtransaction
, чтобы увеличить количество атомарнойupdatedAt
ребенка, в другой стороны, может быть обновлен в любой моде, сtransaction
,set
илиupdate
.
Я хотел бы ограничить количество вызовов Firebase и сделать все обновление атомарным, сделав эти обновления вместе. (Кроме того, потому что есть еще много, что я не описываю здесь)
Проблемы являются:
transaction
обновить какviews
иupdatedAt
бы произойти дважды: наposts
иusers
объектов , но посетитель не может писать на этих объектах, которые ему не принадлежат, только детиviews
иupdatedAt
могут быть изменены. (даже если другие нетронутые).- Многопользовательские транзакции недоступны в текущем API Firebase, AFAIK, поэтому это также не является атомарным.
- Обновление с несколькими местоположениями для каждого ребенка разбило бы атомарность дочернего элемента
view
, что является проблемой, в многопользовательской среде.
В конце концов, что я сейчас делаю:
Один transaction
на views
детей, и один единственный update
на updatedAt
из них, на обоих posts
и users
объектов, которые делают их четыре операции за каждый вид каждый запись просмотрена каждый посетитель. Это много!
Это также не атомно, за исключением детей views
, что не имеет большого значения для поля временной метки, но по-прежнему является проблемой в других случаях использования.
Мой вопрос:
Любые рекомендации для более эффективной реализации?
«Документы говорят, что обновление разбивает все транзакции, происходящие на этом объекте. Является ли он глобальным?» Неа. Это все транзакции по/по пути, который вы обновляете. –
Извините, что я был неясно, по глобальному явлению: не только текущий пользовательский сеанс, но и любой пользователь приложения (я понимаю, что транзакция должна быть в «пути» к обновляемому обновлению). Я думаю, это ответ, очевидно, да *. – Pandaiolo
Моя ошибка, [Firebase docs] (https://www.firebase.com/docs/web/api/firebase/transaction.html), ясно говорит, что, хотя транзакция отменяется локальным 'set' в том же месте, он * не * отменяется 'set' в других клиентах. Если другие клиенты обращаются к одному и тому же местоположению, локальный клиент повторяет транзакцию с самыми последними данными. – Pandaiolo