Как можно представить запланированные события в РСУБД?

StackOverflow https://stackoverflow.com/questions/1016170

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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 - но вы Вам нужно будет больше работать, учитывая выходные и праздничные дни!).

Другие советы

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

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

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

scroll top