我需要开发一个支持“时间表”的应用程序。时间表示例:
- 2011 年 1 月 1 日上午 9 点
- 2011 年 1 月 1 日上午 9 点到 10 点
- 2011 年 1 月 1 日起每周一上午 9 点
- 2011 年 1 月 1 日至 2 月 1 日每周一上午 9 点
- 每周一上午 9 点,从 2011 年 1 月 1 日开始,出现 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(自增)ref_id
big int(这是 id 的一种外键)date_start
日期date_end
日期标题
字符串- .. 您的自定义字段..
saved_recurrence
文本
假设您有一个每周三和周五重复 4 周的事件:
- 收集对象中的重复内容并将其转换为 JSON(重复类型、周期、结束日期,..)
- 计算每个事件的日期
- 使用
ref_id
=0 和saved_recurrence
=saved JSON object 在表 Event 上创建第一个事件,并且获取使用过的id(自动递增) - 更新第一个事件记录并设置
ref_id
=id - 始终使用相同的
ref_id
创建下一个事件(saved_recurrence
在这里可以为空)
您现在应该有 8 个具有相同 ref_id
的事件(每周 2 个,持续 4 周)。这样就可以很容易地获取任何日期间隔内的事件。当您需要编辑事件时,只需检查 ref_id
。如果它是 0,则它是一个孤立的事件。如果没有,您有一个 ref_id,您可以搜索它以获取所有事件实例。
关于php - 数据库设计 : schedules, 包括重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7761178/