php - 数据库设计 : schedules, 包括重复

标签 php mysql scheduling scheduler

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

  • 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/

相关文章:

php - 使用 php 和 jquery 实现喜欢/不喜欢计数器

php - 批准和拒绝 MySQL 和 PHP 不起作用

c++ - 使用来自多个主机线程的不同 OpenCL 命令队列

php - 使用 group by , count , group by , alias 执行高级 sql 查询

php - MsSQL编码问题

php - 如何将 sklearn 代码嵌入到我的 PHP 后端代码中?

php - 制作 JQuery POst 时出现 Not Acceptable 错误

mysql - 将一对多连接响应转换为 Node js中的对象

java - 为什么 ScheduledExecutorService 不公开在特定时间运行的方法

scheduling - 异步EJB调度