我正在为ASP.NET MVC网站规划一个成就系统。我希望将成就“规则”存储在数据库中 - 以便更容易地添加新成就和管理现有规则的中心位置。用户无权更改规则。
当用户执行可能获得成就的操作时,将查询数据库规则,如果存在匹配项,请为其提供成就(存储在查找表中,(userId,achievementId,dateAwarded)。
目前我打算在控制器中对某些操作设置“触发器”,但完成工作的代码将在模型中。
是否有完成此功能的成就系统的标准数据库架构?如果没有必要,无需重新发明轮子。如果没有,你认为会出现什么样的问题,需要注意什么?
答案 0 :(得分: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
}
}
这解决了两个问题:
与基于数据库的规则引擎相比,它的数量级更简单,但更灵活。如您所见,各个单元非常小,易于更改而不会影响较大的系统。
它可以异步运行,因此对于需要进行繁重工作以确定是否应该授予的成就,用户的正常活动不会受到成就引擎的影响。