重复发生的事件,如何存储?

Recurring events, how to store them?

我发现之前有人问过一些关于重复发生的事件的问题,但我还没有进入一个接近我需要的问题。我正在努力了解如何处理通知系统的重复事件。

目前我知道两个选项:

  1. 存储其中具有模式的单个事件并即时计算任何未来事件(例如永远重复等)。使用 cron 模式或更好的 RRULE 东西。

  2. 在特定日期之前将所有未来事件存储为单个事件。

我对选项 1 的问题是我需要我的事件来保存一些其他数据,例如确认,如果我有一个重复事件,我可能需要为每个重复发生的事件保存多个确认。这变成了使事情正常进行的令人讨厌的黑客攻击,我什至不想考虑如何处理显示具有其他关联数据的过去和未来事件。

选项 2 更好,因为即使在单个事件中我也可以存储与每个相关的所有额外数据。问题来自于处理未来的事件。首先,如果事件永远重复,那么我应该花多少时间来存储事件。如果用户想要显示尚未生成的未来事件,我是否只做块并即时生成?这个选项也感觉像是一个 hack。

到目前为止,我已经阅读了一些关于 RRULE 的内容,发现我可以将 rrule.js 用于前端,将一些其他包用于后端。

编辑 1:为了更好地说明,我还没有完全准备好使用完整的 iCal 格式标准,我想只使用 RRules。但是,我可能会改变主意,因为我仍在寻找选择。

iCal Vevents 和规则应该如何存储在数据库中?

不清楚您是否只关心 rrule 作为表达重复出现的内容的便捷方式,或者您是否想使用完整的 iCalendar 格式。

假设后者,选项 1 包含在 RFC5545 中:您将存储一个“主”VEVENT,其中包含基本信息以及 RRULE,+ 每个实例的一个 VEVENT,这是基本的“例外”事件,其中每个异常都由其 RECURRENCE-ID 标识。

RFC5545 没有此类事件的任何示例,但 RFC5546 在 https://www.rfc-editor.org/rfc/rfc5546#section-4.4.8 处有一些非常接近的东西(使用 RDATE 而不是 RRULE,不需要 METHOD 属性 但你明白了)。