如何为Web应用程序成就系统构建基于数据库的规则集?

Cha*_*eus 8 c# sql-server asp.net-mvc

我正在计划一个ASP.NET MVC站点的成就系统.我希望将成就"规则"存储在数据库中 - 以便更容易地添加新成就和管理现有规则的中心位置.用户无权更改规则.

当用户执行可能获得成就的操作时,将查询数据库规则,如果存在匹配项,则为其提供成就(存储在查找表中,(userId,achievementId,dateAwarded)).

目前我正计划在控制器中对某些操作设置"触发器",但执行工作的代码将在模型中.

是否有完成此任务的成就系统的标准DB模式?如果没有必要,无需重新发明轮子.如果没有,你认为会出现什么样的问题,需要注意什么?

Rex*_*x M 9

您可能会发现此答案很有帮助.

根据经验,构建基于数据库的规则引擎以响应用户操作是一项非常耗时,容易出错且痛苦的练习.

相反,您可以编写任意数量的个人课程,每个课程负责了解如何奖励一项特定成就.使用基类或接口为它们提供所有通用合同:

public abstract class AchievementAwarder
{
    //override to provide specific badge logic
    public abstract void Award();
}
Run Code Online (Sandbox Code Playgroud)

您可以foreach在每个上面AchievementAwarder调用Award()定期计划.例如,您可以获得"100次访问"成就:

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

这解决了两个问题:

  1. 与基于数据库的规则引擎相比,它的数量级更简单,但更灵活.如您所见,各个单元非常小,易于更换而不会影响较大的系统.

  2. 它可以异步运行,因此对于需要一些繁重的成就来确定是否应该授予它们,用户的正常活动不会受到成就引擎的影响.

  • @Chad抱歉迟到的回复 - 回答你的问题,因为你说这最适合作为一个cron工作,或者在我链接到的另一个答案中,在app启动时初始化的自插入缓存对象.为了简单和性能,您最好的选择是尽可能避免将其直接连接到用户操作.在许多情况下,在推动你超越边缘的行动和获得奖励之间延迟几分钟的生活会好得多. (2认同)