将图像存储在数据库中

时间:2009-07-01 22:17:07

标签: database image sql-server-2008 blob

  

可能重复:
  Storing Images in DB - Yea or Nay?

多年来,我被告知不要将数据存储在数据库中,也不要将任何大型BLOB存储在该数据库中。虽然我可以理解为什么数据库没有/没有效率,我从来没有理解为什么他们不能。如果我可以将文件放在某处并引用它,为什么数据库引擎也不能这样做。我很高兴Damien Katz在最近的Stack Overflow播客中提到它,Joel Spolsky和Jeff Atwood,至少默默地同意了。

我一直在阅读Microsoft SQL Server 2008应该能够有效处理BLOB的提示,这是真的吗?如果是这样,有什么阻止我们在那里存储图像并摆脱一个问题?我能想到的一件事是,虽然图像可以很快地由静态Web服务器提供,如果它是某个文件,当它在数据库中时,它必须从数据库传输到Web服务器应用程序(这可能比静态Web服务器)然后它被服务。不应该缓存帮助/解决最后一个问题吗?

5 个答案:

答案 0 :(得分:11)

是的,确实如此,SQL Server 2008刚刚实现了一个像你提到的功能,它被称为文件流。如果你确定你只想为你的应用程序使用SQL Server(或者愿意为性能付出代价或者在新的基础上开发类似的层),这对于在数据库中存储blob确实是一个很好的论据。数据库服务器)。虽然我预计如果不同的数据库服务器已经存在类似的层,它们将开始出现。

一如既往,真正的好处取决于具体情况。如果您将提供大量相对静态的大文件,那么考虑到性能/可管理性组合,此方案加上缓存可能是最佳选择。

This white paper描述了SQL Server 2008的FILESTREAM功能,它允许使用SQL Server 2008和NTFS文件系统的组合来存储和有效访问BLOB数据。它涵盖了BLOB存储的选择,配置Windows和SQL Server以使用FILESTREAM数据,将FILESTREAM与其他功能相结合的注意事项,以及分区和性能等实现细节。

答案 1 :(得分:4)

仅仅因为你可以做某事并不意味着你应该这样做。

如果您关心效率,那么对于任何足够大规模的文件服务,您仍然很可能不希望这样做。

看起来这个话题已经过大量讨论......

答案 2 :(得分:2)

我会尝试分解您的问题并尽可能地解决您的各个部分。

  • SQL Server 2008和文件流类型 - 上面的Vinko答案是迄今为止我见过的最好的答案。 Filestream类型是您正在寻找的SQL Server 2008。 Filestream在版本1中,因此仍然有一些原因我不建议将if用于企业应用程序。例如,我的回忆是您无法跨多个Windows UNC路径拆分底层物理文件的存储。迟早会成为企业应用程序的一个非常严重的约束。

  • 在数据库中存储文件 - 在宏大的计划中,Damien Katz的原始方向是正确的。大多数大型企业内容管理(ECM)播放器将文件存储在文件系统中,并将元数据存储在RDBMS中。如果你走得更大,看看亚马逊的S3服务,你就会看到带有非关系型数据库后端的物理文件。除非您在数十亿的存储空间中测量文件,否则我不建议您使用此路线并自行滚动。

  • 关于数据库中文件的更多细节 - 乍一看,很多事情都代表着数据库中的文件。一个是简单性,两个是事务完整性。由于Windows文件系统无法在事务中登记,因此需要在数据库和文件系统中进行的写入需要内置事务补偿逻辑。在与DBA交谈之前,我并没有真正看到故事的另一面。他们通常不喜欢混合业务数据和blob(备份变得很痛苦)所以除非你有一个专门用于文件存储的单独数据库,否则这个选项通常不会对DBA有吸引力。你是对的,数据库会更快,所有其他条件都相同。不知道你的应用程序的用例,我不能说缓存选项。可以这么说,在许多企业应用程序中,文档的缓存命中率太低,无法证明缓存它们。

希望这有帮助。

答案 3 :(得分:1)

关于在数据库中存储blob的谨慎的一个经典原因是数据将在事务控制下进行存储和编辑(更改),这意味着DBMS需要确保它可以回滚更改并在之后恢复更改崩溃。这通常通过事务日志主题的一些变化来完成。如果DBMS要在2 GB blob中记录更改,那么它必须能够识别已更改的内容。这可能是简单的(前映像和后映像)或更复杂(某种二进制增量操作),这在计算上更昂贵。即便如此,有时最终结果将是通过日志存储的千兆字节数据。这会损害系统性能。有多种方法可以限制更改的影响 - 减少流经日志的数据量 - 但需要权衡利弊。

在数据库中存储文件名的代价是DBMS无法控制(通常)文件何时更改 - 因此数据的可重复性也会受到影响;你不能保证DBMS之外的东西没有改变数据。 (这个论点有一个非常通用的版本 - 你不能确定有人一般没有篡改数据库存储文件。但我指的是在数据库中存储一个文件名,引用一个不受数据库控制的文件。 DBMS。由DBMS控制的文件受到无特权的保护,以防止随意更改。)

新的SQL Server功能听起来很有趣。我没有探究它的作用,所以我无法评论它避免或限制上述问题的程度。

答案 4 :(得分:0)

SQL Server中有一些选项可以管理存储大量数据的位置,这些选项自SQL2005以来一直存在,所以我不知道为什么你不能存储大量的BLOB数据。例如,MOSS将您上传到的所有文档存储在SQL数据库中。

当然有一些性能影响,就像几乎任何事情一样,所以你应该注意不要在不需要它的情况下检索blob,并且不要将它包含在索引等中。