Tsql 我(你们)应该如何在数据库中保存计划
我有一个应用程序,用户可以在某个日期范围内为某个实体设置时间表。日程编辑类似于输入日历约会:Tsql 我(你们)应该如何在数据库中保存计划,tsql,scheduling,sql-server-2008-r2,Tsql,Scheduling,Sql Server 2008 R2,我有一个应用程序,用户可以在某个日期范围内为某个实体设置时间表。日程编辑类似于输入日历约会: 开始和结束时间(小时) 开始日期和设置每周重复天数(即每个星期六和星期日或仅每个星期日) 定期结束日期-设置定期结束的日期 例子 我想把2011年1月的周末安排在早上7点到下午5点 我将开始日期设置为2011年1月1日 将结束日期设置为2011年1月31日 我设定7点开始,17点结束 在每周重复掩码上启用星期一 然后,我还将输入一个与现有时间表重叠的新时间表,但仅限于1月上半月: 设定开始日期:20
- 开始和结束时间(小时)
- 开始日期和设置每周重复天数(即每个星期六和星期日或仅每个星期日)
- 定期结束日期-设置定期结束的日期
create table EntitySchedule (
EntityID int not null
references Entity(EntityID),
ForDay date not null,
StartAt time not null,
EndAt time not null
)
但我会在这个表中得到很多记录:
每个计划的记录数=(#实体记录数)*(计划范围内的天数)
或者我可以存储与输入数据类似的数据:
create table EntitySchedule (
EntityID int not null
references Entity(EntityID),
StartRange date not null,
EndRange date not null,
StartAt time not null,
EndAt time not null,
WeekdayMask tinyint not null -- bitmask of days (7 bits)
default (0)
)
此表的记录将比上一个表少得多
比较
每种方法(每天表和时间表)都有其优缺点:
是否有保存计划数据的标准方法?您认为我应该如何保存这些数据?我已经多次解决这个问题。我认为最好的方法是简单地将开始日期/时间和结束日期/时间存储为开始和结束的单个字段,或者按照您的建议存储为日期和单独的时间字段 我认为这是最灵活的,虽然它需要在你的应用层对重叠的时间表等进行更多的计算,但它是所有备选方案中“最不坏”的。我不确定这是不是一种标准的方式
另外,我曾经实施过一个系统,在这个系统中,一年中的每一天都有一个记录在一个表中,一个单独的表存储了当天使用的所有日程安排,但它只是变得比它的价值更麻烦,因为它也需要在应用层上进行大量编码,但在不同的地方。我认为使用日期/时间是最好的解决方案。我不知道存储日程数据的任何标准方法 我将使用您的第二种方法—存储创建计划所需的数据,因为这是用户定义的(例如,考虑如何从“每天”表加载数据,以便允许用户编辑他们的计划—这将很棘手!) 我会在上面的表中添加一个“Last Run”字段,然后根据您将如何使用此字段,添加一个“Next Run”,它将使用行中的其他信息来计算此计划事件下次发生的时间。这将允许您从数据库中执行“获取今天发生的所有事件” 编辑:既然您已经澄清了关于开放时间的问题(您需要能够列出未来发生的日程安排),而不是我对任务调度器的假设,您只需要“下一次运行”时间,那么“下一次运行”字段就没那么有用了 不过,我还是会选择存储时间表数据,因为这实际上是商店将定义的(他们会说“我们希望在工作日9-5点之间营业”,而不是“我们将在下周一、周二、周五9-5点营业”