mysql - 将电子邮件退订存储到数据库

标签 mysql django database-design user-accounts

我正在开发一种定期向注册客户发送电子邮件的产品,我想从这些电子邮件中实现某种退订机制。

大约有 5 种类型的电子邮件和一个包含所有用户的 User MySql 表。新用户默认订阅所有邮件类型,并且可以分别取消订阅每个邮件类型。

我的问题是我应该如何将这些取消订阅存储到数据库中,同时保持高性能和可伸缩性并且不会使事情过于复杂。以下是出现的几个选项,每个选项都有自己的优点和缺点:

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

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

最佳答案

选项 3. 就数据库模式而言是最“规范化”的,这意味着无需对数据库进行任何迁移就可以添加电子邮件类型……如果您已经有一个用于存储的表,这也是最自然的选择电子邮件类型

然而,如果您添加新的电子邮件类型,您将通过选项 1 获得更好的性能(无 JOIN),但代价是需要进行数据库迁移

选项 2. 似乎具有 1. 的不灵 active ,同时仍然需要一个单独的表,所以这是我最不喜欢的选项

要考虑的其他几个选项:

  • 不要使用模型上的多个 bool 字段(选项 1),而是使用单个 BitField https://github.com/disqus/django-bitfield表示取消订阅...这样做的好处是您可以在不迁移的情况下添加新的电子邮件类型,而且查询速度也一样快。删除你必须小心的类型

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

关于mysql - 将电子邮件退订存储到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27265592/

相关文章:

php - 限制给定秒数的 IP 访问

django: getattr 函数(获取字段名)

Django 仅预取相关模型的最新对象

database - 在数据库中,将时间段存储为开始/结束日期还是开始日期和时间长度更好?

python - webpy db 选择查询中的问题

mysql - 快速比较大量二进制数据

mysql - 如何减去行中的两个日期(查询中未给出)Mysql

python - Heroku 上的 Django manage.py 自定义命令

mysql - 空字段是否占用数据库空间?

database - Firebird 2.1 在某些数据库表中存储大量行是否有效?