我遇到了一个问题。在应用程序的数据库中,我有一个 schedule
表,它将存储用户提供的时间表。例如
- 每日
- 每周
- 每周两次
- 每周的第 3 天(或任何用户选择的一天)
- 每个月
- 一个月两次
- 每个月的 x 天
- 一年中的每 x 个月
等等。然后,这些时间表将提供引用点来安排不同的任务或识别它们的重复性。
我想不出适合它的数据库结构。我能得到的最好的是有一个包含以下列的表:
- 天
- 周
- 月份
- 年份
- 输入
然后将指定的计划存储在相关列中并提供类型。 例如,每周都可以像周列中的 1 和 1(重复整体的指定值)或类似的东西。
这种方法的问题是这个表会被非常频繁地使用,并且检索到的数据不会很简单。需要计算才能知道计划类型,因此需要复杂的数据库查询才能获得每种类型的计划。
如果可以提供任何其他方法,我将在 Laravel 应用程序中实现它。这是一个 SAAS 应用程序,包含大量与计划表相关的数据。
任何帮助将不胜感激。谢谢
最佳答案
我建议您逆向处理问题。
制定几条规则。 在您的应用程序中编写规则,而不是在 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 等中)提供了一种非常丰富的语言来表达事件日期模式。此外,您可以简单地“调用”它来为您完成所有工作!
关于mysql - 用于存储计划/cron 作业的数据库结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49973488/