Для практического, реального примера повторяющейся календарной логики посмотрите на свой КПК или его эквивалент.
Несколько лет назад я собрал календарь в интранет-приложении и в основном скопировал то, что было у моего Palm для повторяющихся опций. Это имело смысл для людей, поэтому я оценил это как успех. Но он не сохранил чистоту в базе данных. Мой код заканчивался множеством тщательных проверок на соответствие данных различным правилам, чтобы исправить ситуацию, если что-то выглядело неправильно. Помогло, что мы активно использовали это, поскольку я развивал это. :-)
Что касается хранения, запись календаря включала флаг, указывающий, является ли она частью повторяющейся серии или нет. Если это не так, это была неповторяющаяся запись. Если это так, то для редактирования у него было несколько вариантов, одним из которых было разорвать ряд в этой записи. Повторяющиеся записи были внесены в базу данных как отдельные элементы; это был тип денормализации, который был сделан из соображений производительности. Среди прочего, это означало, что другой код, который хотел проверить календарь, не должен был беспокоиться о повторяющихся элементах. Мы решили «бесконечную» проблему, всегда требуя даты окончания серии.
На самом деле для настройки повторяющихся элементов использовался некоторый JavaScript в пользовательском интерфейсе для управления различными настройками. Запись в базе данных имела комбинацию значений, чтобы указать область повторения (например, ежедневно, еженедельно, ...) повторяющегося шага (например, 1 неделя, 2 недели, ...) и любое изменение (например, еженедельно) «Понедельник, среда, четверг каждую неделю»).
Наконец, у нас была логика, которую я так и не смог полностью реализовать, которая обрабатывает часовые пояса и летнее время. Это сложно, потому что вы должны разрешить переключение выборочно. То есть, некоторые элементы календаря будут оставаться во времени локально для конечного пользователя, другие будут привязаны к определенному месту, и могут или не могут сдвигаться при переходе на летнее время. Я покинул эту компанию до того, как решил эту проблему.
Наконец, я отвечаю на это, потому что я не видел все остальные вопросы. :-) Но иди почитай и пойми, что PDF.