Дизайн таблицы базы данных для задач планирования

Я хочу иметь возможность создавать расписания, которые могут быть выполнены на основе фиксированной даты, повторяемой ежедневно, повторяемой в определенный день недели, повторяемой в конкретный месяц года, повторяющейся в конкретную дату каждый год, и повторяется в определенное время суток.

Как мне приступить к созданию таблиц базы данных для этой проблемы?

Изменить # 1

В принципе, я пишу приложение, которое позволяет пользователям планировать предварительно настроенные приветствия, которые будут отправляться в различные предварительно настроенные времена. Я знаю, что мне нужна таблица, в которой хранится информация о расписании (например, Рождество, маркетинг,... и когда график работы должен выполняться). Затем еще одна таблица, чтобы записать, какое расписание запускалось, какое приветствие было отправлено, кому и по электронной почте; в основном таблица транзакций.

Моя проблема заключается в разработке таблицы Schedule, потому что я хочу разрешить пользователям запускать расписание в определенную дату, в определенный день недели (повторяющийся), в определенный день каждого месяца, в определенное время каждый день, и в определенный день/месяц (например, 25/12) каждый год.

Как я могу создать набор таблиц для расписания, которые будут осторожно позаботиться об этих входах?

Ответ 1

Это структура таблицы, с которой я столкнулся:

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

Ответ 3

Поскольку вы говорите о расписаниях, я предполагаю, что вы хотите создать пакетное приложение для управления и выполнения заданий.

Вы можете проверить spring пакетный метаданные для ссылочной реализации. Однако точный дизайн будет зависеть от вашего требования. Это всего лишь указатель.

Ответ 4

Я прочитал ответы выше, и я думаю, что многие вещи не нужны, поправьте меня, если я ошибаюсь.

Вот что я думаю должно быть сделано:

График


  • Я бы

  • тип (Ежедневно, ежемесячно, еженедельно, фиксированный, годовой) - Enum

  • частота (может быть 1-7 [дни недели], 1-30 (или 28) [дни месяца], 1-365 [дни года] или ноль (для ежедневных, фиксированных) - ArrayField (из целых чисел) - [ 1, 7] ИЛИ [23] ИЛИ [235] ИЛИ null

  • время (время суток в UTC) - ArrayField (из строк Char - ['9:00', '13: 30 ']

  • дата (для фиксированного типа) - datetime - 2009-03-21

  • is_active (boolean) - для включения, отключения расписания

  • name (CharField) - если вы хотите назвать расписание

Остальные поля требуют контекста к тому, что вы строите.

Теперь для этого я думаю запустить cronjob каждые 30 минут (я беру время, разделенное на 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)

Ответ 5

Чтобы упростить вашу работу, вы можете использовать существующий планировщик для части планирования. В Java есть, например, Quartz или библиотека, которую я написал сам, db-планировщик.

db-scheduler легко встраивается и имеет встроенную поддержку для задач по регулярному расписанию (фиксированная продолжительность, ежедневно и т.д.). Время выполнения сохраняется в одной таблице базы данных, поэтому оно сохраняется после перезапусков.