存储要在数据库中执行的操作,还是从代码中决定?

时间:2017-02-08 05:27:07

标签: php database email cron structure

我有一个网站,我想在他们买东西后的几天内向客户发送一些后续电子邮件。我现在想知道该怎么做。我认为有两种选择:

  1. 在我的数据库中创建一个表格,我在其中存储我计划发送的电子邮件。所以我只是存储客户电子邮件地址和我想发送它的日期。然后我每天只运行一个cron并发送需要发送的电子邮件,并将表中的状态设置为" sent"。这种方法的优点是我知道需要发送哪些电子邮件。缺点是我的灵活性较差;更改发送电子邮件的天数并不容易,因为它们存储在数据库中。
  2. 我也可以通过简单地运行一个cron来完成代码,该cron获取x天前购买的客户列表,向他们发送电子邮件,只有然后存储事实我在数据库中发了一封电子邮件。这种方法的优点是我更灵活。如果我想稍后发送电子邮件,我可以在代码(或一些var)中定义。缺点是我没有要发送的电子邮件列表(虽然我不知道这对哪些有用)。
  3. 我的问题其实是;在这种情况下,最佳做法是什么?大多数网站如何处理这个以及为什么?

2 个答案:

答案 0 :(得分:0)

我会选择方法2.

缺点并非真正的不利。假设你有一个"命令"表,您可以获取要发送的邮件列表,只是查询与您的cron使用的查询非常相似。

但这是个人选择。我不知道通常使用哪种方法。

答案 1 :(得分:0)

我会继续两种选择的组合,这就是我在目前正在开发的系统中实际执行的方法。

准备发送"准备发送"列表对于记录和跟踪您的电子邮件很有用,例如,如果您使用第三方电子邮件解决方案,并且每月的电子邮件数量有限,您可以跟踪您在程序中使用的金额,甚至可能触发自动"升级"如果需要,可以使用该帐户,因为您需要更多电子邮件。

通过为该表设计一个好的模式,可以实现所需的灵活性。

您描述的解决方案将具有类似的架构,我想:

|---------|---------|------|---------|-------|
| send_to | subject | body | send_at | sent  |
|---------|---------|------|---------|-------|

这实际上并不灵活,因为一旦插入数据库,为了更改send_at列,您必须从订单中检索数据,并重新计算send_at值。

我建议这样的架构:

|---------|---------|------|-----------|---------|-------|
| send_to | subject | body | added_at  | send_in | sent  |
|---------|---------|------|-----------|---------|-------|

更改是send_at列现在未修复。运行cron时,您只会检索与以下查询匹配的电子邮件:

!sent && added_at + send_in >= now

这将返回与使用以下命令查询第一个模式相同的结果:

!sent && send_at >= now

但现在,您可以轻松更改电子邮件添加到队列的时间与实际发送时间之间的等待时间。