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

我有一个应用程序,用户可以在某个日期范围内为某个实体设置时间表。日程编辑类似于输入日历约会:

  • 开始和结束时间(小时)
  • 开始日期和设置每周重复天数(即每个星期六和星期日或仅每个星期日)
  • 定期结束日期-设置定期结束的日期
例子 我想把2011年1月的周末安排在早上7点到下午5点

  • 我将开始日期设置为2011年1月1日
  • 将结束日期设置为2011年1月31日
  • 我设定7点开始,17点结束
  • 在每周重复掩码上启用星期一
  • 然后,我还将输入一个与现有时间表重叠的新时间表,但仅限于1月上半月:

  • 设定开始日期:2011年1月1日
  • 设定结束日期:2011年1月14日
  • 设定时间从9:00到15:00
  • 启用星期一
  • 问题: 我可以将每天的日程安排存储在如下表格中:

    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)
    )
    
    此表的记录将比上一个表少得多

    比较 每种方法(每天表和时间表)都有其优缺点:

  • 每天表将很容易获得特定一天的时间表
  • 每天计划将无法编辑重复数据,您将始终输入覆盖现有数据的新计划
  • 几年后,每天的表将有大量的记录,这些记录必须减少
  • 在每个时间表的情况下,不经过计算就不可能得到某一天的时间表
  • Per schedule table允许将计划从一个日期范围复制到另一个日期范围,这将是一个非常受欢迎的功能,通过从不同的日期范围导入计划数据并将其应用到新的日期范围,可以简化创建计划的过程
  • 使用场景 不要认为这是我们从个人日历中知道的常规日历约会。而是将其视为非常灵活的商店/实体的营业时间(时间表)。因此,我的数据库将有许多商店,他们有非常灵活的开放时间,通常每周重复

    编辑时间表通常是覆盖现有数据,因此当定义日期范围内的开放时间已经存在时,我们不会真正更新现有时间表定义,而是创建一个覆盖现有时间表的新时间表定义。如果有每天的时间表,这是非常简单的。我只会覆盖那些适用于新计划日期范围的日期

    但对于每个计划表,这变得更加复杂:

  • 我可以在表中插入一条新记录,然后在阅读某一天的日程表时,最新记录获胜(类似后进先出的方法)。这意味着每次读取(选择)计划都将包含一个更复杂的查询,其中我必须返回与特定实体相关的所有记录,这些实体定义了正确范围内的日期,然后返回最后一个记录。这对于获得某一天的日程安排很好,但当我想要一个日期范围的日程安排时,这会让我的生活变得艰难
  • 定义的计划范围不会重叠,当我插入一个新的计划范围时,也可能意味着现有的计划定义(或其中的许多)应该更改,甚至拆分为两个
  • 第一种方法似乎更好。但查询获取日期范围的时间表变得相当复杂,而且可能不是很快。想象一下获得2011年1月的实体计划读取数据应始终以每天表格的形式产生结果。

    问题:
    是否有保存计划数据的标准方法?您认为我应该如何保存这些数据?

    我已经多次解决这个问题。我认为最好的方法是简单地将开始日期/时间和结束日期/时间存储为开始和结束的单个字段,或者按照您的建议存储为日期和单独的时间字段

    我认为这是最灵活的,虽然它需要在你的应用层对重叠的时间表等进行更多的计算,但它是所有备选方案中“最不坏”的。我不确定这是不是一种标准的方式


    另外,我曾经实施过一个系统,在这个系统中,一年中的每一天都有一个记录在一个表中,一个单独的表存储了当天使用的所有日程安排,但它只是变得比它的价值更麻烦,因为它也需要在应用层上进行大量编码,但在不同的地方。我认为使用日期/时间是最好的解决方案。

    我不知道存储日程数据的任何标准方法

    我将使用您的第二种方法—存储创建计划所需的数据,因为这是用户定义的(例如,考虑如何从“每天”表加载数据,以便允许用户编辑他们的计划—这将很棘手!)

    我会在上面的表中添加一个“Last Run”字段,然后根据您将如何使用此字段,添加一个“Next Run”,它将使用行中的其他信息来计算此计划事件下次发生的时间。这将允许您从数据库中执行“获取今天发生的所有事件”

    编辑:既然您已经澄清了关于开放时间的问题(您需要能够列出未来发生的日程安排),而不是我对任务调度器的假设,您只需要“下一次运行”时间,那么“下一次运行”字段就没那么有用了

    不过,我还是会选择存储时间表数据,因为这实际上是商店将定义的(他们会说“我们希望在工作日9-5点之间营业”,而不是“我们将在下周一、周二、周五9-5点营业”