Ответ
Misha v.3 28.07.2014 06:02
А что за принцип периодичности-то?
Предложенный вариант с очередью с возобновляемыми событиями в ней -- хороший, т.к. искать требующие обслуживания события в БД очень легко (dt < NOW()), а значит записей в очереди может быть очень много.
При этом система получается надёжной. Если по какой-то причине код обработки событий не выполнился (лежала БД, сервер), то после возвращения системы в рабочее состояние события в очереди будут обработаны автоматически без какого-либо ручного вмешательства (в случае калькуляции дат -- такое невозможно).
Вариант с расчётами, когда вы в БД храните только дату начала подписки, а потом всё вычисляете -- плохой. Почему? Потому, что вычислить-то это можно, однако для этого нужно всё считать для каждой записи в БД. При этом ни о каком использовании индексов речи быть не может. Это плохо, т.к. при наличии большого количества записей в БД (подписок) такие запросы будут выполняться долго.