我正在编写一个实用程序来配置何时自动生成某些报告。
下一篇文章将是一些后台任务(可能是Windows服务),它将轮询数据库以了解何时执行这些重复操作。我想出了这个初始表设计:
ReportScheduler
---------------
AutoID int
MemberID VarChar(6)
ReportID int
RunWhen DateTime
......但很快意识到" RunWhen"是不是要削减番茄酱,因为需要为给定的成员运行多次给定的报告(一旦运行,该值不再有效/有用)。
在展示下一个候选表格设计之前,有关于何时可以完成这些报告(生成并通过电子邮件发送)的说法:配置器可以将它们设置为在每个月的特定日期(1日,10日)运行,17,无论如何)或根据一种模式,即它们可以被设置为类似于每个月的第一个星期二"或者"每个月的最后一个星期五"或者"每周的第一个星期一" (IOW,每周一)。所以我想出了这个:
ReportScheduler
---------------
AutoID int
MemberID VarChar(6)
ReportID int
DayOfMonth int
PatternOrdinal VarChar(6) // First, Second, Third, Fourth, or Last
PatternDOW VarChar(9) // Monday, ... Sunday
PatternInterval VarChar(5) // Week, Month
...但后来意识到这也没有多大意义,因为代码必须运行来计算是否已经达到或超过了每个等于DayOfMonth或Pattern组合字段的日期轮询数据库的时间。然后是什么会阻止它在此之后永远触发?
所以,我认为我需要结合这些想法,但不是RunWhen,而是调用DateTime字段NextExecution,并在每次为给定成员生成报告时更新它:
ReportScheduler
---------------
AutoID int
MemberID VarChar(6)
ReportID int
NextExecution DateTime
DayOfMonth int
PatternOrdinal VarChar(6) // First, Second, Third, Fourth, or Last
PatternDOW VarChar(9) // Monday, ... Sunday
PatternInterval VarChar(5) // Week, Month
当达到或超过NextExecution时间时,服务会生成/通过电子邮件发送报告。然后计算下一次执行的时间(基于DayOfMonth或Pattern *字段)并使用该值更新NextExecution字段。
这对我来说似乎是合乎逻辑的,但我确信这是一个以前遇到的挑战,并且想知道是否有一种标准的方法来实现这一点,可能比我提出的更清洁。
答案 0 :(得分:1)
假设您记录了这些报告的运行时间,您可以使用第二种方法来防止报告多次运行。您可能希望合并某种规则,您只会尝试在“X”天内运行已过期的报告。
另一个潜在的设计是保持一个类似于你的第一种方法的表格,但是当一个人在接下来的10年(或其他足够大的时间跨度)中创建新的时间表时填写它。保留一个表,列出用户创建的计划,并将计划的日期链接回这些计划,以便在用户取消计划时删除它们。您需要决定要对重叠的计划做什么(这两个计划恰好在本月的同一天登陆,并要求运行相同的报告)。你一次或两次运行报告吗?处理方式决定了在用户创建/删除计划时如何围绕维护日历进行编码。