【问题标题】:How would you store possibly recurring times?您将如何存储可能的重复时间?
【发布时间】:2010-09-30 14:37:49
【问题描述】:

我需要存储某事是否发生一次、每天、工作日、每周、一周中的某些天、一个月中的某些天,这可能是数字或符号,例如每个月的第一个星期一,等等。

有什么建议吗?有什么代码、数据结构或架构可供查看吗?

【问题讨论】:

    标签: time calendar recurrence


    【解决方案1】:

    有复杂的解决方案和简单的解决方案。两个最简单的解决方案是:

    1. 将重复事件扇出到某个恒定数量的实例,或最多某个未来的固定日期范围。为每个指向重复描述的实例存储一个 FKrecurrence_id,并允许批量编辑和取消。

      预先计算扇出方法的优势在于它可以非常轻松地实现重复异常,这几乎肯定是您收到的第一个功能请求。

    2. 在显示时计算。计算机速度很快,根据您希望能够回答的有关数据的问题,计算一个日期范围内的所有事件通常很容易。您可以聪明地尝试在进行重复计算之前快速将您的日期范围括起来,或者您可以从开始日期开始强制执行。

    除此之外,您只需要一个用于存储重复规则的解决方案,该规则适用于您用于计算重复的任何内容。 (例如,如果您使用 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 和上述线程中的一些是好的开始。

            【讨论】:

              猜你喜欢
              • 2019-03-26
              • 1970-01-01
              • 1970-01-01
              • 2012-05-23
              • 2016-11-04
              • 1970-01-01
              • 2010-11-18
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多