2014-12-03 3 views
3

Я работаю над продуктом, который отправляет периодические электронные письма зарегистрированным клиентам, и я хотел бы реализовать какой-то механизм отмены подписки из этих писем.Сохранение адресов электронной почты в DB

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

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

  1. Добавление булеву колонки на User таблицы для каждого типа отчета со значением по умолчанию верно.
  2. Создание новой таблицы Unsubscription с один-на-один отношение к таблице User. Каждый тип электронной почты получит столбец, и каждый пользователь получит строку.
  3. Создание новой таблицы Unsubscription с много-к-одному отношение к таблице User. Каждый запрос на отмену подписки создаст новую строку в таблице.

Есть ли наилучшая практика для хранения информации о выписке? Какие проблемы с базой данных?

+0

почему вы должны хранить отменяют подписку? не можете ли вы просто удалить соответствующие подписки от пользователя? – Anentropic

+0

@ Антентроп По умолчанию каждый пользователь подписывается на все типы электронной почты, поэтому я считаю, что имеет смысл только сохранить отписки. Также при добавлении типа электронной почты нет необходимости изменять какие-либо данные. – Tzach

ответ

1

вариант 3. является наиболее «нормированным» в терминах схемы db и означает, что типы электронной почты могут быть добавлены без необходимости выполнять какие-либо миграции на db ... это также самый естественный вариант, если у вас уже есть таблица для хранящие типы электронной почты

однако вы получите лучшую производительность с вариантом 1. (без JOIN ов) за счет необходимости сделать миграцию дб, если добавить новый тип электронной

вариант 2. кажется, есть негибкость 1., в то время как все еще нужна отдельная таблица, поэтому мой вариант с наименьшим преимуществом

Несколько других вариантов для рассмотрения:

  • вместо нескольких логических полей на модели (вариант 1) использовать один BitFieldhttps://github.com/disqus/django-bitfield представлять отменяет подписку ... это имеет то преимущество, что вы можете добавить новый адрес электронной почты типы без миграции, а также запросы так же быстро. удаляя типы, вы должны быть осторожны, но

  • как указано выше, если у вас есть таблица для EmailType, уже имеет смысл иметь отношение «многие ко многим» на модели User. Но вы можете использовать django-denorm для автоматического обновления BitField на модели, которые могли бы дать лучшее из обоих миров

+0

Опция 'BitField' выглядит очень хорошо. Думаю, я поеду с ним. Благодаря! – Tzach

Смежные вопросы