将电子邮件正文存储在 SQL 服务器数据库中?

Storing Email Body in SQL Server database?

伙计们,我正在为我的客户构建一个批量电子邮件发送应用程序,现在我正在设计数据库架构。基本上每天会有数十万封电子邮件,我需要将它们存储在数据库中。

在数据库中存储电子邮件正文的最佳方式是什么?我是将它们存储在 varchar(max) 列中,还是将它们保存在文件系统中并将它们的路径保存在数据库中?或者还有其他方法吗?我只担心应用程序的性能。顺便说一句,我正在使用 SQL Server 2008 R2。

只需使用 varchar(max),因为它是将所有数据保存在数据库中的最简单的选择,因此您可以迁移、复制或任何数据库,所有内容都将保持完好无损。将部分数据存储在数据库之外只会使事情变得复杂而没有任何好处。

数据部分的性能不会有问题,但在收到垃圾邮件^H^H^H^H 邮件时会遇到更大的问题。

从一开始就考虑数据清理,因为随着时间的推移,单独存储每封电子邮件会占用一些磁盘空间。有了合适的索引,数据量应该不是问题。

我不知道 SQL Server 2008 我使用 Mysql 它有 BLOB 或 TEXT 列。

我认为 SQL 服务器也有这种类型的字段。在 LONGBLOB 字段中,您可以存储大约 L + 4 个字节,其中 L < 2^32.

此外,您还可以存储任何附件。

一般来说,我不建议建立批量电子邮件发送活动,因为有很多事情要做才能避免considering your email as spam

但是,如果您决定自己动手,则需要决定电子邮件的内容,是否纯文本,HTML 可能包含嵌入的图像,...

您可以使用 varchar(max) 作为字段类型。性能不会是一个大问题,但请考虑考虑保留政策

如果您想将电子邮件保存为文件,那么您可以使用 FILESTREAM,如果您使用 SqlFileStream API,它会为您提供更好的性能

做到这一点的最好方法可能是不这样做 :) 您需要从客户那里准确了解他们为什么要这样做。人们通常会像这样存储大量数据,因为他们认为他们应该这样做,然后永远不会看它。如果您需要存储这些数据,存储多长时间,归档过程是怎样的?正如其他地方提到的那样,存储一个指向模板的指针然后插入值将是一种更紧凑的方法,但同样,只有在你真的需要时才这样做。将电子邮件作为文件存储在文件系统中并不是一个疯狂的想法,但要避免包含数千个文件的目录。

对于大型数据库,还有一点需要考虑的是灾难恢复策略——每天晚上备份需要多长时间,灾难恢复场景需要多长时间。您要保留多少在线和离线备份,您需要多少 space?在这方面,将 'application data' 和 'archived data' 放在单独的数据库中可能是一个很好的起点。

从技术 SQL 服务器的角度来看,有一些东西可以提供帮助,例如 table 分区和数据压缩,但了解需求仍然是最重要的起点。