Разработка структуры БД для планирования почты

Мне нужно спроектировать структуру базы данных для составления календарного отчета. До сих пор я выдвигал этот дизайн следующим образом:

    **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.

Другие вопросы по тегам