我正在构建一个使用FullCalendar作为前端的日历系统。后端将是MySQL / PHP。
它将存储由应用程序生成和插入的用户的公共约会列表。这些约会将是一个单一的活动,将在同一天开始和结束。此外,由于个人承诺,用户将能够在日历中标记其不可用性。后一种功能需要使用重复发生的事件。我一直在寻找使用基于iCal的结构,而不是重新发明轮子。这篇文章在确定数据库结构时非常有帮助ical-field-list-for-database-schema-based-on-ical-standard。
我创建了申请表,允许用户输入必要的数据以存储私人单一/定期约会。提交表单后,数据将通过Ajax发送到服务器。我找到了一个很棒的PHP脚本,它根据用户输入的参数生成一个循环日期数组,无论是以原生格式还是使用RRULE。
我不确定存储/检索这些重复日期的最佳方法是什么。应用程序需要能够为用户呈现日历视图,包括公共日期和私人日期。该应用程序还需要能够返回例如在给定时间/日期期间可以免费的所有用户。
以iCal格式存储所有事件是否足够,并且能够根据需要检索事件?我预见的问题是重复事件不容易搜索,因为它们的参数必须在运行中扩展?我正在考虑创建每个单独事件的第二个表(生成),并引用回创建它的原始RRULE。我希望限制用户可以输入的重复日期的数量,以防止用户在接下来的100年中每天都参加活动!我认为这种方法也可以用来编辑最初由重复规则创建的单个事件。
这是一个好方法,还是有更好的方法?
答案 0 :(得分:1)
表格如下:
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;
答案 1 :(得分:1)
查看when building a calendar app, should i store dates or recurrence rules in my database?。
您应该存储与有效性信息相关联的rrule,exrule,rdate和exdate(以便能够跟踪一段时间内的变化:例如,如果您的用户可能希望在他们发生特定事件时回顾过去,以及当他/她回头看时,rrule在出现的时间点之间发生了变化, 对于具有有限数量的事件的事件,为时间窗口预先计算开始和结束以便于查询,并且具有滚动窗口,您可以在其中显示表中所有事件的发生。当用户在时间窗口内查找出现时(很少有人看到一年以上或将来超过一年),您可以计算特定于用户请求的时间窗口的相关事件并在运行中生成它们