Я работаю на сайте недвижимости и должен сделать почтовую рассылку уведомлений: когда на сайт добавлено новое свойство, люди, которые подписались на уведомление в этой конкретной стране и/или области и/или городе и/или конкретном имуществе (аренда, продажа) будет получать уведомление по электронной почте. Один человек может подписаться на разные области, города и т.д., А не только на один. Один человек получит только одно уведомление в неделю, пусть скажет, если есть новые свойства для него. И я думаю о том, как лучше создать таблицу mysql для подписчиков, чтобы легко их получить. Таблица:
create table subscribers(
user_email varchar(255),
area_id int(4));
- плохая идея, потому что, если будет позволено сказать 100 000 (глядя в будущее) подписчиков, и каждый из них будет подписаться на 10 областей, в таблице будет 1 000 000 строк. Итак, я ищу эффективное решение для выполнения этой задачи.
Если у вас есть дополнительные рекомендации, я хотел бы услышать их.
Спасибо заранее!
Вы должны использовать таблицу перекрестных ссылок (многие ко многим). Это сделает данные более нормализованными:
CREATE TABLE `areas` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(255) NOT NULL
PRIMARY KEY (`id`)
)
CREATE TABLE `subscribers` (
`id` int(10) unsigned NOT NULL auto_increment,
`email` varchar(255) NOT NULL
PRIMARY KEY (`id`)
)
-- cross ref table
CREATE TABLE `areas_subscribers` (
`area_id` int(10) unsigned NOT NULL,
`subscriber_id` int(10) unsigned NOT NULL,
UNIQUE KEY (`area_id`,`subscriber_id`)
)
И миллион строк не проблема. Особенно с таблицей перекрестных ссылок.
в таблице будет 1 000 000 строк
И что? mySQL может обрабатывать его.
Насколько я вижу, то, как вы это делаете, прекрасно. Это хорошо нормализовалось, я не могу придумать лучшего метода.
Ваша таблица выглядит правильно, предполагая, что user_email
является основным ключом, идентифицирующим ваших пользователей. Если да, добавьте в таблицу subscribers
a PRIMARY KEY (user_email, area_id)
, чтобы указать, что оба поля вместе составляют ваш первичный ключ.
Ваша озабоченность по поводу дублирования электронных писем имеет мало общего с дизайном схемы и больше связана с запросом, который вы собираетесь запустить. Это, конечно, будет во многом зависеть от того, как хранятся ваши другие данные, но может выглядеть примерно так:
SELECT DISTINCT user_email WHERE area_id IN (...)
(Список значений area_id
, которые видели записи на прошлой неделе.)
Это простой запрос, который можно оптимизировать и улучшить, учитывая остальную часть вашей схемы, но он иллюстрирует, как легко избежать генерации нескольких сообщений электронной почты, несмотря на то, что один и тот же человек был указан несколько раз.
Вы можете создать дополнительную таблицу адресов электронной почты. Таким образом, вы сохраняете только идентификатор в таблице подписчиков, а не тот же адрес электронной почты снова и снова (тогда как в любом случае могут быть некоторые оптимизации в базе данных).