2016-02-17 4 views
4

Я пытаюсь выяснить, как обновить мои данные соответственно в Firebase.Firebase: атомные транзакции и многооконные обновления

Мое приложение - социальная сеть. Предположим, что мне нужно обновить число просмотров в объекте user, а также в post, когда приходит посетитель. Мне также необходимо обновить значениена тех же объектах.

  • views и updatedAt полей имеют определенное .write разрешение в post и user детей, так что любой желающий может изменить их, в отличие от других детей.
  • views ребенок должен быть обновлен с помощью transaction, чтобы увеличить количество атомарной
  • updatedAt ребенка, в другой стороны, может быть обновлен в любой моде, с transaction, set или update.

Я хотел бы ограничить количество вызовов Firebase и сделать все обновление атомарным, сделав эти обновления вместе. (Кроме того, потому что есть еще много, что я не описываю здесь)

Проблемы являются:

  1. transaction обновить как views и updatedAt бы произойти дважды: на posts и users объектов , но посетитель не может писать на этих объектах, которые ему не принадлежат, только дети views и updatedAt могут быть изменены. (даже если другие нетронутые).
  2. Многопользовательские транзакции недоступны в текущем API Firebase, AFAIK, поэтому это также не является атомарным.
  3. Обновление с несколькими местоположениями для каждого ребенка разбило бы атомарность дочернего элемента view, что является проблемой, в многопользовательской среде.

В конце концов, что я сейчас делаю:

Один transaction на views детей, и один единственный update на updatedAt из них, на обоих posts и users объектов, которые делают их четыре операции за каждый вид каждый запись просмотрена каждый посетитель. Это много!

Это также не атомно, за исключением детей views, что не имеет большого значения для поля временной метки, но по-прежнему является проблемой в других случаях использования.

Мой вопрос:

Любые рекомендации для более эффективной реализации?

+0

«Документы говорят, что обновление разбивает все транзакции, происходящие на этом объекте. Является ли он глобальным?» Неа. Это все транзакции по/по пути, который вы обновляете. –

+0

Извините, что я был неясно, по глобальному явлению: не только текущий пользовательский сеанс, но и любой пользователь приложения (я понимаю, что транзакция должна быть в «пути» к обновляемому обновлению). Я думаю, это ответ, очевидно, да *. – Pandaiolo

+0

Моя ошибка, [Firebase docs] (https://www.firebase.com/docs/web/api/firebase/transaction.html), ясно говорит, что, хотя транзакция отменяется локальным 'set' в том же месте, он * не * отменяется 'set' в других клиентах. Если другие клиенты обращаются к одному и тому же местоположению, локальный клиент повторяет транзакцию с самыми последними данными. – Pandaiolo

ответ

0

По крайней мере, вы должны быть в состоянии обновить updatedAt поля на пользователей и сообщений с использованием одного update() вызова с помощью data fan-out method.

Любые дополнительные счетчики, которые могут вам понадобиться, по-прежнему потребуют отдельных транзакций для правильной обработки.

Смежные вопросы