Вам нужно будет обрабатывать отдельно события и события.
EVENT WISE: Для событий, вам нужно будет хранить правила recurence (которые могут быть rrule как указано rfc5545, но и явный набор дат, как rdate в rfc5545), но и исключения (см exdate из rfc5545 и, возможно, exrule, как в rfc2445). Вам также необходимо отслеживать изменения в этих правилах: Изменения в rdate, exdate не представляют проблемы, когда они происходят в будущем и игнорируются для прошлых дат. Изменения в rrule более сложны, так как они влияют на предыдущие случаи. Мое личное предпочтение заключается в добавлении определенного свойства для старого и нового rrule для указания их даты начала и окончания срока действия.
Если событие имеет ограниченный промежуток времени (скажем, свойство COUNT или UNTIL присутствует), вы должны сохранить его начало и конец в своей таблице, чтобы упростить запрос событий (особенно при поиске случаев вне вашего предварительно рассчитанного временного окна (см. ниже), это может помочь уменьшить количество событий, для которых нужно переделать вычисление).
ЗАМЕЧАНИЯ: для случаев, в которых вы должны хранить экземпляры в пределах предопределенного окна вокруг настоящего (скажем +/- 6 месяцев или 12 месяцев и рассчитывать на регулярной основе) и вести учет этого, чтобы разрешить перерасчет, если ваши пользователи хотят видеть дальше в будущем (для выступлений). вы также должны рассмотреть возможность вычисления индекса (RECURRENCE-ID), чтобы облегчить поиск следующего события.
на внутренней стороне, но больше на интерфейсе, вы также должны отслеживать изменения tzid, чтобы спросить пользователя, если событие, которое было запланировано на заданном tzid, если оно предназначено для пребывания в текущем часовом поясе он должен быть обновлен (подумайте о ком-то на острове Самоа, у которого было запланировано собрание в пятницу, 30 декабря 2011 года, прежде чем страна решила, что этот день не будет существовать), аналогичным образом вы можете спросить, происходит ли событие, которое происходит во время летнего времени означает «никогда не бывает» или «случаются дважды» (больше на эту тему here)
Примечание: вы можете захотеть рассмотреть вопрос о поддержке сверх того, что определено в rfc5545 с точки зрения правил recurence, а также добавить поддержку религиозных повторяющимися правил (see USNO introduction to calendars или в печати «Календарные расчеты» (Третье издание) от E. Reingol и N. Dershowitz).
Поскольку вы спрашиваете о существующей реализации, вы можете легко проверить схему базы данных sunbird (sqlite) или Apple open source Calendar and Contacts Server, более полный список существующих проектов с открытым исходным кодом для серверов caldav (что, вероятно, является частью того, что вы) here)
Если вы сохранили отдельную дату для каждого повторения каждого пользователя, у которого есть повторение, это может стать большим количеством данных в спешке. –
+1 в пользу сохранения повторения. Подумайте о прецеденте, когда пользователь перемещает экземпляр повторяющегося события: у нее есть возможность применить переход ко всем событиям, все последующие события, только это событие и т. Д. – Fuhrmanator