您将如何存储可能的重复时间?

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 和上述线程中的一些是好的开始。

【讨论】:

以上是关于您将如何存储可能的重复时间?的主要内容,如果未能解决你的问题,请参考以下文章

您将如何迭代地计算 0 到 N 的所有可能排列?

您将如何确定系统中的堆栈是向上还是向下增长? [复制]

在核心数据中存储图像

如何在meanjs中扩展userShema

您将如何构建数据库文件系统 (DBFS)?

您将如何测量一个音频样本中的低音量?