Никакой фактический код не требуется в ответах, только хорошие советы для лучших практик.
Что мне нужно, так это отображать расписание на неделю (1 час) на веб-сайте Bootstrap для бронирования. Временной интервал будет иметь один из следующих статусов:
Когда пользователь нажимает на доступный временной интервал, для бронирования появится модальное / всплывающее окно.
Отображается только одна неделя (= текущая неделя). В конце концов пользователь может нажать на стрелку и просмотреть расписание на следующую неделю. Таким образом, мне не нужно отображать больше, чем текущая и следующая неделя.
Я подумал о трех возможных решениях:
Создайте таблицу MySQL с одной записью для каждого доступного временного интервала (автоматически с помощью cronjob). Таким образом, я могу просто напечатать данные таблицы в веб-интерфейсе. Примечание: я уже сделал это и отлично работает, но не оптимально, если у вас много расписаний на сайте.
Используйте плагин jQuery (например, Fullcalendar). Очевидно, даже если мне нужно что-то сверхпростое, Fullcalendar (или другие плагины календаря) не предназначены для такого использования. Даже с большим количеством настроек вы не можете сделать это.
Построить расписание динамически с помощью PHP, используя in_array()
функция.
Идея состоит в том, чтобы создать две таблицы MySQL, одну для хранения недоступных часов, а другую для резервирования.
С помощью двух простых запросов я могу получить 2 массива (для текущей недели): «non_available_timeslots» и «reservations».
Когда я строю расписание на неделю (обычная таблица начальной загрузки), для каждого временного интервала я буду контролировать 2 вещи:
а) Если день / час находится в массиве non_available_timeslots (если так
echo '<td class="not-available">Not available</td>'
…..иначе продолжайте в пункт б)
б) если день / час находится в массиве «резервирований» (если так,
echo '<td class="booked">Occupied</td>'
…..иначе продолжайте указывать в)
c) если 2 вышеуказанных условия не соответствуют,
echo '<td class="available"> Available</td>'
Как видите, то, что я хочу сделать, действительно просто. Я заинтересован в решении 3.
С точки зрения производительности, это плохо? (Обратите внимание, что абсолютное максимальное количество элементов для поиска в функции in_array будет равно количеству временных интервалов в расписании, поэтому 15×7 = 105, но в действительности, вероятно, только 50).
Из своего поста вы уже решили, какое решение будете использовать. Учитывая это, я бы создал только одну таблицу со столбцом (status
) это будет отличаться для «Не доступно» и «Занят».
Я бы использовал только одну таблицу, потому что вам может понадобиться другой статус через несколько дней / недель / месяцев. Вы всегда можете иметь более одного массива со значениями из одной и той же таблицы.
Я не думаю, что вы должны учитывать производительность с таким количеством строк (или временных интервалов). Я говорю: иди с этим и настраивайся по мере роста твоего приложения.
Других решений пока нет …