iCal 后端 - 重复日期


iCal backend - recurring dates

我正在使用FullCalendar作为前端构建一个日历系统。后端将是MySQL/PHP。

它将存储由应用程序生成和插入的用户的公共约会列表。这些约会将是一个单一的事件,将在同一天开始和结束。此外,由于个人承诺,用户将能够在日历中标记他们的不可用。后一种功能需要使用重复事件。与其重新发明轮子,我一直在考虑使用基于 iCal 的结构。这篇文章在确定数据库结构方面非常有帮助。

我已经创建了申请表,允许用户输入必要的数据,以便存储私人的单一/定期约会。提交表单后,数据将通过 Ajax 发送到服务器。我找到了一个很棒的 PHP 脚本,它根据用户输入的参数生成重复日期数组,无论是以本机格式还是使用 RRULE。

我不确定存储/检索这些重复日期的最佳方法是什么。应用程序需要能够为用户呈现日历视图,包括公共和私人日期。例如,应用程序还需要能够返回在给定时间/日期时间段内可能空闲的所有用户。

以 iCal 格式存储所有事件并能够根据需要检索事件是否足够?我预见的问题是重复事件不容易搜索,因为它们的参数必须动态扩展?我正在考虑为每个单独的事件(如生成)创建第二个表,并引用创建它的原始 RRULE。我希望限制用户可能输入的重复日期的数量,以防止用户在接下来的 100 年内每天都输入事件!我认为这种方法也可以编辑最初由重复规则创建的单个事件。

这是一个好方法,还是有更好的方法?

看看在构建日历应用程序时,我应该在数据库中存储日期还是重复规则?

您应该存储与有效性信息相关的 rrule、exrule、rdate 和 exdate(以便能够跟踪随时间推移的变化:例如,如果您的用户可能想要回顾过去发生特定事件的时间点,以及 rrule 是否在发生和他/她回顾的时间点之间发生了变化),对于发生次数有限的事件,请预先计算时间窗口的开始和结束,以便于查询,并具有滚动窗口,您可以在表中显示所有事件的发生次数。当用户查找时间窗口之外的事件时(很少有人查看一年以上或未来一年以上),您可以计算特定于用户请求的时间窗口的相关事件,并动态生成它们。

以下行的表格怎么样:

CREATE TABLE RecurringAppointments (
    startdate DATE NOT NULL,
    enddate   DATE,
    freq      INT  NOT NULL, -- contains #days between each occurrence
    -- etc.
 )

然后,要获取给定thedate上发生的所有此类约会,请执行以下操作:

SELECT * FROM RecurringAppointments
WHERE
      thedate BETWEEN startdate AND enddate
  AND DATEDIFF(thedate, startdate) % freq = 0;