2010-07-21 57 views
8

我正在爲ASP.NET MVC網站規劃一個成就係統。我希望將成就「規則」存儲在數據庫中 - 以便更容易添加新成就和管理現有規則的中心位置。用戶將無法更改規則。如何爲Web應用程序實現系統構建基於數據庫的規則集?

當用戶執行可能獲得的成就的動作,DB規則將被查詢,如果有比賽,給他們的成就(存儲在一個查找表(用戶ID,achievementId,dateAwarded)。

目前我打算將「觸發器」放在控制器中的某些操作上,但執行該操作的代碼將在該模型中。

是否存在實現系統的標準數據庫模式這個?如果不是必要的話,不需要重新發明輪子,如果不是,你認爲會出現什麼樣的問題,需要注意什麼?

回答

9

您可能會感興趣this answer對您有幫助。

從經驗說起,構建一個基於數據庫的規則引擎來響應用戶操作是一個非常耗時,容易出錯,痛苦的操作。

相反,您可以編寫任意數量的單個類,每個類負責知道如何獎勵一項特定成就。使用一個基類或接口給他們所有的共用簽約:

public abstract class AchievementAwarder 
{ 
    //override to provide specific badge logic 
    public abstract void Award(); 
} 

您可以foreach在每個AchievementAwarder和重複性計劃調用Award()。例如,你可以有一個「100次訪問」成果:

public class 100VisitsAwarder : AchievementAwarder 
{ 
    public override void Award() 
    { 
     //get a visit count from the db for all users 
     //award achievements 
    } 
} 

這解決了兩個問題:

  1. 它的大小簡單的命令,但更靈活,比基於數據庫的規則引擎。正如您所看到的,單個單位非常小,易於更改,而不會影響較大的系統。

  2. 它可以異步運行,因此對於需要一些繁重工作以確定是否應該頒發的成就,用戶的正常活動不受成績引擎的影響。

+0

@Rex M - 聽起來不錯!對於你給它的例子將是一個cron工作類型的查找。你會如何推薦用戶採取的行動?例如,他們發佈新的「東西」,這是第100個,所以給他們一個成就。同時假設發佈一個新的「事物」可能有許多成就。 – Chaddeus 2010-07-21 06:17:14

+2

@Chad對於遲到的回覆感到抱歉 - 回答你的問題,正如你所說,這最適合作爲cron作業,或者在我鏈接的其他答案中,是一個在應用程序啓動時初始化的自插入緩存對象。爲了簡單和性能,你最好的選擇就是儘可能地避免將它直接連接到用戶的操作上。在許多情況下,在促使你超越邊緣的行爲與獲得的獎勵之間延遲幾分鐘會更好。 – 2010-07-26 12:29:41

+0

@ Rex M - 謝謝... Foursquare是如何做到的?我不使用它,但是當用戶解鎖徽章時,他們是否立即得到它?或者當cron工作流逝時,它會被獎勵嗎? 我絕對喜歡保持網站性能的想法!剛剛在主頁上加載了.48秒。:D – Chaddeus 2010-07-27 03:00:10

相關問題