Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL Server 2008中存储文档的最佳策略_Sql Server_Sql Server 2008_Blob_Filestream - Fatal编程技术网

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

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最佳实践,但由于文件大小不同,我们不确定选

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

  • 将文件作为blob存储在数据库中

  • 将文件存储在数据库外部,并将路径存储在数据库中

  • 使用SQL2008的Filestream功能存储文件

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

  • 鉴于上述数据量和文件大小,您会选择哪种体系结构

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

  • 由于SQL备份包括filestream数据,这将导致非常大的数据库备份。其他人如何使用大量filestream数据备份数据库

  • 将文件存储在数据库外部,并将路径存储在数据库中


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

    我绝对推荐(3)-这是专门为处理此功能而构建的场景,我认为它处理得非常好

    这份白皮书有很多有用的信息——从安全的角度来看,它提到

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


    关于备份,请参阅此问题的公认答案-

    好的,我们开始吧。选项2是一个非常糟糕的主意-您最终会遇到不稳定的完整性约束和备份,这些约束和备份不能保证按照定义保持一致,因为您无法进行时间点备份。在大多数情况下都不是问题,当您进行更复杂的(时间点)恢复时,它会变成一个问题

    选项1和选项3是相当平等的,尽管有一些影响

    • Filestream可以使用更多的磁盘空间。基本上,每个版本都有一个guid,如果进行更新,旧文件将保留到下一次备份
    • OTOH文件不计入db大小(express edition-如果您使用它,则不违反10gb限制),并且可以使用文件共享进一步访问。这增加了灵活性

    • 在数据库中,关于访问的选项最为有限(web服务器无法在从sql获取路径后仅打开文件-它必须通过sql协议层将整个文件导入),但在文件(数量)较少方面具有优势。从战略上讲,把这些斑点放在一张单独的桌子上,然后再放一组单独的纺锤可能是个好主意

    关于你的问题:

    1:我会选择数据库存储。请同时尝试这两种方法-filestream和not。由于您仍然使用相同的API,这是表定义中的一个简单更改

    2:是的,比直接文件访问更糟糕,但比直接文件访问更受保护。否则,我不认为filestream和blob有显著区别

    3:你在哪里有庞大的后备力量?很抱歉,您的340gb数据库并不是一个很大的数据库。无论如何,你都需要备份它。最好在一个一致的状态下执行,这就是使用db存储所实现的。加上完整性(没有人会在不清理数据库的情况下意外删除未使用的文档)。DB并没有比拆分大多少,它是一个简单的单位置备份


    最后,问题是数据库的完整性和备份的方便性。SQL Server的赢家,除非你的数据太大,这意味着360 TB的数据。

    我使用了一种索引/内容方法,你没有列出,但它可能会有所帮助。您有一个文件表,这些文件存储为二进制代码块,具有唯一的id或行号。下一个SQL表将提供索引、文件名、路径、关键字、文件类型、文件大小、校验和。。。无论你需要什么。这是我见过的最好的存储文件的方法,可以处理成千上万的上传文档。查看文件时需要索引,因为如果用户不知道文件类型,则该文件对用户来说只是二进制文本。我们将数据存储在两个独立的数据库中,以便在一台服务器上进行索引,并在多台服务器上进行文件存储,以便于扩展。此时,索引表/数据库包含文件所在服务器的名称或键。如果用户有权读取特定的索引表,那么他们就有权访问该文件。

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


    这种情况很简单:FILESTREAM建议说,当文件(平均)大于1MB时效果最好,这与您的情况不同,对于较小的对象,在数据库中存储varbinary(max)blob通常可以提供更好的流性能

    因为您将直接从SQLServer而不是从文件系统访问文件,所以您应该使用blob存储它


    阅读何时使用FILESTREAM:

    FILESTREAM选项如何?是的。这是值得的。好帖子,贝丝——糟糕的论点。好