我应该在哪里将电子邮件内容存储在数据库或文件系统中?

时间:2013-10-29 21:03:34

标签: sql-server windows

我目前正在计划一个主要使用sql server 2012后端构建的电子邮件存储和传送系统的新设计。

大多数架构都是针对电子邮件的实际创建而设置的,但我仍然不确定一个设计元素

在哪里存储已发送电子邮件的存档?

我应该将它们作为nvarchar(max)

存储在sql数据库中

或实际将它们存储为文件系统本身的文件(例如.htm文件),然后只有一个指向存储在数据库中的文件的链接

与我目前存储照片的方式非常相似。

3 个答案:

答案 0 :(得分:4)

我主张使用文件系统。

我几年前建立了一个电子邮件引擎,它在当时每小时发送了一百万条消息(这是一个非常重要的事情)。虽然通过数据库记录等具有可追溯性是有价值的,但我发现使用文件系统更容易管理。

我构建了一个半RESTful结构,如下所示:

  • 客户(A)
    • 年份
          • 电子邮件主题
            • message.html
            • message.txt
              • 图片
除了是一个简单的文件结构,它还使管理其他文件依赖性更容易。电子邮件通常包括图像,文件附件等,并将捆绑在同一电子邮件资源文件夹中的文件保持在一起,降低了复杂性。

我的电子邮件表仍然需要对电子邮件路径的引用,但可以根据[预定]电子邮件递送日期轻松计算。

为了专门解决您的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格式存储为文件。您可以选择保留它们并使用您的数据库对它们进行编目和索引,或者您可以将所有内容存储在数据库中,但我个人认为由于某些原因这样做是危险的:

  1. 您的数据库的大小会迅速增加,因为单个邮件可能会超过10MB,NVARCHAR会使用UNICODE,因此实际上是20MB。存储方面,这是一个非常低效的解决方案;

  2. 没有数据库服务器可以很好地处理可变长度数据,即使删除了内容,也可能会出现性能问题和数据库文件不断增大的情况;

  3. Afaik每个表的限制为8TB,根据您的情况,这可能很小;

  4. 典型的备份会生成可能多TB的怪异文件。您必须创建一个自定义备份解决方案来管理它;

  5. 存储大量数据时,应考虑硬盘错误。如果某个扇区被破坏,您可能会丢失一个随机的电子邮件文件,这通常没问题。如果数据库文件被破坏,那将是一个灾难性的问题。较小的数据库占用较少的磁盘空间,并且使扇区损坏的风险较小。

答案 2 :(得分:1)

您不希望在sql中存储大量blob的原因之一是备份需要更长时间,并且不能轻易地拆分为可与SQL Server并发运行的单独文件服务器(或多个服务器)备份 - 当您使用SQL作为文件存储

时,单独使用此因素会造成很多麻烦