Я пытаюсь создать календарь событий, который вначале может быть довольно большим. С этой целью, при попытках доказать это в будущем, насколько это возможно, все события, которые произошли в прошлом, будут удалены из базы данных. Однако является ли плохой практикой изменение даты начала повторяющихся событий, когда они произошли, чтобы указать, когда начнется следующее событие? Это облегчает выполнение поисковых запросов, потому что теоретически никакие события не начнутся больше, чем, скажем, неделя в прошлом, в зависимости от того, как часто обновляется база данных.
Есть ли лучший способ сделать это?
Мое текущее намерение состоит в том, чтобы иметь таблицу со списком деталей события вместе со столбцом для того, будет ли это повторение на год, месяц, неделю или день. Когда кто-то ищет события между двумя датами, я просто просматриваю каждую строку и проверяю, есть ли (EVENT START <= SEARCH FINISH && EVENT FINISH> = SEARCH START). Затем он получает все возможные события, а затем необходимо проверить повторяющиеся, чтобы увидеть, происходят ли они в течение заданного периода времени. Вот где я немного отклеился, как конкретно этого добиться. Мои мысли таковы:
Ежегодно: если СОБЫТИЕ НАЧИНАЕТСЯ + 1 ГОД <= ПОИСК ЗАКОНЧИТЬ || СОБЫТИЕ ЗАВЕРШЕНИЕ + 1 год> = НАЧАЛО ПОИСКА; повторите в течение +2 ЛЕТ и т. д., пока СОБЫТИЕ не начнется + НЕТ ГОДА> ПОИСК ЗАВЕРШИТ.
Ежемесячно: как указано выше, но + 1 месяц каждый раз.
Еженедельно: как указано выше, ЗАПУСК СОБЫТИЙ и ЗАВЕРШЕНИЕ СОБЫТИЙ будет плюс 7 ДНЕЙ МЕЖДУ РЕКУРСИЕЙ на каждую итерацию, пока СОБЫТИЕ СОБЫТИЙ + 7 ДНЕВ ПОВТОР> ПОИСК ЗАВЕРШЕН.
Ежедневно: как указано выше, НЕТ ОТЛИЧИЯ ОТ ДНЕЙ вместо 7 дней в течение недели. Это может быть использовано для указания таких вещей, как каждые 14 дней (две недели), каждые 10 дней. Даже каждую неделю можно использовать этот метод.
Однако, когда я думаю о запросе, который должен быть построен для достижения этого, я не могу не думать, что он будет очень громоздким и, вероятно, медленным. Есть ли лучший способ достичь желаемых результатов? Я до сих пор не нашел способа делать такие вещи, как это происходит в первый понедельник месяца или в последнюю пятницу месяца или во вторую субботу апреля каждого года. Возможны ли эти последние варианты?
- Изменить: добавлено ниже:
Может немного помочь, если я немного подробнее объясню, что я создаю. Таким образом, руководство может быть дано в отношении этого.
Я создаю веб-сайт, который позволяет организациям добавлять события, будь то разовые или повторяющиеся (ежедневно, еженедельно, ежемесячно, первый вторник месяца и т. Д.). После этого пользователь сайта сможет искать события на выбранном расстоянии (произвольно 10, 25, 50, 100 миль, вся страна) в установленную дату или между 2 указанными датами, которые могут быть на расстоянии от одного дня до с интервалом в пару лет (очевидно, что события в будущем будут минимальными или не будут существовать в зависимости от используемых дат).
В самой таблице СОБЫТИЯ в настоящее время содержится много информации о событии, такой как местоположение, стоимость, возрастная группа и т. Д. Было бы лучше иметь это в отдельной таблице, которая просматривается после того, как будет определено, является ли событие находится в пределах указанных параметров поиска? Очевидно, что не вся эта информация нужна до подробного просмотра страницы, может быть, просто имя, местоположение, стоимость и краткое описание.
Я ценю, что есть много способов снять шкуру с кошки, но я не уверен, как это сделать. Самая большая проблема, с которой я сталкиваюсь, это как структурировать мои данные так, чтобы запрос знал, находится ли рекурсия в пределах указанной даты. Кроме того, учитывая, что математика для вычисления расстояния между двумя широтами / долготами является относительно сложной, мне нужно иметь возможность встроить эти вычисления в свой запрос, иначе я все равно буду выполнять вычисления в PHP. Конечно, будет меньше результатов для обработки таким способом, но это все еще необходимо сделать.
Любые дальнейшие советы приветствуются.