您将如何存储可能的重复时间?
Posted
技术标签:
【中文标题】您将如何存储可能的重复时间?【英文标题】:How would you store possibly recurring times? 【发布时间】:2010-09-30 14:37:49 【问题描述】:我需要存储某事是否发生一次、每天、工作日、每周、一周中的某些天、一个月中的某些天,这可能是数字或符号,例如每个月的第一个星期一,等等。
有什么建议吗?有什么代码、数据结构或架构可供查看吗?
【问题讨论】:
【参考方案1】:有复杂的解决方案和简单的解决方案。两个最简单的解决方案是:
将重复事件扇出到某个恒定数量的实例,或最多某个未来的固定日期范围。为每个指向重复描述的实例存储一个 FKrecurrence_id,并允许批量编辑和取消。
预先计算扇出方法的优势在于它可以非常轻松地实现重复异常,这几乎肯定是您收到的第一个功能请求。
在显示时计算。计算机速度很快,根据您希望能够回答的有关数据的问题,计算一个日期范围内的所有事件通常很容易。您可以聪明地尝试在进行重复计算之前快速将您的日期范围括起来,或者您可以从开始日期开始强制执行。
除此之外,您只需要一个用于存储重复规则的解决方案,该规则适用于您用于计算重复的任何内容。 (例如,如果您使用 iCalendar 启用库,则您的架构是 varchar(255),其中包含 RRULE 值)
如果您必须推出自己的重复周期计算器,并且希望保持简单,则将重复周期限制为每天、每周、每月或每年涵盖您的前 80% 用例,并且非常容易计算。
此时您的潜在重复模式如下所示:
id
recurrence_start
recurrence_end
type (daily|weekly|monthly|yearly)
day_of_week (for weekly)
month
day_of_month
坦率地说,复杂的解决方案可能不值得:)
【讨论】:
嘿 kellan,在使用您提供的重复模式时,您将如何实现事件的范围(开始和结束日期)?有任何想法吗?我在设计这样的东西时遇到了很多麻烦。谢谢!【参考方案2】:Martin Fowler 写了a really great paper 关于这个。您可以在runt(一个用于处理时间表达式的 Ruby 库)中找到他所讨论的许多相同的想法。
【讨论】:
Fowler 的论文清晰易读,但它没有处理规则的例外情况,而 IMO 是这种设计模式的主要问题之一......【参考方案3】:这听起来像是在 Outlook 中的“重复事件”。我将使用一个名为 RecurrenceType 的表来存储每个时间段(每天、每周等)。另一个名为 Event 的表将按键引用 RecurrenceType。然后可以使用标准日期函数计算大多数重复类型的未来日期。
【讨论】:
【参考方案4】:尝试具有调度功能的开源项目?
一些调度接口/定义
https://www.rfc-editor.org/rfc/rfc4791
和
http://en.wikipedia.org/wiki/ICalendar
【讨论】:
【参考方案5】:问题在于指定这样一个区间有无限可能。例如 - “如果日期是偶数,但不是 4,并且该月不是长年的二月,则每隔一个月的第一个星期一”。你愿意走多远?最终,您只需要让用户输入一个布尔表达式,该表达式在事件再次发生的日子里计算为 TRUE。从 UI 的角度来看不是很好。
您应该确定系统的一些限制。一旦你知道了这些,剩下的就应该很容易了——或者至少可以对 SO 负责。 :)
【讨论】:
【参考方案6】:此处描述的架构捕获重复日期
http://github.com/bakineggs/recurring_events_for
【讨论】:
【参考方案7】:a related, useful SO thread 上提到了它,但是如果您碰巧使用 Ruby,它是一个不错的、积极维护的 Runt 替代品是 ice_cube。您没有提到您的存储后端要求是什么,但对于数据库模式,@kellan 和上述线程中的一些是好的开始。
【讨论】:
以上是关于您将如何存储可能的重复时间?的主要内容,如果未能解决你的问题,请参考以下文章