Как спроектировать БД для рассылки?

Постараюсь описать всё на примере:

Есть 10-100-... пользователей.
Каждый пользователь может создать расписание определённого действия на сайте.
(Каждый час слать письмо о состоянии аккаунта на E-mail)
Иными словами, настраивать новостную рассылку к себе на Email как ему вздумается.
Хоть каждую минуту.(вряд-ли)
Возьмём для примера:
10 пользователей, которые хотят получать письма каждые 10 минут.
А именно:
00:00
00:10
00:20
00:30...

Письма могут быть разные.
И хранятся они в таблице "mails" (id user_id text send_status ...)
Подошел к главному вопросу:
Как организовать структуру БД ответственную за расписания рассылки для каждого конкретного пользователя?

Обычная таблица: user_id, time[00:00 .. 23:59] с шагом в 1 минуту?
time - отсчёт времени. 60*24 = 1480 в сутки.

Скрипт будет запускаться Cron каждую минуту.
И отправлять всё что совпало.
  • Вопрос задан
  • 2495 просмотров
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Я бы сделал так
user_id, weekDays, date, startTime, interval, endTime, nextTime
SELECT * FROM `table` 
    WHERE `nextTime` < `endTime` 
        AND ((`weekDays` & (1 << WEEKDAY(NOW())) OR `date` = CURDATE())
        AND `nextTime` < {$currentTime};
UPDATE `table` 
    SET `nextTime` = ADDTIME(`nextTime`, `interval`)
    WHERE `nextTime` < `endTime`
        AND `nextTime` < {$currentTime};
$currentTime нужна для того, чтобы не пропустить события между запросами SELECT и UPDATE.

В полночь сбрасывать nextTime
UPDATE `table` 
    SET `nextTime` = `startTime`
Ответ написан
Subotinn
@Subotinn Автор вопроса
Теоретически пользователь может составить 7 расписаний на каждый день недели.
Это значит:
7(дней) * 24(часа) * 60(минут) = 10080 записей для одного пользователя.
Это максимум.

Допустим человек таки создает на 7 дней. и на 24 часа.
Но вот вряд-ли ему понадобятся письма чаще чем 1 раз в 5-10 минут.
Значит будет не 60, а 6-12 писем. Возьмём 10.
Значит 7*24*10 = 1680.

Опять же предположим, что пользователей 1000.
1000 * 1680 = 1.68М записей состоящих из 3-4 integer полей.
Это учитывая, что каждый из 1000 пользователей сделал себе личное расписание на каждый из дней недели, что врядли.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы