我有类似的问题:How to best handle exception to repeating calendar events。
我的问题是关于数据库设计。
我有一些事件无限期地运行,但有时结束日期已知。让我们说我正在制作一个服用一种药物的事件,所以我知道什么时候开始,但我不知道什么时候需要停药,这将取决于进展和医生的建议。
现在有趣的是,虽然我会在特定时间每天服药,但有一天它可以改变(时间,剂量等)。
因此,我将有一个表存储药物名称,剂量,开始日期等。
问题: 1.每天是否有实物记录[由于特定日期需要更改]。但如果我们开始为每个日期存储,可能会有数百万的记录。
或者,我可以对用户更改详细信息的日期有例外。
或者我可以创建6个月的记录,当时间越来越近时,如果事件仍在进行,用户可以增加或系统会自动增加。
我想知道Google日历如何处理不确定的重复。
您的建议将不胜感激。
的Pankaj。
答案 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;