用于存储计划/ cron作业的数据库结构?

时间:2018-04-23 04:37:57

标签: mysql database laravel database-design scheduler

我遇到了问题。在应用程序的数据库中,我有一个schedule表,用于存储用户提供的日程表。 E.g

  • 每日
  • 每周
  • 每周两次
  • 每周三(或任何用户选择)的一周
  • 每个月
  • 每月两次
  • 每月x天
  • 一年中每x个月

等等。然后,这些计划将提供参考点以安排不同的任务或识别它们的重复。

我无法想到适合它的数据库结构。我能得到的最好的是有一个包含以下列的表:

然后将指定的计划存储在相关列中并提供类型。 例如,每周可以像1周列和1(重复整数的指定值)或类似的东西。

这种方法的问题是这个表会被非常频繁地使用,并且检索的数据不会很简单。需要计算才能知道调度类型,因此需要复杂的数据库查询来获取每种类型的调度。

如果可以提供任何其他方法,我将在Laravel应用程序中实现它。它是一个SAAS应用程序,具有与计划表相关的大量数据。

非常感谢任何帮助。感谢

1 个答案:

答案 0 :(得分:2)

我建议你向后解决这个问题。

制定几条规则。在您的应用中编码规则,而不是在SQL 中。插入活动时,请在接下来的12个月内预先填写日历以及所有活动。每个月,都要经历所有活动并延长"预填充"再过一个月(13个月)。

现在SELECTs简单快捷。

SELECT ... WHERE date = '...'

有当天的所有事件(假设它在12个月内)。

复杂性在于插入。但据推测,您插入的频率低于您选择的频率。

包含事件定义的表格只会像您的应用程序所需的那样复杂,以确定要执行的操作。也许

start_date DATE,
frequency ENUM('day', 'week', 'month', ...)
multiplier TINYINT, -- this lets you say "every second week"
offset TINYINT,   -- to get "15th of every month"

每周两次将是两个条目。

更好的是,有几个包(在Perl,shell等中)提供了非常丰富的语言来表达事件日期模式。此外,您可以简单地打电话给'它为你做所有的工作!