数据库设计:计划,包括重复

时间:2011-10-13 22:29:18

标签: php mysql scheduling scheduler

我需要开发一个支持“时间表”的应用程序。时间表示例:

  • 2011年1月1日上午9点
  • 2011年1月1日上午9点至上午10点
  • 每周一上午9点​​,从2011年1月1日起
  • 2011年1月1日至2011年2月1日,每周一上午9点​​
  • 每周一上午9点​​,从2011年1月1日起发生10次

如果您已经看过Outlook的调度程序,那基本上就是我需要的。以下是其UI的屏幕截图:http://www.question-defense.com/wp-content/uploads/2009/04/outlook-meeting-recurrance-settings.gif

我如何在数据库中建模此类信息?请记住,我还需要查询,例如:

  • 今天的预定活动是什么?
  • 特定经常性预定活动的下一个10个日期/时间是什么?

我正在使用PHP / MySQL,但我对其他解决方案持开放态度。建议?

1 个答案:

答案 0 :(得分:3)

我个人的意见是分别创建所有活动,包括开始和结束日期。然后为事件生成唯一标识符(可能是您创建的第一个事件ID)并将其分配给所有事件(因此您知道它们以某种方式链接)。

优点:

  • 易于操作(您只需计算事件何时发生 并且只创建一次)
  • 易于更改(您可以在第一次保存重复 事件,然后重建它们 - 删除并重新创建)
  • 易于删除(它们具有共同的唯一ID)
  • 容易找到(与上述相同)

缺点:

  • 您需要一个结束日期

- 从这里追加 -

拟议模型:

表事件

  • id big int (自动增量)
  • ref_id big int (这是 id 的外键)
  • date_start 日期
  • date_end 日期
  • title 字符串
  • ..您的自定义字段..
  • saved_recurrence 文字

想象一下,每周三和周五有一个重复4周的活动:

  • 收集对象中的重复内容并将其转换为JSON(重复类型,句点,最终日期,......)
  • 计算每个单一事件的日期
  • 使用ref_id = 0和saved_recurrence = 保存的JSON对象在表事件上创建第一个事件并获取 id 使用(自动递增)
  • 更新此第一个事件记录并设置ref_id = id
  • 始终使用相同的ref_id创建下一个事件(此处saved_recurrence可以为空)

您现在应该有8个具有相同ref_id的事件(每周2个,持续4周)。这样,在任何日期间隔中都可以轻松获取事件。当您需要编辑活动时,只需检查ref_id即可。如果它 0 则是一个孤立的事件。如果没有,您有一个ref_id,您可以搜索以获取所有事件实例。