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

Met*_*ani 2 mysql database database-design scheduler laravel

我遇到了一个问题。在应用程序的数据库中,我有一个schedule表,用于存储用户提供的时间表。例如

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

等等。然后,这些时间表将提供参考点来安排不同的任务或确定它们的重复性。

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

  • 星期
  • 类型

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

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

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

任何帮助将不胜感激。谢谢

Ric*_*mes 7

我建议你倒退解决这个问题。

制定几个规则。在您的应用程序中编写规则,而不是在 SQL 中。插入事件时,在接下来的 12 个月内将所有发生的事件预先填充到日历中。每个月,完成所有事件并将“预填充”延长到另一个月(13 个月后)。

现在SELECTs简单快捷。

SELECT ... WHERE date = '...'
Run Code Online (Sandbox Code Playgroud)

拥有当天的所有事件(假设是在 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"
Run Code Online (Sandbox Code Playgroud)

每周两次将是两个条目。

更好的是,有几个包(在 Perl、shell 等中)提供了一种非常丰富的语言来表达事件日期模式。此外,您可以简单地“调用”它来为您完成所有工作!