Database design 数据库结构问题…计划发送的电子邮件?
我正在尝试实现一个系统,在该系统中,发送给大(或小)人群的电子邮件将通过cron作业(而不是在用户等待他们完成发送的过程中以循环方式)进行发送 用户可以发送两种类型的电子邮件:发送给订阅者表中的所有人的电子邮件,或仅发送给组成员的电子邮件。我想我真的不需要包括发送给小组成员的电子邮件,因为它们是发送给小团体的电子邮件,而不是发送给大(所有订户)团体的电子邮件 我试图弄清楚如何构造数据库,使其有意义,但我甚至很难解释它应该如何工作Database design 数据库结构问题…计划发送的电子邮件?,database-design,email,cron,mail-queue,Database Design,Email,Cron,Mail Queue,我正在尝试实现一个系统,在该系统中,发送给大(或小)人群的电子邮件将通过cron作业(而不是在用户等待他们完成发送的过程中以循环方式)进行发送 用户可以发送两种类型的电子邮件:发送给订阅者表中的所有人的电子邮件,或仅发送给组成员的电子邮件。我想我真的不需要包括发送给小组成员的电子邮件,因为它们是发送给小团体的电子邮件,而不是发送给大(所有订户)团体的电子邮件 我试图弄清楚如何构造数据库,使其有意义,但我甚至很难解释它应该如何工作 你对这类事情有什么经验可以分享吗?我应该如何构建数据库以跟踪等待发
你对这类事情有什么经验可以分享吗?我应该如何构建数据库以跟踪等待发送的电子邮件?使用联接表将待处理的电子邮件链接到用户。使用另一个联接表来管理组。当电子邮件发送给某个组时,可以使用存储过程将该组中所有成员的ID填充到EmailRecipients表中 表:
PendingEmails
ID
Subject
Body
EmailRecipients (join table)
EmailID
UserID
Users
ID
Groups (join table)
GroupID
UserID
使用联接表将挂起的电子邮件链接到用户。使用另一个联接表来管理组。当电子邮件发送给某个组时,可以使用存储过程将该组中所有成员的ID填充到EmailRecipients表中 表:
PendingEmails
ID
Subject
Body
EmailRecipients (join table)
EmailID
UserID
Users
ID
Groups (join table)
GroupID
UserID
您希望实现的是利用存储层的基本队列
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
);
您将使用有效的unix时间戳在邮件队列中输入条目,将组电子邮件排队。您应该创建一个组“All”,将每个用户分配给该组,以便您仍然可以正确地利用这些表。您可以这样运行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();
选择User.email
从邮件队列
上的内部加入用户组(MailQueue.Group\u id=User\u Group.id)
上的内部联接用户(User\u Group.User\u id=User.id)
WHERE MailQueue.time_to_send
您需要确保在使用结果集后将其删除,因为您不需要发送重复的电子邮件条目。如果您希望保留已发送电子邮件的日志,只需添加另一个
TINYINT(1)UNSIGNED
字段,指示sent\u email=1
,并修复SELECT
查询,仅在值为0时获取结果。您希望实现的是利用存储层的基本队列
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
);
您将使用有效的unix时间戳在邮件队列中输入条目,将组电子邮件排队。您应该创建一个组“All”,将每个用户分配给该组,以便您仍然可以正确地利用这些表。您可以这样运行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();
选择User.email
从邮件队列
上的内部加入用户组(MailQueue.Group\u id=User\u Group.id)
上的内部联接用户(User\u Group.User\u id=User.id)
WHERE MailQueue.time_to_send
您需要确保在使用结果集后将其删除,因为您不需要发送重复的电子邮件条目。如果您希望保留已发送电子邮件的日志,只需添加另一个TINYINT(1)UNSIGNED
字段,指示sent\u email=1
,并修复SELECT
查询,仅在值为0时获取结果。标题上写着“计划”,但我读到的是关于支持1+个收件人的内容。请记住,电子邮件服务器可以对电子邮件进行排队,并且只能按指定的时间间隔发送。标题上写着“计划”,但我读到的只是关于支持1+个收件人的内容。请记住,电子邮件服务器可以对电子邮件进行排队,并且只能按指定的时间间隔发送电子邮件。