Представление сложных запланированных повторений в базе данных - PullRequest
10 голосов
/ 13 июня 2010

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

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

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

Есть предложения?Я посмотрел на Как можно представлять запланированные события в СУБД? , но это не охватывает область действия типа правил повторения, который я хотел бы смоделировать.

Ответы [ 3 ]

4 голосов
/ 19 июня 2010

В конце концов, этот пост был самым полезным:

Список iCal «Поле» (для схемы базы данных, основанной на стандарте iCal)

Мы решили точно придерживаться модели iCal, поскольку парни, написавшие этот стандарт, прекрасно понимали проблемную область.

1 голос
/ 13 июня 2010

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

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

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

0 голосов
/ 13 июня 2010

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

...