- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在开发一种定期向注册客户发送电子邮件的产品,我想从这些电子邮件中实现某种退订机制。
大约有 5 种类型的电子邮件和一个包含所有用户的 User
MySql 表。新用户默认订阅所有邮件类型,并且可以分别取消订阅每个邮件类型。
我的问题是我应该如何将这些取消订阅存储到数据库中,同时保持高性能和可伸缩性并且不会使事情过于复杂。以下是出现的几个选项,每个选项都有自己的优点和缺点:
User
表中为每种报告类型添加一个 bool 值列,默认值为 true。User
表具有一对一关系的新 Unsubscription
表。每种电子邮件类型都有一列,每个用户都有一行。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/
我是一名优秀的程序员,十分优秀!