Как обрабатывать календарные встречи в MariaDB

#php #sql #database-design #mariadb

#php #sql #database-design #mariadb

Вопрос:

Я использую базу данных (MariaDB) для поддержки школьного календаря на основе PHP. У меня есть таблица Class, в которой, помимо прочего, хранится время начала и продолжительность занятия. И у меня есть еще одна таблица, Teacher, в которой хранится информация об учителе. Только один учитель когда-либо будет назначен классу, и занятия всегда начинаются в час.

Я хочу убедиться, что ни один новый класс не забронирован с конкретным учителем, пока он / она находится в середине другого класса. Если бы занятия длились всего один час, я бы просто ввел УНИКАЛЬНОЕ ограничение для учителя и класса, но поскольку занятия могут длиться более одного часа, я не уверен, как к этому подойти.

Я мог бы, конечно, выполнить проверку в PHP перед ВСТАВКОЙ, но я бы подумал, что лучше спроектировать базу данных так, чтобы классы одного учителя не могли перекрываться. Я просмотрел процедуры SQL, но я не знаком с их использованием, и я не нашел примера, который хотя бы приближался к той проверке, которую мне нужно выполнить здесь.

Может кто-нибудь подсказать, как лучше всего решить эту проблему?

Ответ №1:

Используйте временные интервалы (15 минут), чтобы пометить как учителей, так и классы как занятые.

 -- Teacher TCH exists.
--
teacher {TCH}
     PK {TCH}
  
 -- Class CLS exists.
--
class {CLS}
   PK {CLS}
  
 -- Time slot number SLT, starting at STA is 15 min long.
--
tslot {SLT, STA}
   PK {SLT}


-- data sample
  (SLT, STA)
---------------
  (1, '00:00')
, (2, '00:15')
, (3, '00:30')
, (4, '00:45')
, (5, '01:00')
-- ...
, (95, '23:30')
, (96, '23:45')

-- This is a "static" table, once populated make it read-only.
  

На уровне приложения заполните все ячейки в этой таблице
на основе учителя, класса, времени начала и времени окончания для заданной даты.
Убедитесь, что это сделано в рамках транзакции, поэтому ошибка откатывает все назад.

 -- On date DTE, teacher TCH is busy with class CLS
-- during time slot number SLT.
--
busy {DTE, SLT, TCH, CLS}
  PK {DTE, SLT, TCH}
  AK {DTE, SLT, CLS}

FK1 {SLT} REFERENCES tslot   {SLT}
FK2 {TCH} REFERENCES teacher {TCH}
FK3 {CLS} REFERENCES class   {CLS}
  

Примечание:

 All attributes (columns) NOT NULL

PK = Primary Key
AK = Alternate Key   (Unique)
FK = Foreign Key
  

Это далеко от совершенства, это может быть испорчено случайными обновлениями, скажем, сменой учителя в слоте в середине класса. Следовательно, приложение должно применять правила для предотвращения странных записей.