Я полагаю, что следующая нормализованная структура данных:
Дата
Студент
- Идентификатор
- Имя
- И т. Д.
Класс
- Идентификатор
- Имя
- DefaultStartTime
- DefaultEndTime
ClassMember
ClassDefaultMeetingDays
ClassInstance
- ClassId
- StartDateTime
- EndDateTime
Некоторые из этих таблиц не требуют пояснений.Другие, вероятно, нуждаются в некотором пояснении:
ClassMember
У вас есть отношение многие ко многим между учеником и классом (т.е. ученик может посещать несколько классов икласс может иметь несколько учеников) Для этого вам понадобится (таблица соединений) [https://support.airtable.com/hc/en-us/articles/218734758-A-beginner-s-guide-to-many-to-many-relationships]
ClassDefaultMeetingDays
В то время как вы можете хранить информацию, такую как Start и EndВремя в таблице классов, вам фактически понадобится отдельная таблица для хранения дней недели, в которые встречается класс, поскольку это отношение один ко многим.
ClassInstance
Это будет сердце вашего приложения, поскольку именно это вы будете вводить в свое приложение календаря.Преимущество разделения этой таблицы на отдельную состоит в том, что вы можете редактировать ее по мере необходимости.Если вы просто извлекаете его из таблиц Class, Date и ClassDefaultMeetingDays, вы будете повреждены, если класс отменен из-за выходного дня или когда периоды сокращены из-за какого-то специального события.Создание этой таблицы в виде отдельной таблицы позволяет вам заполнять эту таблицу с помощью логики по умолчанию (возможно, с помощью хранимой процедуры?), А затем вы можете предоставить своим пользователям точно настроенный элемент управления для редактирования на специальной основе.
Далее,семестр к семестру, начальные и конечные значения, а также дни недели, вероятно, изменятся для того же класса, скажем, ECON101.Хранение ClassInstances означает, что вы можете редактировать информацию о времени собрания класса без потери исторических данных.
Запрос / хранимая процедура для заполнения записей по умолчанию в таблице:
DECLARE @SemesterStart date
DECLARE @SemesterEnd date
SELECT @SemesterStart = x
SELECT @SemesterEnd = y
SELECT INTO ClassInstance
Date.Date + CAST(Class.DefaultStartTime as datetime) AS StartDateTime
Date.Date + CAST(Class.DefaultStartTime as datetime) AS EndDateTime,
Class.Id AS ClassId
FROM Class
JOIN ClassDefaultMeetingDays
ON ClassDefaultMeetingDays.ClassId = Class.Id
JOIN Date ON
ClassDefaultMeetingDays.DayOfWeek = Date.DayOfWeek
AND Date.Date BETWEEN @SemesterStart AND @SemesterEnd
Затем можно внести изменения изапросите эту таблицу по мере необходимости!