Ну вот, как вариант:
id - номер задания. Либо уникален, либо уникальна комбинация id, user_id.
user_id - id пользователя, для которого назначено напоминание
rem_type - тип напоминания (1 - однократное, 2 - в опр. день недели, 3 - в опр. день месяца, 4 - на третий день после очередного финансового кризиса, и т.д.)
rem_num (число) - доп. параметр, зависит от rem_type, для 1 - не используется, для 2 - день недели, когда срабатывать, для 3 - день месяца и т.д.)
rem_time - время напоминания в выбранный день.
date - дата очередного срабатывания.
Дальше поля зависят от того, как должно напоминаться.
Пока предположим - как в outlook, только текст, без всяких запусков внешних программ и прочего. Тогда просто:
text - текст напоминания.
Алгоритм работы такой:
При создании задания на основе текущей даты и rem_type, rem_num, rem_time выбирается дата очередного срабатывания.
К примеру: сегодня 2011-08-19, rem_type = 2, rem_num = 6 (суббота), rem_time = 15:00, тогда очередная дата срабатывания - 2011-08-20 15:00, что и заносится в date.
После чего таблица регулярно (раз в секунду, в 5 секунд, раз в месяц) проверяется и если у какого-то задания date < текущей даты - выводится напоминание
и генерируется новая дата напоминания. Задания с rem_type == 1 просто удаляются.
Можно ввести ещё поле - активное или не активное задание, тогда задания с rem_type == 1 нужно не удалять, а делать неактивными.
Дальше - простор фантазии.
Дополнительно:
Если пользователь сам заходит на страницу, тогда проверять таблицу при входе пользователя.
Евген пишет:Подразумеваю что таблицы надо иметь как минимум 2, т.к. надо учесть 2 типа заданий: 1) бесконечное 2) с заданной датой начала и заданной датой окончания
Если нужна дата окончания, я бы предложил держать всё в одной таблице, добавить флаг - "есть дата окончания", поле "дата окончания" и при генерации очередной даты срабатывания проверять, чтобы она не была больше "дата окончания", иначе делать задание неактивным.
А дату начала учитывать при генерации даты первого срабатывания.