Разработка структуры БД для планирования почты
Мне нужно спроектировать структуру базы данных для составления календарного отчета. До сих пор я выдвигал этот дизайн следующим образом:
**ReportSchedule**
- ScheduleId
- ReportName
- Subject
- To
- UserId
- Body
- Remarks
**ScheduleDaily**
- Id
- ScheduleId
- StartDate
- EndDate
- SendTime
**ScheduleWeekly**
- Id
- ScheduleId
- StartDate
- EndDate
- SendTime
- DayOfWeek
**ScheduleMonthly**
- Id
- ScheduleId
- StartDate
- EndDate
- SendTime
- MonthOfYear
- DayOfWeek
..................
Я не удовлетворен этим дизайном, и мне нужна отдельная таблица, которая охватывает все параметры (вероятно, которая включает в себя правило повторения). Пожалуйста, предложите!
1 ответ
1. Нормализация
В качестве первого шага, я вижу, что большинство столбцов в Schedule*
таблицы являются общими. Таким образом, вы можете переместить их в ScheduleCommon
Таблица. Но оставь id
столбец позади, который будет PK оставшихся таблиц и FK к ScheduleCommon
стол одновременно. Это делает это отношением IS-A.
Вышеприведенный шаг фактически добавит дополнительную таблицу в вашу схему, но IMHO это необходимый шаг нормализации.
2. Глобализация повторяющегося правила
Я думаю, вы можете заменить повторяющиеся правила в ваших таблицах EveryHours
поле и LastRun
один. Таким образом, вы можете определить, если LastRun
+ EveryHours
пришел в прошлое, и работа должна быть запущена снова (и обновить LastRun
поле).
Вышеуказанное устранит Schedule*
таблицы, так как эти поля являются общими и могут быть перемещены в ScheduleCommon
Таблица. Это оставляет вам только две таблицы.
3. Делая это 1:1
При условии, что в каждом расписании отчетов есть только одно повторяющееся расписание, отношение двух таблиц становится 1:1, и одна может поглощать другую. Но я не думаю, что это так. Давайте рассмотрим пример, который вы предоставили в комментариях: "отправляйте почту каждый понедельник, вторник в 15:00 месяца января". Это не один график, а на самом деле два:
ScheduleId StartDate EndDate EveryHours
ABC 2014-01-06 3:00PM 2014-02-01 3:00PM 192
ABC 2014-01-07 3:00PM 2014-02-01 3:00PM 192
Как вы можете видеть, вам придется поддерживать несколько расписаний для одной и той же задачи, что дает соотношение 1:N.