将PDF文件存储为SQL Server中的二进制对象,是或否?

Sla*_*uma 20 sql-server asp.net database-design binary-data

我必须为以下任务找到设计决策:

我有一个SQL Server数据库,它包含一个订单表.用户可以通过从网页上传的简单文件上传PDF文档并将其分配给订单.每个订单不超过一个文档(可能没有文档,从不超过一个).为此,用户打开网页,输入订单号,显示订单并单击上传按钮.所以我知道上传的文件属于哪个顺序.

现在我正在考虑将两种文件存储在Web服务器上的选项:

1)通过varbinary(MAX)列扩展我的订单表,并将PDF文档直接存储到该二进制字段中.

2)将PDF文件保存在磁盘上的特定文件夹中,并为其指定与订单相关的唯一名称(例如,我的订单号是数据库中的主键,或者是我可以存储在其他列中的GUID).订购表).也许我必须将文件存储在子文件夹中,每月一个,并将子文件夹名称存储到数据库的订单行中,以避免在一个文件夹中获取过多的文件.

存储PDF文件后,可以在输入相关订单号后通过浏览器下载和查看.

我倾向于选项(1),因为数据管理似乎更容易让我在一个数据库中拥有所有相关数据.但是我有点担心随着时间的推移我会遇到性能问题,因为我的数据库大小比解决方案(2)增长得快得多.大约90%甚至95%的数据库总大小仅由那些存储的PDF文件组成.

以下是一些其他信息:

  • PDF文件的大小约为100千字节
  • 每月大约1500个订单/ PDF文件
  • Windows Server 2008 R2/IIS 7.5
  • SQL Server 2008 SP1 Express
  • 不太确定硬件,我相信一个QuadCore Proc.和4 GB RAM
  • 应用程序是用ASP.NET Webforms 3.5 SP1编写的

(我知道在使用上述数字大约2年后,我将达到SQL Server Express版本的4GB限制.但我们可以忽略这一点,从数据库中删除旧数据或升级到完整许可证将是可能的选择.)

我的问题是:选项的Pro和Contra是什么,你会推荐什么?也许某人有类似的任务,可以报告他的经历.

提前谢谢你的回复!

有关:

在DB中存储图像 - 是还是不?

mar*_*c_s 24

对于SQL Server 2008,当您拥有大小为1 MB或更大的文档时,建议使用FILESTREAM功能.这是基于Microsoft Research发布的一篇名为To BLOB的论文或者不是BLOB的论文,该论文分析了在数据库中存储blob的优缺点 - 很棒的阅读!

对于平均小于256K的文档,将它们存储在VARBINARY(MAX)列中似乎是最合适的.

两者之间的任何东西都是有点折腾,真的.

你说你的PDF文档大多在100K左右 - >那些将非常好地存储到SQL Server表中,没问题.您可能想要考虑的一件事是为链接到主要事实表的文档提供单独的表.这样,事实表的使用速度会更快,并且文档不会妨碍您的其他数据.