我目前正在计划一个主要使用sql server 2012后端构建的电子邮件存储和传送系统的新设计。
大多数架构都是针对电子邮件的实际创建而设置的,但我仍然不确定一个设计元素
在哪里存储已发送电子邮件的存档?
我应该将它们作为nvarchar(max)
存储在sql数据库中或实际将它们存储为文件系统本身的文件(例如.htm文件),然后只有一个指向存储在数据库中的文件的链接
与我目前存储照片的方式非常相似。
答案 0 :(得分:4)
我主张使用文件系统。
我几年前建立了一个电子邮件引擎,它在当时每小时发送了一百万条消息(这是一个非常重要的事情)。虽然通过数据库记录等具有可追溯性是有价值的,但我发现使用文件系统更容易管理。
我构建了一个半RESTful结构,如下所示:
我的电子邮件表仍然需要对电子邮件路径的引用,但可以根据[预定]电子邮件递送日期轻松计算。
为了专门解决您的SQL Server建议,我可以说我尝试完全按照您的建议存储电子邮件。最后,对于我的特定技术堆栈,我需要将我的文件写入磁盘以获得“在线版本”。如果你有动态的电子邮件写得像这样:
亲爱的[约翰史密斯],
感谢您对[XYZ] 的兴趣。
只需提供ID,当后端(.NET,Java,Rails等)提供文件时,处理变量替换就会非常容易。
http://myclient.emailserver.com/2013/10/29/the-most-brilliant-subject-line-ever?id=1234
最后但同样重要的是,您必须加重将这些电子邮件保存在数据库中的额外费用。 SQL Server是一个很棒的软件 - 就个人而言,我认为这是微软有史以来最好的东西 - 但这些电子邮件都是存档资料,它们只是为您的系统增加了批量。我不知道你试图建立的系统的规模,但即使有一亿封电子邮件(这并不难产生),你也在谈论一个很多的周长
希望这有帮助。
干杯!
答案 1 :(得分:2)
SMTP服务器通常已将它们以.eml
格式存储为文件。您可以选择保留它们并使用您的数据库对它们进行编目和索引,或者您可以将所有内容存储在数据库中,但我个人认为由于某些原因这样做是危险的:
您的数据库的大小会迅速增加,因为单个邮件可能会超过10MB,NVARCHAR会使用UNICODE,因此实际上是20MB。存储方面,这是一个非常低效的解决方案;
没有数据库服务器可以很好地处理可变长度数据,即使删除了内容,也可能会出现性能问题和数据库文件不断增大的情况;
Afaik每个表的限制为8TB,根据您的情况,这可能很小;
典型的备份会生成可能多TB的怪异文件。您必须创建一个自定义备份解决方案来管理它;
存储大量数据时,应考虑硬盘错误。如果某个扇区被破坏,您可能会丢失一个随机的电子邮件文件,这通常没问题。如果数据库文件被破坏,那将是一个灾难性的问题。较小的数据库占用较少的磁盘空间,并且使扇区损坏的风险较小。
答案 2 :(得分:1)
您不希望在sql中存储大量blob的原因之一是备份需要更长时间,并且不能轻易地拆分为可与SQL Server并发运行的单独文件服务器(或多个服务器)备份 - 当您使用SQL作为文件存储
时,单独使用此因素会造成很多麻烦