Я предполагаю, что даты не участвуют. Если используются даты, удалите день и измените тип времени на типы даты и времени.
Итак, вам нужны записи, которые выглядят так: *
person_id - день (int 0-7) - time_low - time_high.
Это все, что вам нужно для представления данных. Доступность представлена диапазонами между time_low и time_high.
Вам понадобится логика приложения, чтобы объединить перекрытия и разрешить перекрытия. Это не должно быть слишком сложно.