Для расписаний на основе ротации вы хотите использовать систему на основе исключений. Если вы знаете, что сотрудник x работает в ротации y в диапазоне дат z, вы можете вычислить отдельные дни для этого сотрудника на лету. Если они больны / находятся на курсе / и т. Д., Добавьте исключение для сотрудника на этот день. Это сделает базу данных намного меньше, чем отслеживание каждый день для каждого сотрудника.
table employee {EmployeeID}
table employeeRotations {EmployeeRotationID, EmployeeID, RotationID, StartDate, EndDate}
table rotation {RotationID, NumberOfDays, StartDate}
table rotationDay {RotationDayID, RotationID, ScheduledDay, StartTime, EndTime}
table employeeExceptions {EmployeeExceptionID, ExceptionDate, ExceptionTypeID (or whatever you want here)}
Оттуда вы можете написать функцию, которая возвращает On / Off / Exception для любой заданной даты или любой данной недели.