2011-06-15 39 views
1

对于一个应用程序,我需要每小时向最终用户发送个性化的邀请电子邮件。这些用户的电子邮件地址和其他信息都在数据库中。带有业务逻辑的视图vs代码

  • 具有一个位 Planned.IsPlannable集到True和 所有用户都具有一个Planned.DateStart和一定 周期之间的 Planned.DateEnd可用于接收 电子邮件消息。
  • 约有350条消息发送每小时
  • 消息中必须包含 的所有信息是数据库中的 。
  • 的应用程序是一个 .NET4.0控制台应用程序,数据 访问我用Subsonic3.0

至少有两种情况可供选择:通过检索相应的数据

1 :)查看类似:

SELECT [Computer].ComputerName, 
      [User].UserEmail, 
      [Planned].DateAvailable, 
      [Planned].DatePlanned 
FROM  [Computer] 
INNER JOIN 
      [Planned] ON [Computer.ComputerID] = [Planned.ComputerID] 
INNER JOIN 
      [User] ON [Computer].UserID = [User].UserID 
WHERE  (DATEDIFF(dd, GETDATE(), [Planned.DateAvailable]) < 10) 
      AND Planned.IsPlannable = 1 

组成的基础上,此视图的结果,此应用程序的C#代码中的相应消息

graph of the structure

2 :) 视图构造SQL服务器上整个消息和返回类似

[EmailTo] 
[Subject] 
[Body] 

然后仅遍历槽的结果以及从它

创建MailMessage对象

在这两种情况下我得到的消息,如:

foreach (vwGetInvitableComputer u in UserController.GetAllInvitableUsers()) 
{ 
    // where the usercontroller wraps the Subsonic logic. 
    // the composition happens here 
} 

对C#代码中的迭代槽进行迭代,并仅从该预先格式化的数据组成邮件消息。

什么情况下性能和资源明智选择?

更新:确实是有文本操作数据库的选项。然而,这是在messagbody到CompterName,DateStart和DateEnd.Perhaps更换三根弦,SQL-意见有足够的智慧来传播性能为此,虽然C#代码“请求时”做到了吗?

+0

“传播表现”是什么意思?你的意思是跨线程吗?您可以在C#中轻松地使用并行foreach或其他东西。 – 2011-06-15 13:11:56

回答

3

首先考虑:你能想象更改邮件格式的必要吗?如果不是那么它可能没有关系。

第二个考虑:你能想象一个时间,电子邮件需要更多的操作而不是SQL很容易实现吗?如果是这样,那么你绝对应该选择C#。

第三个考虑:重新部署对环境有多大的问题?

最后是一个替代选项:使用C#作为消息组合,但使用基于数据库或基于文件的模板,可以轻松更新。

+1

我知道这是一个有风险的问题,但我想知道是否有人有过这方面的经验。然而,你的考虑是好的,我坚持把我的BL放在应用中,而不是在DB中。 – 2011-06-16 05:54:24

0

我会选择选项2,组成使用视图或存储过程在服务器上传送电子邮件所需的所有信息。理想情况下,数据库调用应尽可能减少往返服务器的次数。

+0

我认为这是不好的建议。这是不需要的限制优化。在他的两个示例选项(如果他一举获得所有数据)中将访问相同数量的服务器。 SQL中的组合比C#更难(容易出错)。 – 2011-06-15 13:00:52

+0

很明显,我正在设想某种模板系统,如您的答案中所述;) – DaveRead 2011-06-15 13:12:40