在 SQL Server 中存储数百万个 100kb 的 PDF

Posted

技术标签:

【中文标题】在 SQL Server 中存储数百万个 100kb 的 PDF【英文标题】:Storing millions of 100kb PDFs in SQL Server 【发布时间】:2019-12-12 10:56:18 【问题描述】:

我有一个软件可以检查每台工厂机器并生成大约 100kb 的 PDF 输出。这是 12 小时的计划任务。我有超过 18.000 台机器,并且随着新工厂的增加,它会增加。我在一个月内大约获得了数百万条 PDF 文档记录。如果机器出现任何问题,我还需要通过过滤选项向最终用户展示它们。

我在后端使用 C# ASP.NET 和 SQL Server 2014。

存储它们的有效方法是什么?直接在数据库中使用 nvarbinary(max) 还是使用文件系统?

我本来打算用文件服务器的,但是这个link让我很困惑,所以我想问一下。

-编辑-

在与我的经理讨论后,我们决定使用以下方法。感谢大家提供帮助的 cmets,你们贡献了很多。

我们将数据以文本格式存储在有意义的表结构中。当最终用户想要 PDF 时,我们将创建 PDF 并及时提供。不会存储它们。我们还将对 PDF 中的图像使用 S3 CDN,并将它们的元数据保存在 DB 中。

当需要新报告时,开发人员首先从 db 获取模板,使用报告编辑器实现详细信息,然后将此 xml 脚本连同用户参数(语言、权限等)发送到我们的 SOA(面向服务的架构)基于机制。我们的 SOA 引擎将评估请求,用正确的数据和语言填充 xml 脚本,渲染,然后发送回用户。

非常感谢。

【问题讨论】:

docs.microsoft.com/en-us/sql/relational-databases/blob/… 在 SQL Server 中查看 FILESTREAM 可能是个好主意 不要将文件存储为nvarchar(max)。可能varbinary(max) 启用FILESTREAM,但坦率地说:这尖叫“文件系统” 再次为 FILESTREAM 投票 我希望 Azure 存储在您的数据库中有元数据。 【参考方案1】:

如果您要写入的 PDF 几乎相同,您可以将变量存储到数据库中。然后,当有人请求报告或任何报告时,您拉取 PDF 模板文件并用从数据库检索到的适当值填充它。

【讨论】:

同意。具有数据库中基础数据的按需 PDF 似乎更有用,尤其是如果您想以编程方式处理内容,因为尝试从预制 PDF 中提取数据将有其自身的挑战。 是的,它们大部分是相同的,它们经过了一些检查,例如它是否工作,它运行了多长时间等。我打算将它们概括为模板并使用模板创建 PDF ,但每台机器都必须有当时的 PDF。 这个要求(当时每台机器都必须有一个 PDF)看起来很奇怪,在我看来,这会让你走上糟糕的道路。为什么要创建数以百万计的 PDF 并让它们一无所获?您的经理终其一生都无法查看所有这些文件。将要放入 PDF 的数据存储在数据库中,并在需要时使用该数据动态构建 PDF【参考方案2】:

我有一个软件可以检查每台工厂机器并生成大约 100kb 的 PDF 输出。

您有两个选择,第一个是不生成 PDF 作为输出,而是生成文本,因为您可以比 PDF 更有效地存储文本。

我要猜测一下,根据您说您已经拥有 18,000 家工厂,这可能为时已晚,在这种情况下,将 pdf 存储在文件系统中并将其位置存储在数据库中.

【讨论】:

这个项目在几家工厂运行,他们总共有超过 18k 台机器。但我将使用 PDF 提供一个新架构,因此您可能会将这个项目视为一个新项目。您是否建议我将输出存储为文本,当用户想要查看时,只需创建一个 PDF? 没错,我认为用实际文件来膨胀关系数据库是个坏主意,因为它并不是专门为该用例设计的。最好只按需创建 PDF【参考方案3】:

当您处理大量数据时,请不要使用 PDF 文件存储在数据库中,而是使用 SQL DB 设计的表结构数据,如果您有类似的数据结构,请使用 PDF 变量模板您的 PDF 文件。

您的顺序是:进程(可能还包括 DB)> PDF > DB

应该是:进程 > DB > PDF

此外,如果您的文件还包含一些几何和图形数据,请使用示例文件更详细地描述您的问题,以便我们也能提供帮助。

【讨论】:

以上是关于在 SQL Server 中存储数百万个 100kb 的 PDF的主要内容,如果未能解决你的问题,请参考以下文章

比较数百万个 mongoDB 记录中的变化的最佳方法

批量地理定位数百万个 IP

将数百万个文件从根 AZStorageBlob 复制到子文件夹

在 OpenGL 中实例化数百万个对象

在 OpenGL 中实例化数百万个对象:提高每秒帧数

如何在 C++ 中使用 Slot Map / Object Pool 模式管理数百万个游戏对象?