重复基于事件日历 - 数据库设计

时间:2011-02-21 02:34:17

标签: sql-server

我有类似的问题:How to best handle exception to repeating calendar events

我的问题是关于数据库设计。

我有一些事件无限期地运行,但有时结束日期已知。让我们说我正在制作一个服用一种药物的事件,所以我知道什么时候开始,但我不知道什么时候需要停药,这将取决于进展和医生的建议。

现在有趣的是,虽然我会在特定时间每天服药,但有一天它可以改变(时间,剂量等)。

因此,我将有一个表存储药物名称,剂量,开始日期等。

问题: 1.每天是否有实物记录[由于特定日期需要更改]。但如果我们开始为每个日期存储,可能会有数百万的记录。

  1. 或者,我可以对用户更改详细信息的日期有例外。

  2. 或者我可以创建6个月的记录,当时间越来越近时,如果事件仍在进行,用户可以增加或系统会自动增加。

  3. 我想知道Google日历如何处理不确定的重复。

    您的建议将不胜感激。

    的Pankaj。

2 个答案:

答案 0 :(得分:2)

我会制作一张有各种可能条件的表格:

table repetition (
  event_id int foreign key,
  first_date date not null,
  last_date date not null,
  day_period int null, -- 3 = every 3 days
  day_of_month int null, -- 1..31
  -- day_of_week int null, -- 0..6, if needed
  -- whatever else
)

现在您可以轻松选择今天发生的事件:

select event.*
from repetition
where
  -- (day_of_week is null or day_of_week = :current_day_of_week) and
  (day_of_month is null or day_of_month = :current_day_of_month) and
  (day_period is null or (:current_date - first_date) mod day_period = 0) and
  first_date <= :current_date and
  last_date >= :current_date
join event on event.id = event_id

索引(first_date,last_date)将使查询计划足够有效(索引范围扫描)。

要使范围“无限期”,只需将last_date放在未来,例如3000年。

要处理事件中的“单个”更改,您可以向change_of表添加event列,并将其引用回event.id。对于常规事件,它为null。对于更改事件,它存储change_of指向的事件的重写信息。如果您为当天获取两个事件,其中一个事件change_of指向另一个事件,则使用覆盖事件记录中的数据,并忽略change_of引用的记录。对于一次性更改,last_date = first_date

这也允许添加定期更改,这可能很有用(每隔一天定期处方,每14天更换一次),以及更改的更改,您可能会通过输入逻辑或触发器来避免这些更改。

答案 1 :(得分:1)

似乎最好存储下一个事件的时间以及有关重复频率的信息。

示例:

Next event: 2011-02-21 08:15
Repeats: Weekly (or any other format you deem appropriate)

&#34;下一个活动&#34;需要在时机成熟时增加。

要检查事件是否为今天,您要检查NOW =&#34;下一个事件的第一部分&#34;