Как правило, вы хотите, чтобы ваши таблицы были максимально гибкими, чтобы учитывать непредвиденные изменения. Если эти поля изменятся, ваши запросы должны будут измениться в любом случае.
Не имея конкретной информации, вот мои рекомендации:
Иметь таблицу пользователей с индексом и адресом электронной почты
Есть таблица типов подписки
ИД пользователя + таблица просмотра подписки
Есть таблица ожидающих сообщений
При наличии нового обновления соберите все электронные письма и создайте запись журнала сообщений в таблице ожидающих сообщений.
Создайте свой Cron, чтобы получать 20 неотправленных сообщений каждые несколько минут и удалять сообщение после его отправки.
Причина, по которой я говорю, что итеративно отправляю их через CRON, заключается в том, что по мере роста числа ваших подписчиков вы не хотите, чтобы сотни писем приходили одновременно и связывали ресурсы вашего сервера для почтовой очереди. Вы можете просто продолжать добавлять сообщения по мере необходимости, и ваша очередь будет последовательно отправлять их.
Мы довольно эффективно использовали этот метод для всех наших приложений для массовой рассылки сообщений, регистрации ошибок и уведомлений. Возможно, это не лучшее решение, но показано, что оно очень управляемое и гибкое.