我需要存储是否发生过一次,每天,工作日,每周,一周的某些日子,一月中的某些日子,这可能是数字或符号,例如每个月的第一个星期一,等等。
有什么建议吗?要查看的任何代码,数据结构或架构?
答案 0 :(得分:8)
有复杂的解决方案和简单的解决方案。两个最简单的解决方案是:
将重复发生的事件延伸到某些固定数量的实例,或将来某个固定日期范围。将FK recurrence_id存储到指向重复描述的每个实例,并允许批量编辑和取消。
预先调出扇出方法的优点是可以非常轻松地实现重复异常,这几乎肯定是您获得的第一个功能请求。
在显示时计算。计算机速度很快,根据您希望能够回答的有关数据的问题,计算日期范围内的所有事件通常很容易。您可以很聪明,并尝试在进行重复计算之前快速包围您的日期范围,或者您可以从开始日期强制它。
除此之外,您只需要一个存储重复规则的解决方案,该规则适用于您用于计算重复的任何内容。 (例如,如果您使用的是iCalendar启用库,那么您的架构是varchar(255),其中包含RRULE值)
如果您不得不推出自己的重复计算器,并且希望保持简单,那么将每次,每周,每月或每年的重复次数限制在您的前80%使用案例中,并且非常容易计算。< / p>
此时您的潜在重复架构如下所示:
id
recurrence_start
recurrence_end
type (daily|weekly|monthly|yearly)
day_of_week (for weekly)
month
day_of_month
坦率地说,复杂的解决方案可能不值得:)
答案 1 :(得分:3)
Martin Fowler写了a really great paper这个问题。你可以在runt找到很多相同的想法,这是一个处理时态表达式的Ruby库。
答案 2 :(得分:1)
答案 3 :(得分:1)
这听起来像是一个“反复发生的事件”,例如在Outlook中。我会使用一个名为RecurrenceType的表来存储每个时间段(每天,每周等)。另一个名为Event woud的表按键指向RecurrenceType。然后可以使用标准日期函数计算大多数重复类型的未来日期。
答案 4 :(得分:1)
问题在于指定这样的间隔有无限的可能性。例如 - “如果日期是偶数,那么每隔一个月的第一个星期一,但不是4,而月份不是长年的2月”。你愿意走多远?最终,您只需要让用户键入一个布尔表达式,该表达式在事件要重复的日期计算为TRUE。从UI的角度来看并不是很好。
您应该决定系统的一些限制。一旦你知道了这些,其余的应该很容易 - 或者至少对SO负责。 :)
答案 5 :(得分:1)
此处描述的架构捕获重复日期
答案 6 :(得分:0)
在a related, useful SO thread上提到过,但如果您正好使用Ruby,那么这是一个很好的,积极维护的Runt替代方法ice_cube。你还没有提到你的存储后端要求是什么,但是对于数据库架构,@ kellan和前面提到的一些线程是很好的开始。