Database design 调度任务的数据库表设计

Database design 调度任务的数据库表设计,database-design,database-schema,Database Design,Database Schema,我希望能够创建基于固定日期、每天重复、每周特定日期重复、每年特定月份重复、每年特定日期重复和每天特定时间重复的计划 请问我如何着手为这个问题构建数据库表 编辑#1 基本上,我正在编写一个应用程序,允许用户计划在不同的预配置时间发送预配置的问候语。我知道我需要一个表格来存储有关日程安排的信息(例如圣诞节、市场营销计划等等,以及日程安排应该运行的时间)。然后是另一个表,用于记录运行了什么计划、发送了什么问候语、发送给谁以及发送了什么电子邮件;基本上是一个事务表 我的问题是设计日程表,因为我希望允许用

我希望能够创建基于固定日期、每天重复、每周特定日期重复、每年特定月份重复、每年特定日期重复和每天特定时间重复的计划

请问我如何着手为这个问题构建数据库表

编辑#1

基本上,我正在编写一个应用程序,允许用户计划在不同的预配置时间发送预配置的问候语。我知道我需要一个表格来存储有关日程安排的信息(例如圣诞节、市场营销计划等等,以及日程安排应该运行的时间)。然后是另一个表,用于记录运行了什么计划、发送了什么问候语、发送给谁以及发送了什么电子邮件;基本上是一个事务表

我的问题是设计日程表,因为我希望允许用户在特定日期、一周中的特定日期(重复出现)、每月的特定日期、每天的特定时间以及每年的特定日期/月(例如25/12)运行日程


如何创建一组时间表表格,以灵活的方式处理这些输入?

这是我提出的表格结构

Schedule
 - ScheduleName
 - ScheduleTypeId (Daily, Weekly, Monthly, Yearly, Specific)
 - StartDate
 - IntervalInDays
 - Frequency
 - FrequencyCounter

ScheduleDaily
 - ScheduleDailyId 
 - ScheduleId
 - TimeOfDay
 - StartDate
 - EndDate

ScheduleMonthly
 - ScheduleMonthlyId
 - ScheduleId
 - DayOfMonth
 - StartDate
 - EndDate

ScheduleSpecific
 - ScheduleSpecificId
 - ScheduleId
 - SpecificDate
 - StartDate

...

ScheduleJob
 - ScheduleJobId
 - ScheduleId
 - ScheduleTypeId
 - RunDate
 - ScheduleStatusId

Microsoft SQL Server有一个高效灵活的设计:

我已经通读了上面的答案,我认为很多事情都是不必要的,如果我错了,请纠正我

以下是我认为应该做的:

时间表


  • 身份证

  • 类型(每日、每月、每周、固定、每年)-枚举

  • 频率(可以是1-7[周天数]、1-30(或28[月天数]、1-365[年天数]或null(用于每日固定)-数组字段(整数)-(1,7]或[23]或[235]或null

  • 时间(UTC中的时间)-数组字段(由字符字符串组成-['9:00','13:30']

  • 日期(固定类型)-日期时间-2009-03-21

  • 是否处于活动状态(布尔)-用于启用、禁用计划

  • 名称(CharField)-如果要命名计划

其余字段将需要您正在构建的内容的上下文

现在,为此,我考虑每30分钟运行一次cronjob(我使用30分钟分隔的时间输入),它运行一个脚本(在我的例子中是django管理命令),从这个表中筛选需要运行的计划:

查询内容如下:

current_day_of_week = 3
current_day_of_month = 24
current_day_of_year = 114
current_time = 13:30
current_date = 2019-04-24

Filter records that match the below query(not even psuedo code)(I'm using Q objects(https://docs.djangoproject.com/en/2.2/topics/db/queries/#complex-lookups-with-q-objects)

Q(daily AND current_time) OR
Q(weekly AND current_day_of_week AND current_time) OR
Q(monthly AND current_day_of_month AND current_time) OR
Q(yearly AND current_day_of_year AND current_time) OR
Q(fixed AND current_date AND current_time)
Schedules

 - Id :int
 - Greetingid :int
 - Startdate :date
 - Frequencytype :char(1)
 - Frequencyinterval :int
 - Timeofday :time

我认为公认的答案比它需要的复杂得多。这可以通过一个表来完成,如下所示:

current_day_of_week = 3
current_day_of_month = 24
current_day_of_year = 114
current_time = 13:30
current_date = 2019-04-24

Filter records that match the below query(not even psuedo code)(I'm using Q objects(https://docs.djangoproject.com/en/2.2/topics/db/queries/#complex-lookups-with-q-objects)

Q(daily AND current_time) OR
Q(weekly AND current_day_of_week AND current_time) OR
Q(monthly AND current_day_of_month AND current_time) OR
Q(yearly AND current_day_of_year AND current_time) OR
Q(fixed AND current_date AND current_time)
Schedules

 - Id :int
 - Greetingid :int
 - Startdate :date
 - Frequencytype :char(1)
 - Frequencyinterval :int
 - Timeofday :time
Frequencytype将是以下值之一

  • “O”=一次
  • “D”=每日
  • “W”=每周
  • 'M'=每月
  • “A”=每年
Frequencyinterval将是数字,该值的含义取决于frequencytype的值

  • 如果type='Once',那么value=0(无间隔)计划将在startdate执行
  • 如果类型=‘每日’,则值=#天间隔
  • 如果类型为“每周”,则一周中的某一天为1到7
  • 如果类型为“每月”,则1到31为每月的第几天
  • 如果类型为“每年”,则一年中的某一天为1到365

您可以从一个简单的表开始,使用下面的通用模式来存储调度(PostgreSQL)。
创建表格明细表(
id序列唯一,--作业的唯一标识符
name varchar(64)非空,--作业的人类可读名称
描述文本,--有关作业的详细信息
schedule varchar(64)NOT NULL,--作业计划的有效CRON表达式
handler varchar(64)非空,--表示作业处理程序的字符串
args text NOT NULL,--作业处理程序的参数
enabled boolean NOT NULL默认值为TRUE,--是否应运行作业
已在时间戳处创建\u非空,--作业是何时创建的
在时间戳非空时更新\u,--作业何时更新
开始日期时间戳,-作业在此时间之前不应运行
结束日期时间戳,-作业不应在此时间之后运行
上次触发时间戳处的上次触发时间,--上次触发作业的时间是什么时候
MetaJSON——作业的附加元数据
);

您不能使用内置的调度程序吗?大多数RDBMS都有这些,您不必重新发明轮子。数据库中是否也应该表示“执行”(以及如何表示?)或者只是计划?@BrankoDimitrijevic是的,应该是这样。@Ben我可以试试,但我想存储自定义信息,如果我能有一个表设计来解决我的问题,我会更喜欢。为了让你的工作更简单,你可以使用现有的计划程序来进行计划部分。在Java中,例如Quartz或我自己编写的库。
db scheduler
易于嵌入,并对定期计划(固定持续时间、每日等)中的任务提供现成的支持。执行时间保存在一个数据库表中,因此在重新启动后仍然有效。您好!我喜欢这个解决方案。仅此一次,您如何有效地检查日期时间重叠?例如,考虑到这一点,在该时间内只能运行一个任务。