Database 执行或不执行:将图像存储在数据库中

Database 执行或不执行:将图像存储在数据库中,database,performance,blob,Database,Performance,Blob,在web应用程序的上下文中,我的老上司总是说在数据库中放置对图像的引用,而不是图像本身。我倾向于同意在数据库中存储url和图像本身是一个好主意,但是在我现在工作的地方,我们在数据库中存储了很多图像 我能想到的唯一原因也许是它更安全?你不希望有人直接链接到url?但如果是这种情况,您可以始终让网站/服务器处理图像,就像asp.net中的处理程序一样,以便用户需要进行身份验证才能查看图像。我还认为从数据库中取出图像会影响性能。为什么将图像存储在数据库中可能是个好主意/不太好主意的任何其他原因 精确

在web应用程序的上下文中,我的老上司总是说在数据库中放置对图像的引用,而不是图像本身。我倾向于同意在数据库中存储url和图像本身是一个好主意,但是在我现在工作的地方,我们在数据库中存储了很多图像

我能想到的唯一原因也许是它更安全?你不希望有人直接链接到url?但如果是这种情况,您可以始终让网站/服务器处理图像,就像asp.net中的处理程序一样,以便用户需要进行身份验证才能查看图像。我还认为从数据库中取出图像会影响性能。为什么将图像存储在数据库中可能是个好主意/不太好主意的任何其他原因


精确副本:
精确副本:
精确副本:
精确副本:
精确副本:
精确副本:

完全重复:

您不必存储URL(如果您觉得这样不安全)。您只需存储一个在别处引用图像的唯一id即可


数据库存储往往比文件系统更昂贵,维护成本也更高,因此我不会在数据库中存储大量图像。

最简单/性能最好/可扩展性最好的解决方案是将图像存储在文件系统上。如果担心安全性,请将它们放在web服务器无法访问的位置,然后编写一个脚本来处理安全性并提供文件


假设您的web/app服务器和DB服务器是不同的机器,您将通过在DB中放置图像来获得一些成功:(1)两台机器之间的网络延迟,(2)DB连接开销,(3)为每个提供的图像使用额外的DB连接。我更关心的是最后一点:如果您的站点提供大量图像,那么您的web服务器将消耗许多数据库连接,并可能耗尽您的连接池。

将图像存储到数据库的优点之一是,它可以跨系统移植,并且独立于文件系统布局。

如果您有时需要检索图像,并且图像必须在多个不同的web服务器上可用。但我想差不多就是这样

  • 如果它不必在多个服务器上可用,那么最好将它们放在文件系统中
  • 如果它必须在多个服务器上可用,并且系统中实际上存在某种负载,那么您将需要某种分布式存储
我们这里讨论的是一个边缘案例,通过利用数据库,您可以避免给系统增加额外的复杂性


除此之外,不要这样做。

如果您的应用程序在多台服务器上运行,我会将图像的参考副本存储在数据库中,然后根据需要在文件系统上缓存它们。与尝试横向同步文件系统相比,这样做并不是一件容易出错的麻烦事


如果您的应用程序位于一台服务器上,那么是的,请坚持使用文件系统,并让数据库维护数据路径。

我的一般建议是不要将自己局限于一种或另一种方法—使用适合这种情况的技术。文件系统非常擅长存储文件,而数据库非常擅长根据请求提供一点点大小的数据块。另一方面,我公司的一个产品要求将应用程序的整个状态存储在数据库中,这意味着文件附件也要存储在数据库中。使用我们的数据库服务器(SQLServer2005),即使是大型客户和数据库,我也还没有遇到明显的性能问题


Microsoft的SQL 2008通过FileStream功能为您提供了两全其美的功能—可能值得一看

我知道,如果你将图像存储在数据库中(甚至提到它),大多数数据库专业人员都会对你交叉手指并发出嘘声。是的,当使用数据库作为任何类型的大型二进制数据块的存储库时,肯定会影响性能和存储(图像往往是无法规范化的最常见的数据位)。然而,在某些情况下,图像的数据库存储不仅是允许的,而且是可取的

例如,在我以前的工作中,我们有一个应用程序,用户将图像附加到他们正在编写的报告的几个不同点上,这些图像必须在完成后打印出来。这些报告是通过SQL Server复制移动的,如果要以任何可靠性跨多个系统和服务器管理这些映像和文件路径,都会带来巨大的麻烦。将它们存储在数据库中“免费”为我们提供了所有这些功能,报告工具不必到文件系统检索图像。

  • 数据数据库
  • 文件系统

大多数SQL数据库在设计时当然没有考虑提供图像,但将它们放在数据库中有一定的便利性

例如,如果您已经运行了一个数据库并配置了复制。您可以立即拥有一个HA映像存储,而不必尝试进行一些基于rsync或nfs的文件系统复制。此外,拥有一堆web进程(或设计一些新的服务)将文件写入磁盘会稍微增加您的复杂性。实际上,这只是更多的运动部件

至少,我建议将有关图像的“元数据”(如任何权限、谁拥有它等)和实际数据分离到不同的表中,这样就可以很容易地切换到不同的数据存储。再加上某种CDN或缓存,在某种程度上应该可以提供相当好的性能,所以我想这取决于如何实现