数据库设计:时间表,包括复发


Database Design: schedules, including recurrence

我需要开发一个支持"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_start 日期
  • date_end 日期
  • title string
  • . .
  • saved_recurrence text

假设你有一个重复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,你可以搜索得到所有的事件实例。