Дизайн таблицы базы данных для задач планирования
Я хочу иметь возможность создавать расписания, которые могут быть выполнены на основе фиксированной даты, повторяемой ежедневно, повторяемой в определенный день недели, повторяемой в конкретный месяц года, повторяющейся в конкретную дату каждый год, и повторяется в определенное время суток.
Как мне приступить к созданию таблиц базы данных для этой проблемы?
Изменить # 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
Ответ 2
Microsoft SQL Server имеет эффективный и гибкий дизайн: https://msdn.microsoft.com/en-us/library/ms178644.aspx?f=255&MSPPError=-2147217396
Ответ 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
легко встраивается и имеет встроенную поддержку для задач по регулярному расписанию (фиксированная продолжительность, ежедневно и т.д.). Время выполнения сохраняется в одной таблице базы данных, поэтому оно сохраняется после перезапусков.