【发布时间】:2019-12-23 16:38:54
【问题描述】:
这是我知道的一个老问题,但是使用 SQL Server 2012 是否最终可以将文件存储在数据库中,或者它们真的应该保存在文件系统中,只在数据库中引用它们?
如果现在认为将它们存储在数据库中是可以接受的,那么最有效的方法是什么?
我正计划应用加密,因此我很欣赏处理不会很快。
【问题讨论】:
-
不确定我是否这样做。我只是想知道它现在是否是一个可行的选择。
标签: sql-server
这是我知道的一个老问题,但是使用 SQL Server 2012 是否最终可以将文件存储在数据库中,或者它们真的应该保存在文件系统中,只在数据库中引用它们?
如果现在认为将它们存储在数据库中是可以接受的,那么最有效的方法是什么?
我正计划应用加密,因此我很欣赏处理不会很快。
【问题讨论】:
标签: sql-server
微软研究院有一篇非常好的论文,叫做To Blob or Not To Blob。
他们经过大量的性能测试和分析后得出的结论是:
如果您的图片或文档的大小通常低于 256K,则将它们存储在数据库的 VARBINARY 列中会更有效
在这两者之间,根据你的使用情况有点折腾
如果您决定将图片放入 SQL Server 表中,我强烈建议您使用单独的表来存储这些图片 - 不要将员工照片存储在员工表中 - 将它们保存在单独的表中。这样一来,Employee 表就可以保持精简、平均和非常高效,假设您并不总是需要选择员工照片作为查询的一部分。
对于文件组,请查看 Files and Filegroup Architecture 了解简介。基本上,您可以从一开始就为大型数据结构创建带有单独文件组的数据库,或者稍后添加一个额外的文件组。我们称之为“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 介绍,并尝试使用它!
【讨论】:
VARBINARY(MAX) 存储在单独的文件组中,如果您有单独的“文件”表,您是将整个表存储在单独的文件组中还是将文件“元”数据存储在标准文件组并将VARBINARY(MAX) 存储在新文件组中?
FILETABLE 功能吗?在那里,只有关于文件的元数据存储在 SQL Server 中(如FILESTREAM) - 实际文件(组成它的字节)存储在数据库之外的磁盘驱动器上
仍然没有简单的答案。这取决于你的场景。 MSDN has documentation to help you decide.
这里还介绍了其他选项。您可以使用 SQL Server 2012 中的 FileStream 或 File Table,而不是直接存储在文件系统中或存储在 BLOB 中。File Table 的优点似乎很简单(但我承认我没有亲身体验过它们) .)
这篇文章绝对值得一读。
【讨论】:
您可以阅读FILESTREAM。以下是文档中的一些信息,可以帮助您做出决定:
如果满足以下条件,则应考虑使用 FILESTREAM:
- 正在存储的对象平均大于 1 MB。
- 快速读取访问很重要。
- 您正在开发将中间层用于应用程序逻辑的应用程序。
对于较小的对象,将 varbinary(max) BLOB 存储在数据库中通常可以提供更好的流式传输性能。
【讨论】: