【问题标题】:How to build a DB based ruleset for web app achievement system?如何为 Web 应用成就系统构建基于数据库的规则集?
【发布时间】:2010-07-21 03:40:37
【问题描述】:

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

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

目前我正计划将“触发器”放在控制器中的某些操作上,但完成工作的代码将在模型中。

成就系统是否有标准的数据库架构来实现这一点?如果没有必要,无需重新发明轮子。如果没有,您认为会出现什么样的问题,需要注意什么?

【问题讨论】:

    标签: c# sql-server asp.net-mvc


    【解决方案1】:

    您可能会发现 this answer 很有帮助。

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

    相反,您可以编写任意数量的单独课程,每个课程负责了解如何奖励一项特定成就。使用基类或接口给它们一个共同的契约:

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

    您可以在每个AchievementAwarderforeach 并定期致电Award()。例如,您可以获得“100 次访问”的成就:

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

    这解决了两个问题:

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

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

    【讨论】:

    • @Rex M - 听起来很棒!对于您给出的示例,它将是查找的 cron 作业类型。你会如何建议挂钩用户采取的行动?例如,他们发布了新的“事物”,这是第 100 个,所以给他们一个成就。还假设发布新“事物”可能有任意数量的成就。
    • @Chad 抱歉回复晚了 - 回答你的问题,正如你所说,这最适合作为 cron 作业,或者在我链接到的另一个答案中,在 app 初始化的自插入缓存对象启动。为了简单和性能,您最好的选择是尽可能避免将其直接连接到用户操作。在许多情况下,在将您推到边缘的行动与获得奖励之间延迟几分钟会更好。
    • @Chad 不确定 Foursquare,我使用 Gowalla。 Gowalla 确实几乎立即授予徽章,但 Gowalla 还处理一个 小得多的数据集 - 我的整个访问历史记录只有几百个项目,每个项目都有一些属性 - 可以本地计算非常快。在多用户 Web 应用程序中,您可能需要处理更大的数据集。
    • @Chad 如果您可以将执行操作所需的整个数据集保留在内存中,并且总共少于几千个对象,那么这可能是有意义的。将计算每个成就所需的信息数量乘以用户数量,这就是你的集合。
    • @Chad 在这种情况下,它可能希望过滤访问次数大于 100 且尚未授予徽章的位置。这使得它更准确,并且与可以多次获得的其他奖励一致 - 唯一的区别是是否存在这种额外的支票。这样做确实可以将这些作为重复作业而不是基于用户活动的不可预测的触发器来运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多