Структура базы данных для научных графиков, сохраняющих предметы - PullRequest
0 голосов
/ 25 февраля 2019

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

Информация о расписании проста, имеет тему, день недели, и начало и конец часа,

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

Я использую инструмент, который помогаетя нарисую календарь, я должен кормить его с начальной и конечной датой.

Так что довольно просто сгенерировать весь календарь в БД.

Другой способ, я думаю, это просто сохранить деИмя дня, часы начала и окончания, а также сгенерировать функцию, которая «подделывает» даты, чтобы я мог загрузить календарь.

Спасибо за чтение, и если я не понял, извините, пожалуйста, прокомментируйте

1 Ответ

0 голосов
/ 27 февраля 2019

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

Дата

  • Дата
  • День недели

Студент

  • Идентификатор
  • Имя
  • И т. Д.

Класс

  • Идентификатор
  • Имя
  • DefaultStartTime
  • DefaultEndTime

ClassMember

  • StudentId
  • ClassId

ClassDefaultMeetingDays

  • ClassId
  • DayOfWeek

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

Затем можно внести изменения изапросите эту таблицу по мере необходимости!

...