在数据库中存储图像 - 是还是不是?

415

我正在使用一款将图片大量存储在数据库中的应用程序。你对此有何看法?我更倾向于将其位置存储在文件系统中,而不是直接存储在数据库中。

你认为这样做的利弊是什么?


好的,你可以使用事务性磁盘缓存来实现这两个功能。 - Lilith River
56个回答

2
我是一款企业级文件管理系统的首席开发人员,其中一些客户存储了数百GB的文档。不久的将来,这个数字可能会达到TB级别。我们采用文件系统方法的原因有很多,除了本页面提到的原因外,还有一个原因:归档。
我们的许多客户必须遵守特定行业的归档规则,例如存储到光盘或以非专有格式存储。此外,您可以灵活地向NAS设备添加更多磁盘。如果您将文件存储在数据库中,即使使用SQL Server 2008的文件流数据类型,您的归档选项也会变得非常有限。

1

正如有人已经提到的那样,“这取决于情况”。如果数据库中的存储应该是文件系统的一种1对1的花哨替代品,那么它可能不是最佳选择。

然而,如果数据库后端将提供其他价值,而不仅仅是序列化和存储blob,那么它可能会有真正的意义。

您可以查看WKT Raster,这是一个旨在开发PostGIS中栅格支持的项目,后者又作为PostgreSQL数据库系统的地理空间扩展。 WKT Raster背后的想法不仅是定义栅格序列化和存储的格式(使用PostgreSQL系统),而且比存储更重要的是指定从SQL访问的数据库端高效图像处理。长话短说,这个想法是将操作权从客户端转移到数据库后端,使其尽可能靠近存储本身。与PostGIS一样,WKT Raster专门用于特定领域的应用程序,GIS

如需更全面的概述,请查看该系统的网站演示文稿(PDF)。


1

你的 Web 服务器(我假设你正在使用一个)是设计用来处理图像的,而数据库不是。因此,我会强烈反对将图像存储在数据库中。

只需在数据库中存储路径(和可能的文件信息)即可。


1

我个人会将大量数据存储在数据库之外。

优点:将所有内容存储在一个地方,易于访问数据文件,易于备份。 缺点:降低数据库性能,导致页面分裂,可能导致数据库损坏。


你的意思是在数据库内部吗? - nickf

1

我们将图像存储在表格中的唯一原因是每个表格(或每个工作范围的一组表格)都是临时的,并在工作流程结束时删除。如果有任何长期存储,我们肯定会选择存储文件路径。

还应该注意的是,我们在内部使用客户端/服务器应用程序,因此无需担心Web界面。


1
如果您需要在文件系统上存储大量图像,需要考虑以下几点:
  • 备份和恢复。如何保持图像同步。
  • 文件系统性能。取决于您正在做什么以及文件系统,但您可能需要实现哈希机制,以避免单个目录中有数十亿个文件。
  • 复制。您是否需要在多个服务器之间保持文件同步?

0

对于大量的小图像,数据库可能更好。

我有一个应用程序有许多小缩略图(每个2Kb)。当我把它们放在文件系统上时,由于文件系统的块大小,它们每个都消耗了8kb。空间增加了400%!

有关块大小的更多信息,请参见此帖子: iPhone文件系统的块大小是多少?


0

我会选择文件系统方法,主要是因为它更灵活。考虑到如果图片数量变得非常庞大,一个数据库可能无法处理。使用文件系统,您可以简单地添加更多的文件服务器,假设您正在使用NFS或类似的东西。

文件系统方法的另一个优点是能够做一些花哨的事情,例如您可以使用Amazon S3作为主要存储(将URL保存在数据库中而不是文件路径)。如果S3发生故障,您可以回退到文件服务器(可能是另一个包含文件路径的数据库条目)。对于Apache或任何您正在使用的Web服务器应用一些巫术。


0

数据存储使用数据库

文件存储使用文件系统


2
你可以这样说:如果你不能将数据用于where条件或join操作,就不要将数据放入数据库列中。对于二进制数据来说,这是不太可能的。 - Nils Weinander

0

我曾经使用过许多数字存储系统,它们都将数字对象存储在文件系统中。它们倾向于使用分支方法,因此文件系统上会有一个存档树,通常以入口年份为开始,例如2009年,子目录将是月份,例如8月,下一个目录将是日期,例如11日,有时它们还会使用小时,然后文件将以记录的持久ID命名。使用BLOBS具有其优点,我听说它经常用于化学工业的IT部分,用于存储数千或数百万张照片和图表。它可以提供更细粒度的安全性、单一的备份方法、潜在的更好的数据完整性和改进的媒体搜索功能,Oracle在他们曾经称之为Intermedia的软件包中有许多这方面的功能(我认为现在叫做其他名称)。文件系统也可以通过诸如XACML或其他XML类型的安全对象提供细粒度的安全性。请参见D Space或Fedora Object Store的示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接