【问题标题】:Database Design: schedules, including recurrence数据库设计:时间表,包括重复
【发布时间】:2011-12-07 08:26:56
【问题描述】:

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

  • 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 的调度程序,那基本上就是我所需要的。这是他们 UI 的屏幕截图:http://www.question-defense.com/wp-content/uploads/2009/04/outlook-meeting-recurrance-settings.gif

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

  • 今天安排了哪些活动?
  • 接下来的 10 个日期/时间对于特定的重复性预定事件是什么?

我正在使用 PHP/MySQL,但对替代解决方案持开放态度。有什么建议吗?

【问题讨论】:

    标签: php mysql scheduling scheduler


    【解决方案1】:

    我个人的意见是单独创建所有事件,并带有开始和结束日期。然后为事件生成一个唯一标识符(可能是您创建的第一个事件 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 对象在表 Event 上创建第一个事件并获取 id已使用(自动递增)
    • 更新第一个事件记录并设置ref_id=id
    • 始终使用相同的ref_id 创建下一个事件(saved_recurrence 在此处可以为空)

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

    【讨论】:

    • 这也很容易做到delete all ocurrences after this one
    • dresende,我不确定我是否完全理解您的解决方案。你能告诉我一个建议的模型吗?
    • @dresende:你能展示一下建议的模型吗?我也在努力解决同样的问题。
    • 这个想法不是将所有重复事件保存在一行中,而是将它们分开保存。要知道这些事件是相互关联的,请在数据库中添加一个附加列(例如“ref_id”),该列指向循环中的基本(或初始)事件。
    • @drum 它应该存储有关用于创建所有实例的重复设置的信息,例如重复周期(每月、每周、每 2 天……)或日期限制、生成事件的数量等。 . 如果你想向用户展示一个编辑表单,这只是必要的,因为你需要向他展示初始配置