Есть список email для рассылки, все работает примерно так: пользователь добавляет новость/заказ и т.д.,нужно уведомить об этом других пользователей на сайте, если эти пользователи оффлайн, письма отправляются без задержки, но если онлайн, происходит задержка (например 3 минуты), если пользователь за 3 минуты не прочитал событие на сайте, ему отправляется письмо на почту, иначе письмо удаляется из списка
Можно было бы сделать так:
news
id, name, author_id, text, email_id
orders
id, name, author_id, supplier_id, email_id
emails:
id, author_id, recipient_id, subject, text, time_to_send, created
Но 1 заказ/ новость может иметь несколько писем (например для новостей, это все подписчики автора)
Правильно ли будет, если сделать в таблице emails поля order_id, news_id и т.д.?
id, author_id, recipient_id, order_id, news_id, subject, text, time_to_send, created
Для правильного вопроса надо знать половину ответа
Если проводить строгую нормализацию, то должна быть таблица писем (id, author_id, subject, text, created), таблица рассылки (letter_id, recipient_id, time_to_send). Если связи письма<->новости и письма<->заказы идут как многие-ко-многим, то две таблицы связи (letter_id, news_id) и (letter_id, order_id), если нет, то поля news_id и order_id тоже в таблице писем. А дальше надо смотреть, нужна ли денормализация и в каких пределах.
связи письма<->новости и письма<->заказы один ко многим (1 новость -> много писем, 1 заказ-> много писем), то-есть news_id и order_id в таблице писем не будет большим нарушением?
entermix: Если для каждого получателя генерируется уникальное письмо, то можно и не разделять. Но по новости, скажем, одно письмо пойдёт многим пользователям, в этом случае нет смысла дублировать его в базе. Достаточно сделать таблицу рассылки, кому и когда это письмо отправить.