2010-12-21 68 views
2

我想弄清楚如何设置一个数据库和/或模型来处理各种徽章。让我们以堆栈溢出badges为例。每个规则都有不同的规则,有些可能只是一个不同的变量(比如10条评论和100条评论)。徽章 - 数据结构/模型?

我的问题是你如何在应用程序中设置此类型验证/检查?每个徽章是否都有自己的方法?

回答

1

由于SO运行SQL Server,SQL Server代理作业定期运行以制表统计信息。当满足条件时,作业中的存储过程将插入到徽章/ etc表中。

触发器将是另一种选择,但它们的执行不能延迟多个用户的范围。

+0

您将如何设置标准?每个徽章是否需要不同的方法? – RyanJM 2010-12-21 01:33:05

+0

@RyanJM:是的,每个徽章都有它自己的存储过程。这样,你可以改变一个,而不会影响其他人 - 单片,超级proc不是一个好主意。 – 2010-12-21 01:58:11

+0

当你说存储过程时,你的意思是在数据库还是模型中?对不起,我试图确保我完全理解如何做到这一点。 – RyanJM 2010-12-21 14:24:36

1

我会想象一些计算是实时的,而其他计算是间歇运行的进程。

例如,当您的答案得到10个upvotes时出现的徽章,可以实时计算,但几乎没有性能影响。

另一方面,对于检查您是否达到日常声望上限x次数的徽章,您可能希望将其作为某种批处理作业,因为您只能在每天结束时进行检查。

关键问题是保持运行速度。堆栈溢出每天会产生数千(甚至数万)的问题,可能有数十万条评论。任何不平凡的计算应该在一个单独的过程中运行。它保持了核心功能的紧凑,有限和清洁,从而实现了高性能。在核心发布系统之外的进程中运行复杂的计算,可以在不影响用户使用该网站的能力的情况下进行。如果任务足够复杂,则可以通过在多台机器上运行相同的进程来进行水平扩展。

+0

那么每个徽章都需要自己的一套方法来贯穿? – RyanJM 2010-12-21 01:31:39

+0

每个徽章可能是它自己的sql查询。即使你可以一次计算多个bades,我不认为它是一个好主意。保持每个单独的计算,因为它在概念上更简单。我确定一些SO开发人员会加入并指出他们是如何实际完成的;) – hvgotcodes 2010-12-21 01:33:39

+0

这将会是一些SO开发人员的愿望。 – RyanJM 2010-12-21 14:26:34

1

这就是我将如何实现它,如果我需要:

我会设置一些队列管理器(也有很多这样的软件)和写的经纪人,将从队列处理消息。每当发生任何事件时,例如:您查看了一个主题,您编辑了您的评论,编辑了您的答案,编辑了其他人的答案,您提出了投票等,等等 - 您将收集一条消息并附带事件描述。是的,这将是真的那里的消息量很大。

当您收集了大量的消息后 - 您可以启动一个代理程序,以便按计划或实时处理消息。

使用此模式,您可以将代理扩展为复杂的徽章,只要您想要。