asp.net - 将 PDF 文件作为二进制对象存储在 SQL Server 中,是还是否?

标签 asp.net sql-server database-design binary-data

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

我有一个 SQL Server 数据库,它包含一个订单表。用户将通过简单的网页文件上传来上传 PDF 文档并分配给订单。每个订单不超过一份文档(也许没有文档,但绝不会超过一份)。为此,用户打开网页,输入订单号,显示订单并单击上传按钮。这样我就知道上传的文档属于哪个顺序了。

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

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

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

PDF文件存储后,输入相关订单号即可通过浏览器下载并查看。

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

以下是一些附加信息:

  • 每个 PDF 文件的大小约为 100 KB
  • 每月约 1500 个订单/PDF 文件
  • Windows Server 2008 R2/IIS 7.5
  • SQL Server 2008 SP1 Express
  • 不太确定硬件,我相信一个四核处理器。和 4 GB 内存
  • 应用程序是用 ASP.NET Webforms 3.5 SP1 编写的

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

我的问题是:这些选项的优点和缺点是什么?您会推荐什么?也许有人有类似的任务并且可以报告他的经验。

提前感谢您的回复!

Related:

Storing Images in DB - Yea or Nay?

最佳答案

使用 SQL Server 2008,当您的文档大小大多为 1 MB 或更大时,建议使用 FILESTREAM 功能。这是基于微软研究院发表的一篇名为 To BLOB or not to BLOB 的论文它详分割析了在数据库中存储 blob 的优缺点 - 读得很好!

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

确实,介于两者之间的任何事情都有点难以抉择。

您说您将拥有大约 100K 左右的 PDF 文档 -> 这些文档可以很好地存储到 SQL Server 表中,没问题。您可能需要考虑的一件事是为链接到主事实表的文档建立一个单独的表。这样,事实表的使用速度会更快,并且文档不会妨碍您的其他数据。

关于asp.net - 将 PDF 文件作为二进制对象存储在 SQL Server 中,是还是否?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2347842/

相关文章:

c# - 在非 Web 应用程序上使用 SignalR

c# - 使用 Entity Framework 的模型上的显示名称

asp.net - 更改生成的 ASP.Net <form> id?

使用 COALESCE 或窗口函数进行 SQL 过滤

database - 我在这个数据库设计上是否走在正确的轨道上?

postgresql - Postgres UNIQUE 约束是否意味着索引?

c# - 如何更改 asp.net 页面服务器端的标记(来自 .cs 文件)

sql - 如何在表中查找计算字段

sql-server - TSQL 触发器维护增量订单完整性

sql-server - SQL Server - 空列的性能/大小缺点