我有一个应用程序,用户可以在特定日期范围内为某个实体设置日程安排。计划编辑与输入日历约会类似:
我想在2011年1月的上午7点到下午5点设定周末时间表。
然后我还会输入一个新的时间表,与现有的时间表重叠,但仅限于1月的上半部分:
我可以在以下表格中存储每天的时间表:
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)
)
此表的记录数比前一个记录少得多。
每一个(每日表和每个时间表)都有其优点和缺点:
不要将此视为我们通过个人日历了解的常规日历约会。而是将其视为非常灵活的商店/商店(实体)营业时间(时间表)。因此,我的数据库将拥有许多商店,并且他们的营业时间非常灵活,通常每周重复一次。
编辑计划通常是对现有数据的覆盖,因此当在已定义的日期范围内的开放时间已经存在时,我们不会真正更新现有的计划定义,而是创建一个覆盖现有计划的新计划。如果有每日时间表,这很简单。我只是覆盖那些适用于新计划日期范围的日子。
但是在每个计划表的情况下,这变得更加复杂:
第一个似乎是一个更好的方法。但是获取日期范围的时间表的查询变得相当复杂,可能不是很快。想象一下获得2011年1月的实体时间表。读取数据应始终以每日表的形式产生结果。
是否有标准方法来保存计划数据?您如何建议我应该保存这些数据?
答案 0 :(得分:0)
我曾几次与这个问题搏斗过。我认为最好的方法是将开始日期/时间和结束日期/时间存储为开始和结束的单个字段,或者按照建议将日期和单独的时间字段存储。
我认为这是最灵活的,虽然它需要在您的应用层进行更多计算以重复计划等,但它是所有备选方案中“最不好的”。我不确定它是一种标准方式。
PS。我曾经实现了一个系统,其中一年中的每一天都有一个表中的记录和一个单独的表存储了当天使用的所有时间表,但它只是变得比它的价值更麻烦,因为它需要在应用层上进行大量编码,但在不同的地方。使用日期/时间我认为是最好的解决方案。
答案 1 :(得分:0)
我不知道存储计划数据的任何标准方法。
我会选择第二种方法 - 存储创建日程所需的数据,因为这是用户定义的(例如,考虑如何从“每日”表加载以便允许用户编辑他们的日程安排 - 这将是棘手的!)。
我会在上面添加一个“上次运行”字段,然后根据你将如何使用它,“下一次运行”Computed Column将使用行中的其他信息计算下次应该发生此预定事件的时间。这将允许您从数据库中“执行今天发生的所有事件”。
编辑:现在你已经澄清了关于开放时间的问题(你需要能够列出日程安排的时间),而不是我假设的在任务调度程序中,您需要的是“下次运行”时间,“下次运行”字段不太有用。
然而,我仍然会存储计划数据,因为这实际上是商店将定义的内容(他们会说“我们希望在工作日的9-5之间打开”,而不是“我们” ll打开9-5下一个星期一,星期二,星期三,星期四,星期五然后下一个星期一......“)。虽然我很欣赏它使一些事情变得更复杂,但存储它并获得实际的日常数据会更准确。您仍然可以使用存储过程或基于表的用户定义函数,以便能够选择日常数据。此实施将再次取决于您的使用场景 - 您是否只想列出每个商店的营业时间,或者您是否希望具有“获取所有在XX上营业的商店?”的功能。