9

可能重复:
在数据库中存储图像 - 是还是不是?

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

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

4

5 回答 5

10

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

与往常一样,真正的好处是什么取决于特定的情况。如果您将提供大量相对静态的大文件,那么考虑到性能/可管理性组合,这种情况加上缓存可能是最佳选择。

本白皮书介绍了 SQL Server 2008 的 FILESTREAM 功能,该功能允许使用 SQL Server 2008 和 NTFS 文件系统的组合来存储和高效访问 BLOB 数据。它涵盖了 BLOB 存储的选择、配置 Windows 和 SQL Server 以使用 FILESTREAM 数据、将 FILESTREAM 与其他功能结合的注意事项以及分区和性能等实现细节。

于 2009-07-01T22:20:45.807 回答
4

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

如果您关心效率,您仍然很可能不想为任何足够大的文件服务执行此操作。

而且看起来这个话题已经被大量讨论了......

于 2009-07-01T22:29:38.003 回答
2

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

  • SQL Server 2008 和文件流类型- 上面 Vinko 的答案是我迄今为止见过的最好的答案。Filestream 类型是您正在寻找的 SQL Server 2008。Filestream 是第 1 版,所以我仍然有一些理由不建议将 if 用于企业应用程序。例如,我记得您不能将底层物理文件的存储拆分到多个 Windows UNC 路径中。这迟早会成为企业应用程序的一个非常严重的限制。

  • 将文件存储在数据库中——在更宏大的计划中,Damien Katz 最初的方向是正确的。大多数大型企业内容管理 (ECM) 播放器将文件存储在文件系统上,元数据存储在 RDBMS 中。如果您进一步扩大并查看 Amazon 的 S3 服务,您正在查看具有非关系数据库后端的物理文件。除非您要测量数十亿存储的文件,否则我不建议您走这条路并自己动手。

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

希望这可以帮助。

于 2009-07-02T02:45:40.577 回答
1

在数据库中存储 blob 时需要谨慎的经典原因之一是数据将在事务控制下存储和编辑(更改),这意味着 DBMS 需要确保它可以回滚更改,并在崩溃后恢复更改。这通常是通过事务日志主题的一些变化来完成的。如果 DBMS 要将更改记录在 2 GB 的 blob 中,那么它必须有一种方法来识别更改的内容。这可能是简单的(前图像和后图像)或更复杂的(某种二进制增量运算),计算成本更高。即便如此,有时最终结果将是通过日志存储数千兆字节的数据。这会损害系统性能。

将文件名存储在数据库中的代价是 DBMS(通常)无法控制文件何时更改 - 因此,数据的再现性再次受到损害;你不能保证 DBMS 之外的东西没有改变数据。(该论点有一个非常通用的版本-您不能确定有人没有篡改数据库存储文件。但我指的是在数据库中存储文件名,引用不受控制的文件DBMS。由 DBMS 控制的文件受到保护,不会被非特权人员随意更改。)

新的 SQL Server 功能听起来很有趣。我没有探索它的作用,所以我无法评论它在多大程度上避免或限制了上面提到的问题。

于 2009-07-01T22:37:58.267 回答
0

SQL Server 中有一些选项可以管理它存储大块数据的位置,这些选项至少从 SQL2005 开始就已经存在,所以我不知道为什么你不能存储大块数据。例如,MOSS 将您上传到它的所有文档存储在 SQL 数据库中。

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

于 2009-07-01T22:23:18.140 回答