Как можно представить запланированные события в РСУБД? - PullRequest
6 голосов
/ 19 июня 2009

Я должен хранить запланированные события (например, например, в классе), которые можно организовывать еженедельно, ежедневно или ежемесячно. События могут происходить, скажем, каждый понедельник и среду или каждый второй четверг месяца. Есть ли способ сохранить эту информацию в СУБД, которая соответствует 3NF?

РЕДАКТИРОВАТЬ: Это не домашняя работа; Я строю что-то с другом для нашего собственного назидания, и мы хотим это в 3NF.

Если быть точным, я пытаюсь хранить расписания для массового и исповеди в приходах РЦ. Они могут быть запланированы по-разному, например, каждое воскресенье в x раз или каждый вторник в другое время. Иногда это только третья пятница месяца, а другие предлагаются только в определенное время один раз в год. Мне нужно не только хранить эту информацию, но и запрашивать ее, чтобы я мог быстро получить исчерпывающий список доступного времени на следующий день или неделю или что-то еще.

Я полагаю, что строго говоря, 3NF не является обязательным требованием, но для нас было бы легче, если бы это было так, и лучше было бы исправить это с нуля, чем менять нашу схему позже.

Ответы [ 2 ]

2 голосов
/ 19 июня 2009

Чтобы записать правила для "периодического повторения", вы можете черпать вдохновение из формата crontab , за исключением того, что вам не нужны ограничения на минуты и часы, а скорее день недели, день месяца и тому подобное. Поскольку в расписании может быть несколько (например) дней недели, для целей NF вам потребуются типичные промежуточные таблицы, которые используются для представления отношений «многие ко многим», т. Е. Одна с двумя внешними ключами в строке (одна для главной таблицы событий). (по одному на таблицу дней недели) - и, конечно же, для дней месяца и т. п.

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

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

2 голосов
/ 19 июня 2009

Да, я решил эту проблему со своим коллегой следующим образом:

CREATE TABLE [dbo].[Schedule](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [StartDate] [datetime] NOT NULL,
    [EndDate] [datetime] NULL
)

CREATE TABLE [dbo].[ScheduleInterval](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [ScheduleID] [int] NOT NULL,
    [ScheduleIntervalUnitID] [int] NOT NULL,
    [Interval] [smallint] NOT NULL
)

CREATE TABLE [dbo].[ScheduleIntervalUnit](
    [ID] [int] NOT NULL,
    [Name] [varchar](50) NULL
)

INSERT INTO ScheduleIntervalUnit (ID, Name)
SELECT '1' AS [ID], 'Day' AS [Name] UNION ALL
SELECT '2' AS [ID], 'Week' AS [Name] UNION ALL
SELECT '3' AS [ID], 'Month' AS [Name] 

Расписание охватывает промежуток времени, и интервалы происходят в течение этого промежутка времени. Единица интервала расписания определяет продолжительность интервала (дни как в «каждые другие» (2) или «каждый третий» (3) и т. Д.), Неделю (день недели, например, понедельник, вторник и т. Д.) И месяц (календарного года). Используя это, вы можете проводить запросы и логику к вашей базе данных для получения расписаний.

Если ваши графики нуждаются в лучшем разрешении - вплоть до часов, минут, секунд - посмотрите на реализацию Unix cron. Первоначально я пошел по этому пути, но обнаружил, что вышеприведенный подход гораздо более прост и удобен в обслуживании.

Один промежуток времени / даты - например, определенный школьный семестр, начинающийся 9 сентября и заканчивающийся 4 ноября - может содержать несколько расписаний (например, каждый понедельник для класса «Искусство» и «каждый второй день» для Phys Ed - но вы будете нужно больше работать для учета праздников и выходных!).

...