Rob*_*nik 6 t-sql scheduling sql-server-2008-r2
我有一个应用程序,用户可以在其中设置特定日期范围内特定实体的时间表。日程编辑与输入日历约会类似:
我想将 2011 年 1 月的周末日程安排为上午 7 点至下午 5 点。
然后我还会输入一个与现有时间表重叠的新时间表,但仅适用于一月上半月:
我可以将每天的时间表存储在一个表中,例如:
create table EntitySchedule (
EntityID int not null
references Entity(EntityID),
ForDay date not null,
StartAt time not null,
EndAt time not null
)
Run Code Online (Sandbox Code Playgroud)
但我会在这个表中得到很多记录:
每个计划的记录数=(实体记录数)*(计划范围内的天数)
或者我可以存储类似于输入数据的数据:
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)
)
Run Code Online (Sandbox Code Playgroud)
该表的记录比前一张表少很多。
它们中的每一个(按天表和按时间表)都有其优点和缺点:
不要将其视为我们从个人日历中得知的平常日历约会。而是将其视为非常灵活的商店/商店(实体)营业时间(时间表)。因此,我的数据库将包含许多商店,并且它们的营业时间非常灵活,通常每周重复一次。
编辑时间表通常是覆盖现有数据,因此当定义的日期范围内的开放时间已经存在时,我们不会真正更新现有的时间表定义,而是创建一个新的时间表定义来覆盖现有的时间表定义。如果有每天的时间表,这非常简单。我只是覆盖适用于新计划日期范围的那些日子。
但对于每个调度表来说,这变得更加复杂:
第一个似乎是更好的方法。但是获取日期范围的时间表的查询变得相当复杂,并且可能不是很快。想象一下获取 2011 年 1 月的实体时间表。读取数据应始终以每日表格的形式生成结果。
有没有保存时间表数据的标准方法?您建议我如何保存这些数据?
我曾多次与这个问题作斗争。我认为最好的方法是简单地将开始日期/时间和结束日期/时间存储为开始和结束的单个字段,或者按照您的建议存储为日期和单独的时间字段。
我认为这是最灵活的,尽管它需要在应用程序层进行更多计算以实现重叠的时间表等,但它是所有替代方案中“最不坏”的。但我不确定这是标准方式。
附:我曾经实现过一个系统,其中一年中的每一天都有一个表中的记录,并且一个单独的表存储了当天使用的所有时间表,但它变得比它的价值更麻烦,因为它还需要在应用程序层上进行大量编码,但在不同的地方。我认为使用日期/时间是最好的解决方案。
| 归档时间: |
|
| 查看次数: |
8343 次 |
| 最近记录: |