Представление комплексного запланированного повторения в базе данных

У меня есть интересная проблема, пытаясь представить сложные данные расписания в базе данных. В качестве ориентира я должен иметь возможность представлять всю полноту того, что может представлять формат iCalendar - ics -, но в базе данных. На самом деле я не реализую ничего, относящееся к ics, но он дает хорошую область типов правил, которые мне нужны для моделирования для моего конкретного проекта.

Мне нужно разрешить представление одного события или повторяющегося события на основе нескольких раз в день, дней недели, недели месяца, месяца, года или некоторой их комбинации. Например, третий четверг ноября ежегодно или 25 декабря ежегодно или каждые две недели, начиная с 2 ноября и продолжающийся до 8 сентября следующего года.

Мне не нужна эффективность вставки, но эффективность запросов очень важна. Операцией, которую я буду делать чаще всего, является предоставление одной даты/времени или диапазона даты/времени и попытка определить, соответствует ли определенное расписание какой-либо части диапазона дат/времени. Другие операции могут быть медленнее. Например, с 15 января 2010 года в 10:00 утра до 15 января 2010 года в 11:00, найдите все расписания, которые совпадают, по крайней мере, с частью этого времени. (то есть график, который охватывает 10:30 - 11:00, по-прежнему соответствует.)

Любые предложения? Я посмотрел на Как можно представить запланированные события в RDBMS?, но не охватывает сферу действия правил повторения, которые я хотел бы моделировать.

Ответ 2

То, как я делал что-то похожее, состояло в том, чтобы иметь две таблицы. Если событие не имеет повторяющегося шаблона, просто сохраните дату, время начала и время окончания. В вашем запросе проверяется, превышает ли время вашего поиска значение времени начала любой записи и меньше или равно времени окончания этого события.

Для повторяющихся событий я не слишком хорошо разбираюсь в том, как iCalendar сохраняет повторяемость, но если вы храните каждое событие по дням недели (возможно, вам придется иметь несколько строк для одного события, если оно повторяется более одного дня в неделю), а затем искать его почти так же, как в приведенной выше таблице. Для странных рецидивов, таких как третий вторник недели, у вас может быть дополнительная колонка, описывающая конкретное состояние. Я мог бы дать вам лучший ответ для этого, если бы вы могли рассказать мне больше о том, как ics представляет такой повтор.

Надеюсь, это поможет. Сейчас у меня мало времени. Вы можете связаться со мной позже, если вы хотите обсудить это. Я в настоящее время в Миссури, поэтому моя доступность на следующей неделе будет неустойчивой.

Ответ 3

Это может быть тривиальное решение, но каковы были бы недостатки добавления столбца, который определяет повторяемость события (т.е. каждую неделю x, ежегодно, еженедельно и т.д.) и используя это как критерий результата?