我正在试图找出如何设置数据库和/或模型以处理各种徽章。让我们以Stack Overflow badges为例。每个都有不同的规则,有些可能只是一个不同的变量(如10条评论和100条评论)。
我的问题是如何在应用程序中设置此类型验证/检查?每个徽章都应该有自己的方法吗?
答案 0 :(得分:1)
我认为有些是实时计算的,而其他则是在间歇运行的过程中计算的。
例如,对于您的答案获得10个upvotes时出现的徽章,可以实时计算,但几乎没有性能损失。
另一方面,对于检查您是否达到每日声誉上限x次数的徽章,您可能希望将其作为某种批处理作业,因为您只在每天结束时进行检查。
关键是要让事情快速运转。堆栈溢出每天会产生数千(甚至数万)的问题,可能有数十万条评论。任何不值得计算的东西都应该在一个单独的过程中运行。它使核心功能保持紧凑,有限和清洁,从而实现高性能。在核心发布系统之外的进程中运行复杂计算可以在不影响用户使用站点的能力的情况下执行此操作。如果任务足够复杂,您可以通过在多台计算机上运行相同的进程来水平扩展。
答案 1 :(得分:1)
如果我需要,那就是我将如何实现它:
我将设置一些队列管理器(有很多这样的软件)并编写一个代理来处理来自队列的消息。
每次发生任何事件时,例如:您查看了某个主题,编辑了您的评论,编辑了您的答案,编辑了另一个人的答案,您进行了投票等等 - 您收集了另外一条消息,其中包含事件描述。是的,那里会有真的大量的消息。
收集大量邮件后,您可以启动代理商,按时间或实时处理邮件。
使用此架构,您可以将代理扩展为您想要的复杂徽章。
答案 2 :(得分:1)
由于SO运行SQL Server,SQL Server代理作业定期运行以制表统计信息。当满足条件时,作业中的存储过程将插入到徽章/ etc表中。
触发器将是另一种选择,但它们的执行不能因多个用户的范围而延迟。