我需要开发一个支持"schedules"的应用程序。时间表示例:
- 2011年1月1日上午9点
- 2011年1月1日上午9时至10时
- 2011年1月1日起每周一上午9点
- 2011年1月1日至2011年2月1日,每周一上午9点
- 自2011年1月1日起,每周一上午9点,记录10次
- 等。
如果你看过Outlook的调度程序,那基本上就是我需要的。下面是他们的用户界面截图:http://www.question-defense.com/wp-content/uploads/2009/04/outlook-meeting-recurrance-settings.gif
如何在数据库中对这些信息建模?请记住,我还需要对此进行查询,例如:
- 今天安排的活动是什么?
- 一个特定的经常性计划事件的下10个日期/时间是什么?
- 等。
我正在使用PHP/MySQL,但我对其他解决方案开放。建议吗?
我个人的意见是分别创建所有事件,并带有开始和结束日期。然后为事件生成唯一标识符(可能是您创建的第一个事件的事件ID),并将其分配给所有事件(因此您知道它们以某种方式链接)。
优势:
- 很容易做到(您只需计算事件应该发生的时间)并且只创建一次)
- 易于更改(您可以保存也许是第一次的重复)事件,然后重新构建它们(删除并重新创建)
- 易于删除(他们有一个共同的唯一ID)
- 易于查找(同上)
缺点:
- 你需要一个开始和结束日期
——从这里追加——
提出模型:
表事件-
id
big int (auto increment) -
ref_id
big int(这是id的外键) -
date_end
日期 -
title
string - . .
-
saved_recurrence
text
date_start
日期假设你有一个重复4周的事件,每周三和周五:
- 收集对象中的重复内容并将其转换为JSON(重复类型,周期,最终日期,…)
- 计算每个事件的日期
- 用
ref_id
=0和saved_recurrence
=保存的JSON对象在表 event 上创建第一个事件,并获取使用的id(自动递增) - 更新第一条事件记录并设置
ref_id
=id - 始终使用相同的
ref_id
创建下一个事件(saved_recurrence
在这里可以为空)
你现在应该有8个事件(每周2个,持续4周)具有相同的ref_id
。这样就很容易获取任何日期间隔内的事件。当您需要编辑事件时,只需检查ref_id
即可。如果0,这是一个单独的孤立事件。如果没有,你有一个ref_id,你可以搜索得到所有的事件实例。