Дизайн базы данных для повторяющихся событий календаря с бесконечностью

С точки зрения базы данных, какова лучшая реализация / дизайн, учитывая следующее:

  1. Повторяющиеся события календаря, которые бесконечны (без даты окончания)? Очевидно, что нет смысла заполнять записи базы данных для каждого события!

  2. Каков наилучший подход к редактированию отдельного события, нарушающего правило повторения, после создания повторяющихся событий? Например, "Каждый понедельник в 9:00", но есть один конкретный понедельник, который должен начинаться в 10:00.

1 ответ

Трудно предложить изменения в схеме без каких-либо подробностей, но здесь есть один способ. То, что у вас есть, - это запись, которая гласит: "С этой даты и далее время встречи в этот день в это время".

EffDate    DOW   Time
01/01/2017 Mon   0900
03/14/2017 Mon   1000
03/21/2017 Mon   0900

Начиная с первого дня расписания, 1 января, встреча состоится в понедельник в 9 часов утра. Затем, начиная со вторника до его вступления в силу, встреча в следующий понедельник (20-го) будет в 10 утра. Начиная с 21-го, время встречи возвращается к 9 утра.

Запрос на выполнение этой работы выглядит немного сложнее, но следуйте логике, и это должно быть очевидно.

select  Dow "Day of meeting", Time
from    MeetingSchedule ms
where   ms.EffDate =(
        select  Max( ms1.EffDate )
        from    MeetingSchedule ms1
        where   ms1.EffDate <= Today()
        );

Если этот запрос выполняется в любое время с 1 января или до 14 марта (то есть во вторник), в понедельник в 9:00 будет отображен результат возврата. Начиная со следующего дня и в течение всей недели возвращение будет показываться в понедельник в 10:00. Затем, начиная со следующего дня (и с тех пор), время снова покажет 9 утра.

Конечно, вы можете знать, какое время будет в любой понедельник. Дата перейдет в переменную, которая заменит функцию, возвращающую дату выполнения.

select  :DateOfInterest "Week starting", Dow "Day of meeting", Time
from    MeetingSchedule ms
where   ms.EffDate =(
        select  Max( ms1.EffDate )
        from    MeetingSchedule ms1
        where   ms1.EffDate <= :DateOfInterest
        );

Предполагая, что вы проходите цикл, генерирующий даты последовательных воскресений, результат будет выглядеть следующим образом за март месяц:

Week starting   Day of meeting Time
   03/05/2017   Mon            0900
   03/12/2017   Mon            0900
   03/19/2017   Mon            1000
   03/26/2017   Mon            0900

Но правильный ответ будет дан на любую дату после последней встречи до изменения даты самой встречи. Если с этого момента время будет меняться на 10:00, просто удалите последний ряд, который вернет его к 9:00.

Я добавил "День недели", но вы можете не упоминать об этом, если знаете, что встреча будет абсолютно всегда в понедельник.

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