2013-12-11 51 views
1

我正在创建一个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: 如果您认为有更好的方式来完成投票系统,请告诉我。我很感激任何帮助。谢谢。

回答

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"); 
    } 

    ... 
} 
+0

YES !!答案就在我面前,我没有看到它。我想我正在寻找的是缓存最近的活动时间。通过这种方式,我可以将这些类型的操作组合到几个类别中,并仅使用我将要获得的用户类来缓存它们的时间。感谢您的建议和改进。 –