【问题标题】:Database structure question...Emails scheduled for delivery?数据库结构问题...计划发送的电子邮件?
【发布时间】:2010-12-28 11:46:29
【问题描述】:

我正在尝试实现一个系统,在该系统中,发送给大(或小)群体的电子邮件被安排通过 cron 作业发送(而不是循环发送,而用户正在等待他们完成发送)。

用户可以发送两种类型的电子邮件:发送给订阅者表中的每个人的电子邮件,或者只发送给群组成员的电子邮件。我想我真的不需要包含发送给群组成员的电子邮件,因为它们将是发送给小型群组而不是大型(所有订阅者)群组的电子邮件。

我试图弄清楚如何构建我的数据库以使其有意义,但我什至很难解释它应该如何工作。

你有什么经验可以分享一下吗?我应该如何构建我的数据库来跟踪等待发送的电子邮件?

【问题讨论】:

  • 标题说“调度”,但我读到的只是支持 1+ 个收件人。请记住,电子邮件服务器可以对电子邮件进行排队,并且只能以指定的时间间隔发送。

标签: database-design email cron mail-queue


【解决方案1】:

您希望实现的是利用您的存储层的基本队列。

User (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    email VARCHAR(125) NOT NULL
);

User_Group (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_id INTEGER UNSIGNED NOT NULL,
    group_id INTEGER UNSIGNED NOT NULL
);

Group (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(75) NOT NULL,
    description VARCHAR(255)
)

MailingList (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_id INTEGER UNSIGNED NOT NULL,

);

# mails to be sent out to groups / all 
MailQueue (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    group_id INTEGER UNSIGNED,
    time_to_send DATETIME DEFAULT CURRENT_TIMESTAMP
);

您将在 MailQueue 中输入具有有效 unix 时间戳的条目的群组电子邮件排队。您应该创建一个组“所有”,您将分配给每个用户,以便您仍然可以正确使用这些表。你会像这样运行你的 cron 查询:

SELECT User.email
FROM MailQueue
INNER JOIN User_Group ON (MailQueue.group_id = User_Group.id)
INNER JOIN User ON (User_Group.user_id = User.id)
WHERE MailQueue.time_to_send < NOW();

您需要确保在使用结果集后删除它们,因为您不会发送重复的电子邮件条目。如果您希望保留已发送电子邮件的日志,只需添加另一个指示 sent_email = 1TINYINT(1) UNSIGNED 字段并将您的 SELECT 查询修复为仅在值为 0 时获取结果。

【讨论】:

    【解决方案2】:

    使用连接表将待处理的电子邮件链接到用户。使用另一个联接表来管理组。当电子邮件发往某个组时,可以使用存储过程将组中所有成员的 ID 填充到 EmailRecipients 表中。

    表格:

    PendingEmails
      ID
      Subject
      Body
    
    EmailRecipients (join table)
      EmailID
      UserID
    
    Users
      ID
    
    Groups  (join table)
      GroupID
      UserID
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 2016-08-12
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多