22

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

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

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

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

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

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

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

以下是一些附加信息:

  • PDF 文件的大小约为 100 KB
  • 每月大约 1500 个订单/PDF 文件
  • 视窗服务器 2008 R2 / IIS 7.5
  • SQL Server 2008 SP1 速成版
  • 不太确定硬件,我相信一个 QuadCore Proc。和 4 GB 内存
  • 应用程序是用 ASP.NET Webforms 3.5 SP1 编写的

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

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

提前感谢您的回复!

有关的:

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

4

6 回答 6

27

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

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

介于两者之间的任何事情都有点折腾,真的。

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

于 2010-02-27T15:33:05.073 回答
2

这被多次询问有关存储图像的问题,但对这些问题的讨论仍然适用:

于 2010-02-27T15:35:03.007 回答
1

我建议反对将文件存储在 SQL 中。检索文件时增加了额外的开销。IIS 在提供文件方面确实非常高效,但是使用 SQL 是您现在引入了瓶颈的存储工具,因为您现在必须从 Web 服务器跳到 SQL Server 并返回来获取文件。

当您将文件存储在网络服务器上时,您的进程可以根据您列出的标准确定适当的文件,指向它并提供它。Documentum 和 Alfresco 等文档管理系统将文件存储在共享中,这使您在备份和冗余存储方面具有极大的灵活性。

于 2010-02-27T15:46:37.127 回答
1

我还将为文档创建一个单独的表,这样用于文档检索的搜索数据/关键字段将更加可缓存。您的数据库需要接触文档表的唯一时间是在插入或下载期间。

于 2010-02-27T15:40:58.707 回答
0

We ran in to a similar situation albeit in principle only. We needed a way by which documents stored to SharePoint could be accessed via a link on a web page. Since everything is project based with a unique project number the solution was to implement a common naming convention to the documents. s the web page is created server-side, the links are dynamically created. The code takes the base path to the SharePoint server and then adds the project number and specifics for the document.

Example:

[SharePoint Base Path][Project Numbe][Project Document Name]
[http://mysharepoint.mycompany.com/213990/213990_PC.pdf]
于 2013-02-12T00:08:01.297 回答
0

我对在 SQL 中存储大 blob 持怀疑态度,假设 sql 页面大小为 4k(疯狂)。当将文件提供给用户时,它必须在 nK 块中组装整个文件的片段。我不确定这是否是不是这样。

于 2010-02-27T16:02:46.953 回答