Дизайн базы данных для повторяющихся событий календаря с бесконечностью
С точки зрения базы данных, какова лучшая реализация / дизайн, учитывая следующее:
Повторяющиеся события календаря, которые бесконечны (без даты окончания)? Очевидно, что нет смысла заполнять записи базы данных для каждого события!
Каков наилучший подход к редактированию отдельного события, нарушающего правило повторения, после создания повторяющихся событий? Например, "Каждый понедельник в 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.
Я добавил "День недели", но вы можете не упоминать об этом, если знаете, что встреча будет абсолютно всегда в понедельник.