【发布时间】:2016-02-17 12:40:57
【问题描述】:
我正在尝试弄清楚如何在 Firebase 中相应地更新我的数据。
我的应用是一个社交网络。假设当访客进来时,我必须更新 user 对象和 post 中的视图计数。我还必须更新相同对象中的 updatedAt 值。
-
views和updatedAt字段在post和user子项中都有特定的.write授权,因此任何人都可以修改它们,这与其他子项不同。 - 必须使用
transaction更新views子级以自动增加计数 - 另一方面,
updatedAt孩子可以以任何方式更新,transaction、set或update。
我想限制对 Firebase 的调用次数,并通过将这些更新放在一起来使整个更新原子化。 (也是因为还有很多我这里就不一一介绍了)
问题是:
-
transaction更新views和updatedAt必须发生两次:在posts和users对象上,但访问者不能在这些不属于他的对象上写,只有可以修改views和updatedAt这两个孩子。 (即使其他人没有受到影响)。 - 当前的 Firebase API AFAIK 中不提供多位置事务,因此这也不是原子的。
- 对每个子节点进行多位置更新会破坏
view子节点的原子性,这在多用户环境中是个问题。
最后,我目前在做什么:
views 子对象上有一个 transaction,updatedAt 子对象上有一个 update,posts 和 users 对象,这使得它们四个操作对于每个访问者查看的每个帖子的每个视图。很多!
这也不是原子的,除了 views 孩子,这对于时间戳字段来说不是什么大问题,但在其他用例中仍然是一个问题。
我的问题是:
对更好的实施有何建议?
【问题讨论】:
-
“文档说更新会破坏该对象上发生的所有事务。它是全局的吗?”没有。这是您更新的路径上/下的所有事务。
-
对不起,我不清楚,通过全局 Iment :不仅是当前用户会话,还有应用程序的任何用户(我知道事务需要在更新的“路径”中取消)。我想答案显然是yes。
-
我的错误,Firebase docs 明确表示,虽然交易在同一位置被本地
set取消,但它不会被set在其他位置取消客户。如果其他客户端访问同一位置,则本地客户端使用最新数据重试事务。 -
如果这是您要查找的信息,请将其添加为自我回答并接受。
-
我自己对我的问题还没有一个明确的答案,但是(我仍然需要为每个帖子视图执行四个操作),但希望我能在几周内迁移我的应用程序使用 redux 存储的业务逻辑需要重新考虑这种数据交互。
标签: firebase firebase-security