在文件系统中存储文件还是在SQL Server中作为varbinary(MAX)存储?

5

我知道在是否将文件作为Blob存储在数据库中存在很多争议,但我只想了解这在我的情况下是否有意义。

我正在创建一个ASP.NET应用程序,该应用程序在大公司内部使用,用户需要能够将文件附加到系统中的“工作”上。这些文件通常是PDF或Word文档,可能永远不会超过几MB。

我正在创建一个新表,如下所示:

ID (int)
JobID (int)
FileDescription (nvarchar(250))
FileData (varbinary(MAX)

这里使用varbinary(MAX)是否合适,还是应该将文件路径存储起来,并将文件存储在文件系统中?

Filestream 可以让你兼顾两个世界——它们被存储为文件,但 SQL 也能识别它们,它们是任何事务的一部分等。 - Damien_The_Unbeliever
你应该检查这个问题https://dev59.com/OnVD5IYBdhLWcg3wXaYd - Gonzalo.-
1个回答

7

微软研究有一篇非常好的论文,名为To Blob or Not To Blob

他们在大量性能测试和分析之后得出结论:

  • 如果您的图片或文档通常小于256K,则将它们存储在数据库的 VARBINARY 列中更有效率。

  • 如果您的图片或文档通常超过1MB,则将它们存储在文件系统中更有效率(并且使用 SQL Server 2008 的 FILESTREAM 属性,它们仍然受事务控制并成为数据库的一部分)。

  • 在这两者之间,根据您的使用情况而定。

如果您决定将您的图片放入 SQL Server 表中,我强烈建议使用单独的表来存储那些图片-不要将员工照片存储在员工表中-将它们保留在单独的表中。这样,假设您不总是需要选择员工照片作为查询的一部分,Employee 表可以保持精简、高效。

对于文件组,请查看文件和文件组架构以了解简介。基本上,您要么从一开始就为大型数据结构创建一个单独的文件组,要么稍后添加一个附加文件组。让我们称其为LARGE_DATA
现在,每当您需要创建一个新表来存储VARCHAR(MAX)VARBINARY(MAX)列时,您可以指定此文件组用于大型数据:
 CREATE TABLE dbo.YourTable
     (....... define the fields here ......)
     ON Data                   -- the basic "Data" filegroup for the regular data
     TEXTIMAGE_ON LARGE_DATA   -- the filegroup for large chunks of data

查看MSDN关于文件组的介绍,并进行实践!


那篇论文《使用Blob还是不使用Blob》与SQL Server 2005有关,而varbinary是在SQL Server 2008中引入的,因此它可能并不完全相关。 - StuartN
1
@StuartN:VARBINARY(MAX)在SQL Server 2005中是可用的 - 确实如此。新的FILESTREAM属性是在2008年添加的,没错。 - marc_s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接