gpt4 book ai didi

android - Firebase : Should I use transactions? 中加注/点赞系统的正确设计

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:36:30 26 4
gpt4 key购买 nike

我正在开发一个应用程序,其功能类似于 Firebase 文档中给出的 star count on a blog post example,我对轮询系统的设计以及是否使用 .

在示例中,帖子的数据如下所示:

postid {
// some data here about the post, author, id, etc,
starCount : <an integer count of the stars>,
stars : {
<user who starred> : true,
<user who starred> : true,
// ... and so on, basically a list of all the users who starred the post
}
}

文档使用事务来更新星数:

private void onStarClicked(DatabaseReference postRef) {
postRef.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
Post p = mutableData.getValue(Post.class);
if (p == null) {
return Transaction.success(mutableData);
}

if (p.stars.containsKey(getUid())) {
// Unstar the post and remove self from stars
p.starCount = p.starCount - 1;
p.stars.remove(getUid());
} else {
// Star the post and add self to stars
p.starCount = p.starCount + 1;
p.stars.put(getUid(), true);
}

// Set value and report transaction success
mutableData.setValue(p);
return Transaction.success(mutableData);
}

@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
// Transaction completed
Log.d(TAG, "postTransaction:onComplete:" + databaseError);
}
});
}

由于使用交易,starCountstars 似乎需要成为同一对象的一部分。为什么?因为我想同时使用事务并确保自动化。确保自动性的另一个选项是多路径更新,但如 here in the comments 所述,您不能将多路径更新与转换一起使用。您可以访问 mutableData(在本例中为 post 对象),仅此而已。

所以如果 starCountstars 必须存储在同一位置,我不明白 starCount 的意义。每当您获得一个帖子对象时,它都会包含 stars,这是所有为其加星标的人的列表。为什么不完全删除 starCount 而只获取星星列表的大小?这有什么不好的地方吗?

在这种情况下,给某物加星标/取消加星标类似于 p.stars.put(getUid(), true);p.stars.remove(getUid()); 。如果我这样做了,我看不到交易的必要性,因为我不再有多个用户更新一个“计数器”对象。我可以为 p.stars.put(getUid(), true); 语句使用一个事务,但对我来说,尝试从两个不同的事物中加星标/取消加星标的同一用户似乎极不可能设备,即使他们这样做了,据我所知也不会是灾难性的。

那么我在这里缺少什么? 为什么在这里使用事务以及存储和手动跟踪 starCount 有什么好处?我可以看到将 stars 用户列表存储在数据库中的其他地方的性能优势,如 this example 所示,但交易将无法进行。

任何见解将不胜感激,谢谢!

最佳答案

在我们努力创建一个可以从中获取文档示例的工作示例应用程序的过程中,我们确实可能已经创建了一个不明智(但功能性)的事务使用。

我建议您查看 my answer to this question以更合理(但绝对复杂)的方式使用多位置更新和服务器端安全规则进行安全计数。

但总的来说,在这种情况下,我总是建议将投票逻辑与计数逻辑分开。因此,当用户为帖子投票时,您将一个简单的记录写入数据库以记录他们的操作:

votesQueue
<push id>
<uid>: true

然后您有一个微型服务器脚本(例如 firebase queue worker),用于监听此队列并汇总投票数。

这种方法在使用 Firebase 时非常常见,并且使事情变得简单得多。您可能很容易想象如何保护这两个节点(votesQueuevoteTotals),同时我可以向您保证,我上面链接的答案中的解决方案非常适合我一些维护问题。

关于android - Firebase : Should I use transactions? 中加注/点赞系统的正确设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41473042/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com