我正在构建一个自定义事件系统,如果你有一个重复的事件,看起来像这样:

事件A从2011年3月3日开始每4天重复一次

or

赛事B从2011年3月1日开始,每两周在周二举行一次

我如何将其存储在数据库中,使其易于查找。如果有大量的事件,我不希望出现性能问题,而且在呈现日历时,我必须遍历每一个事件。


当前回答

虽然建议的解决方案是可行的,但我试图用Full Calendar实现,它需要为每个视图调用超过90个数据库(因为它加载当前、以前和下个月),这让我不太兴奋。

我找到了一个递归库https://github.com/tplaner/When,您只需将规则存储在数据库中,并使用一个查询来提取所有相关规则。

希望这能帮助到其他人,因为我花了这么多小时试图找到一个好的解决方案。

编辑:这个库是PHP的

其他回答

虽然建议的解决方案是可行的,但我试图用Full Calendar实现,它需要为每个视图调用超过90个数据库(因为它加载当前、以前和下个月),这让我不太兴奋。

我找到了一个递归库https://github.com/tplaner/When,您只需将规则存储在数据库中,并使用一个查询来提取所有相关规则。

希望这能帮助到其他人,因为我花了这么多小时试图找到一个好的解决方案。

编辑:这个库是PHP的

我专门为这种情况开发了一种深奥的编程语言。它最好的部分是它是无模式的和平台独立的。你只需要为你的时间表写一个选择器程序,它的语法受到这里描述的一组规则的约束

https://github.com/tusharmath/sheql/wiki/Rules

这些规则是可扩展的,您可以根据想要执行的重复逻辑类型添加任何类型的自定义,而不用担心模式迁移等问题。

这是一种完全不同的方法,它本身可能有一些缺点。

为什么不使用类似Apache cron作业的机制呢?http://en.wikipedia.org/wiki/Cron

对于日历调度,我将使用稍微不同的“位”值来适应标准的日历重复事件-而不是 [星期几(0 - 7),月(1 - 12),月(1 - 31),小时(0 - 23),分钟(0 - 59)]

——我会用 [年(每N年重复一次),月(1- 12),月中的第一天(1- 31),月中的第一周(1-5),周中的第一天(0 - 7)]

希望这能有所帮助。

你举的两个例子很简单;它们可以表示为一个简单的间隔(第一个是4天,第二个是14天)。如何建模完全取决于递归的复杂度。如果上面的内容真的很简单,那么就存储一个开始日期和重复间隔的天数。

然而,如果你需要支持一些事情,比如

事件A从2011年3月3日开始,每月3日重复发生

Or

事件A从2011年3月11日开始在每月的第二个星期五发生

这是一个更复杂的模式。

听起来很像MySQL中存储在系统表中的事件。你可以查看结构并找出哪些列是不需要的:

   EVENT_CATALOG: NULL
    EVENT_SCHEMA: myschema
      EVENT_NAME: e_store_ts
         DEFINER: jon@ghidora
      EVENT_BODY: SQL
EVENT_DEFINITION: INSERT INTO myschema.mytable VALUES (UNIX_TIMESTAMP())
      EVENT_TYPE: RECURRING
      EXECUTE_AT: NULL
  INTERVAL_VALUE: 5
  INTERVAL_FIELD: SECOND
        SQL_MODE: NULL
          STARTS: 0000-00-00 00:00:00
            ENDS: 0000-00-00 00:00:00
          STATUS: ENABLED
   ON_COMPLETION: NOT PRESERVE
         CREATED: 2006-02-09 22:36:06
    LAST_ALTERED: 2006-02-09 22:36:06
   LAST_EXECUTED: NULL
   EVENT_COMMENT: