Помогите с php / mysql почтовиком

0

Я работаю на сайте недвижимости и должен сделать почтовую рассылку уведомлений: когда на сайт добавлено новое свойство, люди, которые подписались на уведомление в этой конкретной стране и/или области и/или городе и/или конкретном имуществе (аренда, продажа) будет получать уведомление по электронной почте. Один человек может подписаться на разные области, города и т.д., А не только на один. Один человек получит только одно уведомление в неделю, пусть скажет, если есть новые свойства для него. И я думаю о том, как лучше создать таблицу mysql для подписчиков, чтобы легко их получить. Таблица:

create table subscribers(
user_email varchar(255),
area_id int(4));

- плохая идея, потому что, если будет позволено сказать 100 000 (глядя в будущее) подписчиков, и каждый из них будет подписаться на 10 областей, в таблице будет 1 000 000 строк. Итак, я ищу эффективное решение для выполнения этой задачи.

Если у вас есть дополнительные рекомендации, я хотел бы услышать их.

Спасибо заранее!

Теги:

4 ответа

1
Лучший ответ

Вы должны использовать таблицу перекрестных ссылок (многие ко многим). Это сделает данные более нормализованными:

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`)
)

И миллион строк не проблема. Особенно с таблицей перекрестных ссылок.

  • 0
    Я всегда боялся больших таблиц, потому что они должны иметь дополнительную оптимизацию, или они будут довольно медленными. Каждый раз, когда я пытаюсь избежать нескольких строк с одинаковыми данными (в данном случае электронной почтой), реализуя сложные алгоритмы.
  • 0
    Эта схема позаботится об этом. Выполнение таблицы перекрестных ссылок, как это, означает, что используются только два целочисленных поля. Красиво и компактно. Кроме того, они проиндексированы, поэтому поиск будет быстрым.
0

в таблице будет 1 000 000 строк

И что? mySQL может обрабатывать его.

Насколько я вижу, то, как вы это делаете, прекрасно. Это хорошо нормализовалось, я не могу придумать лучшего метода.

0

Ваша таблица выглядит правильно, предполагая, что user_email является основным ключом, идентифицирующим ваших пользователей. Если да, добавьте в таблицу subscribers a PRIMARY KEY (user_email, area_id), чтобы указать, что оба поля вместе составляют ваш первичный ключ.

Ваша озабоченность по поводу дублирования электронных писем имеет мало общего с дизайном схемы и больше связана с запросом, который вы собираетесь запустить. Это, конечно, будет во многом зависеть от того, как хранятся ваши другие данные, но может выглядеть примерно так:

SELECT DISTINCT user_email WHERE area_id IN (...)

(Список значений area_id, которые видели записи на прошлой неделе.)

Это простой запрос, который можно оптимизировать и улучшить, учитывая остальную часть вашей схемы, но он иллюстрирует, как легко избежать генерации нескольких сообщений электронной почты, несмотря на то, что один и тот же человек был указан несколько раз.

0

Вы можете создать дополнительную таблицу адресов электронной почты. Таким образом, вы сохраняете только идентификатор в таблице подписчиков, а не тот же адрес электронной почты снова и снова (тогда как в любом случае могут быть некоторые оптимизации в базе данных).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню