我正在创建一个ASP.Net MVC 5网站。在我的网站中,有一个投票系统与StackOverflow使用的投票系统非常相似。我已经成功创建了用户提交投票的系统。然而,SO的一个简洁特征是它阻止用户快速点击投票按钮(即投票太快)。目前我的投票类是这样的:
public class RestaurantReviewVote
{
[Key]
public int ID { get; set; }
public virtual NormalUser User { get; set; }
public virtual ItemReview Reivew { get; set; }
[Range(-1, 1)]
public int Value { get; set; }
public DateTime Created { get; set; }
}
我的想法是做这样的事情:
rapidActivity = db.Votes.Where(v => v.User.Id == userId && (DateTime.UtcNow - v.Created < THRESHOLD)).Any();
但是,我认为每次用户提交投票时运行此操作都会对数据库造成太大压力。 (也许我错了)我怎样才能考虑到性能呢?
PS: 如果您认为有更好的方式来进行投票系统,请告诉我。我感谢任何帮助。感谢。
答案 0 :(得分:2)
我认为你的解决方案对于限制选票是合理的。如果您不想每次都查询数据库,则始终可以缓存用户的上次投票时间。
这也可能是表现的边缘情况。如果检查仅在某人投票时发生,那么您不必在每次加载页面时受到这种惩罚。您可能无论如何都要进行其他查询以进行投票,因此您可以将其包装在您的Vote()方法中:
(请注意,您可以结合Where()和Any()方法)
public bool Vote(int restaurantId)
{
if (db.Votes.Any(v => v.User.Id == userId && (DateTime.UtcNow - v.Created < THRESHOLD))
{
throw new VoteException("You are voting too quickly");
}
...
}