У меня есть приложение, в котором пользователи могут устанавливать расписания для определенного объекта в пределах определенного диапазона дат. Редактирование расписания будет похоже на ввод календарных встреч:
- когда оно начинается и когда оно заканчивается (часы)
- дата начала и установить еженедельные дни повторения (т. Е. Каждую субботу и воскресенье или только каждый Модай)
- дата окончания повторения - устанавливает дату окончания повторения
Пример
Я бы хотел установить расписание выходных на январь 2011 года с 7:00 до 17:00. * 10101 *
- Я установил дату начала как 1.1.2011
- Установить дату окончания 31.1.2011
- Я начинаю в 7:00 и заканчиваю в 17: 00
- включить понедельник для маски еженедельного повторения
Тогда я бы также ввел новое расписание, которое перекрывает существующее, но только на первую половину января:
- Установить дату начала 1.1.2011
- Установить дату окончания 14.1.2011
- Установить время с 9:00 до 15:00
- Включить понедельник.
Вопрос
Я мог бы хранить расписание на каждый день в виде таблицы:
create table EntitySchedule (
EntityID int not null
references Entity(EntityID),
ForDay date not null,
StartAt time not null,
EndAt time not null
)
Но я получу много записей в этой таблице:
Количество записей в расписании = (Количество записей сущностей) * (количество дней в диапазоне расписания)
Или я мог бы хранить данные, аналогичные введенным данным:
create table EntitySchedule (
EntityID int not null
references Entity(EntityID),
StartRange date not null,
EndRange date not null,
StartAt time not null,
EndAt time not null,
WeekdayMask tinyint not null -- bitmask of days (7 bits)
default (0)
)
В этой таблице будет намного меньше записей, чем в предыдущей.
Сравнение
Каждый из них (за день и за день) имеет свои преимущества и недостатки:
- Для таблицы на день было бы легко получить расписание на определенный день
- В дневном расписании не будет возможности редактировать повторяющиеся данные, вы всегда будете вводить новое расписание, перекрывая существующие данные
- Через несколько лет ежедневная таблица будет содержать огромное количество записей, которые нужно будет уменьшить
- В случае получения таблицы по расписанию расписание на определенный день невозможно без расчета
- Таблица по расписанию позволяет копировать расписание из одного диапазона дат в другой, что было бы очень кстати, что упростило бы создание расписаний, просто импортировав данные расписания из другого диапазона дат и применив их к новому диапазону дат.
Сценарий использования
Не думайте, что это обычные календарные встречи, которые мы знаем из наших личных календарей. Скорее воспринимайте это как очень гибкий график работы магазина / магазина (организации). Поэтому в моей базе данных будет много магазинов, и у них очень гибкий график работы, который обычно повторяется еженедельно.
Редактирование расписаний обычно является перезаписью существующих данных, поэтому, когда часы работы в определенном диапазоне дат уже существуют, мы не будем на самом деле обновлять существующее определение расписания, а скорее создадим новое, которое переопределит существующее. В случае наличия ежедневного графика это очень просто. Я бы просто переписал те дни, которые применимы к новому диапазону дат расписания.
Но в случае таблицы по расписанию это усложняется:
- Я мог бы просто вставить новую запись в таблицу, а затем при чтении расписания определенного дня побеждает самая новая запись (такой подход LIFO). Это означает, что каждое чтение по расписанию (выбор) будет включать в себя немного более сложный запрос, в котором мне придется возвращать все записи, относящиеся к конкретной сущности, которые определяют даты в правильном диапазоне, а затем возвращать последнюю. Это хорошо для получения расписания определенного дня, но усложняет мою жизнь, когда я хочу расписание для диапазона дат ...
- Определенные диапазоны расписания не перекрываются, и когда я вставляю новый, это также может означать, что существующее определение расписания (или многие из них) следует изменить или даже разделить на два.
Первый подход кажется более подходящим.Но запрос на получение графиков для диапазона дат становится довольно сложным и, вероятно, не очень быстрым.Представьте себе, что вы получите график организации на январь 2011 года. Чтение данных всегда должно давать результаты в виде ежедневной таблицы.
Вопрос
Существует ли какой-либо стандарт способ сохранения данных расписания?Как бы вы посоветовали мне сохранить эти данные?