2013-12-11 75 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 !!答案就在我面前,我沒有看到它。我想我正在尋找的是緩存最近的活動時間。通過這種方式,我可以將這些類型的操作組合到幾個類別中,並僅使用我將要獲得的用戶類來緩存它們的時間。感謝您的建議和改進。 –