Sql server 在SQL Server 2008中存储文档的最佳策略
我们的一个团队将开发一个应用程序,将记录存储在SQL2008数据库中,每个记录都有一个相关的PDF文件。目前大约有340GB的文件,大多数(70%)约为100K,但有些文件的大小为数兆字节。数据主要是插入和读取的,但文件有时会更新。我们正在就以下选择进行辩论:Sql server 在SQL Server 2008中存储文档的最佳策略,sql-server,sql-server-2008,blob,filestream,Sql Server,Sql Server 2008,Blob,Filestream,我们的一个团队将开发一个应用程序,将记录存储在SQL2008数据库中,每个记录都有一个相关的PDF文件。目前大约有340GB的文件,大多数(70%)约为100K,但有些文件的大小为数兆字节。数据主要是插入和读取的,但文件有时会更新。我们正在就以下选择进行辩论: 将文件作为blob存储在数据库中 将文件存储在数据库外部,并将路径存储在数据库中 使用SQL2008的Filestream功能存储文件 我们已经阅读了有关filestream数据的Micrsoft最佳实践,但由于文件大小不同,我们不确定选
因为在数据库中存储文件需要太多的空间。我绝对推荐(3)-这是专门为处理此功能而构建的场景,我认为它处理得非常好 这份白皮书有很多有用的信息——从安全的角度来看,它提到 使用FILESTREAM功能有两个安全要求。首先,必须为集成安全性配置SQL Server。其次,如果将使用远程访问,则必须通过任何防火墙系统启用SMB端口(445)
关于备份,请参阅此问题的公认答案-好的,我们开始吧。选项2是一个非常糟糕的主意-您最终会遇到不稳定的完整性约束和备份,这些约束和备份不能保证按照定义保持一致,因为您无法进行时间点备份。在大多数情况下都不是问题,当您进行更复杂的(时间点)恢复时,它会变成一个问题 选项1和选项3是相当平等的,尽管有一些影响
- Filestream可以使用更多的磁盘空间。基本上,每个版本都有一个guid,如果进行更新,旧文件将保留到下一次备份
- OTOH文件不计入db大小(express edition-如果您使用它,则不违反10gb限制),并且可以使用文件共享进一步访问。这增加了灵活性
- 在数据库中,关于访问的选项最为有限(web服务器无法在从sql获取路径后仅打开文件-它必须通过sql协议层将整个文件导入),但在文件(数量)较少方面具有优势。从战略上讲,把这些斑点放在一张单独的桌子上,然后再放一组单独的纺锤可能是个好主意
最后,问题是数据库的完整性和备份的方便性。SQL Server的赢家,除非你的数据太大,这意味着360 TB的数据。我使用了一种索引/内容方法,你没有列出,但它可能会有所帮助。您有一个文件表,这些文件存储为二进制代码块,具有唯一的id或行号。下一个SQL表将提供索引、文件名、路径、关键字、文件类型、文件大小、校验和。。。无论你需要什么。这是我见过的最好的存储文件的方法,可以处理成千上万的上传文档。查看文件时需要索引,因为如果用户不知道文件类型,则该文件对用户来说只是二进制文本。我们将数据存储在两个独立的数据库中,以便在一台服务器上进行索引,并在多台服务器上进行文件存储,以便于扩展。此时,索引表/数据库包含文件所在服务器的名称或键。如果用户有权读取特定的索引表,那么他们就有权访问该文件。您看过RBS(远程Blob存储)解决方案吗?如果使用Filestream RBS提供程序,它将在内部将blob保留为Filestream文件或varbinary(max)值,这取决于根据blob大小获得更好性能的方法
这种情况很简单:FILESTREAM建议说,当文件(平均)大于1MB时效果最好,这与您的情况不同,对于较小的对象,在数据库中存储varbinary(max)blob通常可以提供更好的流性能 因为您将直接从SQLServer而不是从文件系统访问文件,所以您应该使用blob存储它
阅读何时使用FILESTREAM:FILESTREAM选项如何?是的。这是值得的。好帖子,贝丝——糟糕的论点。好