在SQL Server 2008中存储文档的最佳策略

时间:2010-09-30 18:10:37

标签: sql-server sql-server-2008 blob filestream

我们的一个团队将开发一个应用程序来存储SQL2008数据库中的记录,并且每个记录都有一个相关的PDF文件。目前有大约340GB的文件,大多数(70%)大约是100K,但有些是几兆字节。数据主要是插入和读取,但文件有时会更新。我们正在讨论以下选项:

  1. 将文件存储为数据库中的BLOB。

  2. 将文件存储在数据库之外,并将路径存储在数据库中。

  3. 使用SQL2008的文件流功能存储文件。

  4. 我们已经阅读了有关文件流数据的Micrsoft最佳实践,但由于文件大小不同,我们不确定选择哪条路径。我们倾向于选项3(文件流),但有一些问题:

    1. 根据上面提到的数据量和文件大小,您会选择哪种架构?

    2. 数据访问将使用SQL身份验证完成,而不是Windows身份验证,并且Web服务器可能无法使用Windows API访问这些文件。这会使filstream的表现比其他两个选项差吗?

    3. 由于SQL备份包含文件流数据,因此会导致非常大的数据库备份。其他人如何使用大量文件流数据处理备份数据库?

6 个答案:

答案 0 :(得分:7)

好的,我们走了。选项2是一个非常糟糕的主意 - 您最终会遇到不可测试的完整性约束和备份,因为您无法进行时间点备份,因此无法保证每个定义的一致性。在MOST场景中不是问题,只要你有更复杂的(时间点)恢复,就会变成一个。

选项1和3非常相同,尽管有一些含义。

  • Filestream可以使用更多的磁盘空间。基本上,每个版本都有一个guid,如果你进行更新,旧文件会保留到下一次备份。
  • OTOH文件不算作数据库大小(快速版本 - 如果您使用它,则不会违反10gb限制),并且使用文件共享可以进一步降低访问权限。这增加了灵活性。

  • 在数据库中有关于访问的最有限选项(从sql获取路径后,Web服务器无法打开文件 - 它必须通过sql协议层汇集整个文件)但是关于具有较少文件(数字)的优点。将blob放入一个单独的表中,并且一个单独的一组主轴可能在战略上是一个好主意。

关于你的问题:

1:我会选择数据库存储。试试两个 - 文件流而不是。无论如何,当您使用相同的API时,这是表定义中的一个简单更改。

2:是的,比直接文件访问更糟糕,但它比直接文件访问更受保护。否则我认为文件流和blob没有显着差异。

3:你在哪里有一个巨大的备份?很抱歉问,但你的340gb并不是一个大型数据库。无论如何你需要支持它。最好在一个一致的状态下执行,这是您使用数据库存储实现的。加上完整性(没有人在不清理数据库的情况下意外删除未使用的文档)。数据库并没有比进行拆分大得多,而且它是一个简单的一个地方备份。

最后,问题是数据库的完整性和易于备份的问题。除非你变大,否则赢得SQL Server - 这意味着360TB的数据。

答案 1 :(得分:1)

将文件存储在数据库之外,并将路径存储在数据库中。

因为在数据库中存储文件需要太多空间。

答案 2 :(得分:0)

我肯定会推荐(3) - 这种情况是专门为处理这个功能而设计的,在我看来它处理得非常好。

本白皮书有很多有用的信息 - http://msdn.microsoft.com/en-us/library/cc949109(SQL.100).aspx - 从安全的角度来看,提到......

  

使用FILESTREAM功能有两个安全要求。首先,必须配置SQL Server以实现集成安全性。其次,如果将使用远程访问,则必须通过任何防火墙系统启用SMB端口(445)。

关于备份,请参阅此问题的已接受答案 - SQL Server FILESTREAM limitation

答案 3 :(得分:0)

我使用了您未列出的索引/内容方法,但它可能有所帮助。您有一个文件表,这些文件存储为具有唯一ID或行号的二进制代码块。下一个SQL表将提供索引,文件名,文件名,关键字,文件类型,文件大小,校验和...您需要什么。这是我见过的最好的存储文件,用于处理数以千计的上传文档。索引是查看文件所必需的,因为如果文件不知道文件类型是什么,它只是用户的二进制文本。我们将数据存储在2个独立的数据库中,以允许一个服务器上的索引和多个服务器上的文件存储,以便轻松扩展。此时,索引表/数据库包含文件所在服务器的名称或密钥。如果用户有权读取该特定索引表,则他们可以访问该文件。

答案 4 :(得分:0)

您是否查看了RBS(远程Blob存储)解决方案?如果您使用Filestream RBS提供程序,它将在内部将您的blob保留为Filestream文件或varbinary(max)值,具体取决于根据blob大小获得更好的性能。

Remote BLOB Store Provider Library Implementation Specification

SQL Remote Blob Storage Team Blog

答案 5 :(得分:0)

这种情况很简单:当文件(平均)大于1MB时,FILESTREAM推荐说最好,对于较小的对象,在数据库中存储varbinary(max)BLOB通常提供更好的流量性能。

由于您将直接从SQL Server访问文件而不是文件系统,因此您应该使用BLOB存储它。

了解何时使用FILESTREAM:http://technet.microsoft.com/en-us/library/bb933993%28v=sql.105%29.aspx