代码之家  ›  专栏  ›  技术社区  ›  DCNYAM

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

  •  13
  • DCNYAM  · 技术社区  · 14 年前

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

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

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

    3. 使用sql2008的filestream功能存储文件。

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

    1. 考虑到上述数据量和文件大小,您会选择哪种架构?

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

    3. 由于SQL备份包括文件流数据,这将导致非常大的数据库备份。其他人如何处理具有大量文件流数据的备份数据库?

    6 回复  |  直到 10 年前
        1
  •  7
  •   Dave K    12 年前

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

    选项1和3是相当平等的,尽管有一些含义。

    • 文件流可以使用更多的磁盘空间。基本上,每个版本都有一个guid,如果进行更新,旧文件将一直保留到下一次备份。
    • o这些文件不算作数据库大小(Express Edition—如果使用它,则不超过10GB的限制),使用文件共享可以进一步降低访问权限。这增加了灵活性。

    • 在数据库中,关于访问的选项是最有限的(Web服务器无法在从SQL获取路径后打开文件-它必须通过SQL协议层将整个文件漏斗形排列),但在文件(数字)较少方面具有优势。把这些碎片放在一张单独的桌子上,一套单独的纺锤也许是一个战略上的好主意。

    关于你的问题:

    1:我会去数据库存储。同时尝试-filestream和not。不管怎样,当您使用相同的API时,这只是表定义中的一个简单更改。

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

    3:你在哪里有巨大的后援?不好意思问,但您的340GB并不完全是一个大型数据库。无论如何,你需要备份它。最好在一个一致的状态下完成,这就是使用DB存储所能实现的。加上完整性(没有人在不清理数据库的情况下意外删除未使用的文档)。数据库并没有明显大于进行分割,它是一个简单的一处备份。

    最后,问题是数据库的完整性和备份的容易性。赢得SQL Server,除非你得到大的-这意味着360兆字节的数据。

        2
  •  1
  •   Beth    14 年前

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

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

        3
  •  0
  •   Community M-A    7 年前

    我肯定会推荐(3)-这是一种专门为处理而构建的场景,在我看来,它处理得非常好。

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

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

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

        4
  •  0
  •   jumpcutking    14 年前

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

        5
  •  0
  •   Pawel Marciniak    14 年前

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

    Remote BLOB Store Provider Library Implementation Specification

    SQL Remote Blob Storage Team Blog

        6
  •  0
  •   JorSol    10 年前

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

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

    读取何时使用文件流: http://technet.microsoft.com/en-us/library/bb933993%28v=sql.105%29.aspx