JackShcherbakov
@JackShcherbakov

Как правильно спроектировать базу данных для хранения расписания экскурсий?

Здравствуйте, коллеги!

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

В общем, разрабатываю сайт для продажи экскурсионных услуг. Мне не совсем ясен момент с расписание экскурсий. Есть сайт (спутник8), на котором можно добавлять свои экскурсии. Там есть вот такое вот окошко:
5b057ff23803f252084826.jpeg

Можно выбрать дату и повтор даты (ежедневно, еженедельно и ежемесячно). Я не могу понять как это все работает. Допустим я выбрал 2018.06.02 и выбрал повторение еженедельно, то какие записи попадут в базу данных? Какая структура у таблицы хранения расписания? Не совсем понятно.

К томуже надо каким-то образом понять, когда будет ближайшее время проведения экскурсии (там есть страница, на которой все экскурсии отображены, и около каждой экскурсии написано, когда она проходит в ближайшее время)

Меня интересует только то, как хранить сведения о том, когда проходит экскурсия. Каким образом реализовать повтор дат и как это отразить в базе данных? Как бы сделали вы?

Заранее выражаю огромную благодарность всем, кто поможет или хотябы подкинет каких-нибудь идей.
  • Вопрос задан
  • 320 просмотров
Решения вопроса 3
Adamos
@Adamos
Зачем хранить тонны информации, которая уже завтра станет неактуальной. Храните одну запись - с перечисленными вами данными.
А для конкретного дня делаете 2 запроса к базе. Сегодня будут экскурсии, у которых:
1. Дата начала - сегодня.
2. Дата начала в прошлом и:
2.1 повтор - ежедневно
2.2 повтор - еженедельно и сегодня тот же день недели (разница в днях кратна 7). Можно оптимизировать, записывая день в отдельный столбец, чтобы не вычислять его каждый раз.
2.2 повтор - ежемесячно и сегодня тот же день месяца. Тоже возможна оптимизация.
И все. Благодаря тому, что вы не будете пихать в таблицу ежедневные записи, она останется небольшой, и по ней вполне можно будет ходить такими запросами без особых тормозов.

Естественно, сразу предусмотреть архивацию устаревших экскурсий. Флагом-датой в той же строке или отдельной таблицей, где на один столбец (дату окончания) больше и куда сбрасываются устаревшие данные.
Ответ написан
rim89
@rim89
программист-велосипедист
Можно выбрать дату и повтор даты (ежедневно, еженедельно и ежемесячно). Я не могу понять как это все работает. Допустим я выбрал 2018.06.02 и выбрал повторение еженедельно, то какие записи попадут в базу данных? Какая структура у таблицы хранения расписания? Не совсем понятно.

отдельная таблица повторений с типами, которые в select ...

К томуже надо каким-то образом понять, когда будет ближайшее время проведения экскурсии (там есть страница, на которой все экскурсии отображены, и около каждой экскурсии написано, когда она проходит в ближайшее время)

выборка добавленных экскурсий в интервал времени
Ответ написан
@ksnk
Как хранить введенные пользователем даты - вопросов не возникает? Для того, чтобы с этими датами было удобно работать клиентам, придется завести еще одну, временную таблицу - {id_Экскурсии, date_ДатаПроведения}. Таблица перезаполняется кроном, раз в день, а также при изменении описания экскурсии. "Длительность" таблицы, к примеру, 3 месяца,начиная от времени перезаполнения. Для каждой экскурсии с соответствующим повторителем, в таблицу добавляем нужные даты. В итоге - вывод списка экскурсий по дате и/или диапазону дат получается достаточно тривиальным
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы