这是我知道的一个老问题,但是使用 SQL Server 2012 最终可以将文件存储在数据库中,还是应该将它们真的保存在文件系统中,只在数据库中引用它们?
如果现在认为将它们存储在数据库中是可以接受的,那么最有效的方法是什么?
我计划应用加密,所以我很欣赏处理不会很快。
这是我知道的一个老问题,但是使用 SQL Server 2012 最终可以将文件存储在数据库中,还是应该将它们真的保存在文件系统中,只在数据库中引用它们?
如果现在认为将它们存储在数据库中是可以接受的,那么最有效的方法是什么?
我计划应用加密,所以我很欣赏处理不会很快。
Microsoft Research 有一篇非常好的论文,名为To Blob 或 Not To Blob。
他们经过大量的性能测试和分析后得出的结论是:
如果您的图片或文档的大小通常低于 256K,则将它们存储在数据库的 VARBINARY 列中会更有效
如果您的图片或文档的大小通常超过 1 MB,则将它们存储在文件系统中会更有效(并且使用 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 介绍,并尝试使用它!
仍然没有简单的答案。这取决于你的场景。 MSDN 有帮助您决定的文档。
这里还介绍了其他选项。您可以使用 SQL Server 2012 中的 FileStream 或 File Table,而不是直接存储在文件系统中或存储在 BLOB 中。File Table 的优点似乎很简单(但我承认我没有亲身体验过它们) .)
这篇文章绝对值得一读。
您可能会阅读FILESTREAM。以下是文档中的一些信息,可以帮助您做出决定:
如果满足以下条件,则应考虑使用 FILESTREAM:
- 正在存储的对象平均大于 1 MB。
- 快速读取访问很重要。
- 您正在开发将中间层用于应用程序逻辑的应用程序。
对于较小的对象,将 varbinary(max) BLOB 存储在数据库中通常可以提供更好的流式传输性能。