2014-12-03 109 views
3

我正在发送电子邮件定期向注册客户一个产品,我想实现某种从这些电子邮件退订机制。存储电子邮件取消订阅的到DB

大约有5种类型的电子邮件,并包含所有用户User MySQL表。新用户默认订阅所有电子邮件类型,并且可以单独取消订阅每种电子邮件类型。

我的问题是我应该如何存储这些取消订阅的数据库,同时保持高性能和可扩展性,并没有过于复杂的事情。以下是想出了几个选项,每个人都有自己的优点和缺点:

  1. 添加在User表中的布尔列中为每次报告类型值为true的默认值。
  2. 创建一个新的Unsubscription表与一对一表与User表的关系。每个电子邮件类型都会得到一个列,每个用户都会得到一行。
  3. 创建一个新的Unsubscription表与多对一User表的关系。每个取消订阅请求都会在表上创建一个新行。

是否有用于存储退订信息的最佳做法?什么是数据库设计问题?

+0

为什么你需要存储取消订阅的模型BitField?难道你不能从用户中删除适当的订阅吗? – Anentropic 2014-12-03 14:15:09

+0

@Anentropic默认情况下,每个用户订阅的所有电子邮件的类型,所以我认为它更有意义只保存取消订阅。另外,当添加电子邮件类型时,不需要更改任何数据。 – Tzach 2014-12-03 14:29:38

回答

1

选项3.在数据库架构方面最“规范化”,并表示电子邮件类型可以不必做数据库迁移任何被加入......它也是最自然的选择,如果你已经有一个表存储的电子邮件类型

但是如果你添加一个新的电子邮件类型,你会得到与需要做一个数据库迁移的费用选项1(无JOIN S)更好的性能

选项2.似乎有1.缺乏灵活性,同时还需要一个单独的表,所以会是我最青睐的选择

一对夫妇的其他问题需要考虑:

  • ,而不是对模型(选项1)使用单一BitFieldhttps://github.com/disqus/django-bitfield表示取消订阅......几个布尔字段此的优点是可以添加新的电子邮件类型无需迁移,再加上查询速度一样快。删除类型,你必须要小心,虽然

  • 如上所述,如果你有一个表EmailType已经在User模型上有一个多对多的关系是有意义的。但是你可以使用django-denorm自动更新可能会给你两全其美

+0

'BitField'选项看起来非常好。我想我会去用它。谢谢! – Tzach 2014-12-04 08:03:49