database - 设计摘要电子邮件实现的方法?

标签 database email database-design

我正在寻找有关如何设计摘要电子邮件功能的一些想法。我不关心实际的业务代码;相反,我想专注于它的要点。

让我们用一个已知的例子来解决这个问题:文章。以下是一些重要功能的一般概述:

  1. 用户能够选择摘要频率(例如每天或每周);
  2. 摘要包含文章;
  3. “新文章”被视为相对于发送给特定用户的先前摘要

我一直在思考以下问题:

  • 引入对以前包含在摘要中的文章的每个用户跟踪并将其过滤掉?
    • 需要一个新的数据库表;
    • 当表包含数百万行时可能会变得昂贵;
    • 如果摘要中包含多种类型的模型怎么办?多个跟踪表?多态表? ...?
  • 使用文章创建日期来包含当前日期和所选摘要频率之间的文章?
    • 使用数据库中已有的当前日期和信息,因此不需要新表;
    • 当用户从每天发送电子邮件更改为每周发送电子邮件时会发生什么?他可以在每周摘要中再次收到相同的文章。应该考虑这种边缘情况吗?如果是,如何缓解?
    • 由于某种原因,一篇文章的创建日期被更新到今天,再次触发日期比较。应该考虑这种边缘情况吗?如果是,如何缓解?

或者你能想出其他方法来实现这个功能吗?

我渴望了解您的见解。

最佳答案

您可以创建一个附加表,其中包含每个用户的摘要订阅信息。这种方式使数据库设计更简洁、更通用,因为邮件是一个单独的逻辑模块。除此之外,附加表使将来能够轻松扩展有关摘要订阅的存储数据。例如:

enter image description here

借助此表的帮助,您可以轻松管理数据。例如,您可以选择每日摘要的所有收件人:

SELECT *
FROM digest_subscription
WHERE interval_type = 'daily'
  AND last_date_distribution <= NOW()

或选择每周摘要的所有收件人

SELECT *
FROM digest_subscription
WHERE interval_type = 'weekly'
  AND last_date_distribution <= NOW() - INTERVAL 7 DAY

按间隔类型的条件和按“等于或小于”规则比较最后日期分布可以避免不及时发送电子邮件的问题(例如服务器上的技术故障等)

此外,您还可以使用上次数据分发的帮助信息来制作正确的文章列表。使用最后的数据分布能够避免间隔变化的问题。例如:

SELECT *
FROM articles
WHERE created_at >= <the last date distribution of the user>

当然,您不会避免更新创建日期的问题。但是你应该尽量减少发生这种情况的原因。例如,您的代码可以更新修改日期,但您的代码不应修改创建日期。

关于database - 设计摘要电子邮件实现的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53719557/

相关文章:

mysql - SQL MIN() 奇怪的值

database - Oracle -- 将数据导入到具有不同名称的表中?

database-design - 多用户Web应用程序数据库设计

mysql - 使用特定列根据另一列查找值

sql - 存储(和访问)历史记录的最佳方式是什么 1 :M relationships in a relational database?

php - 数据库从实时服务器同步到本地计算机

php - 如何使用编辑按钮更新 mysql,该按钮会将当前数据从我制作的简单 CMS 发送到表单中

ASP.NET 电子邮件发送缓慢

php - 发送电子邮件时出现 Swift_TransportException

php - 从 mysql 创建 excel 并在 php 中将其作为附件电子邮件发送