我正在使用一款将图片大量存储在数据库中的应用程序。你对此有何看法?我更倾向于将其位置存储在文件系统中,而不是直接存储在数据库中。
你认为这样做的利弊是什么?
正如有人已经提到的那样,“这取决于情况”。如果数据库中的存储应该是文件系统的一种1对1的花哨替代品,那么它可能不是最佳选择。
然而,如果数据库后端将提供其他价值,而不仅仅是序列化和存储blob,那么它可能会有真正的意义。
您可以查看WKT Raster,这是一个旨在开发PostGIS中栅格支持的项目,后者又作为PostgreSQL数据库系统的地理空间扩展。 WKT Raster背后的想法不仅是定义栅格序列化和存储的格式(使用PostgreSQL系统),而且比存储更重要的是指定从SQL访问的数据库端高效图像处理。长话短说,这个想法是将操作权从客户端转移到数据库后端,使其尽可能靠近存储本身。与PostGIS一样,WKT Raster专门用于特定领域的应用程序,GIS。
你的 Web 服务器(我假设你正在使用一个)是设计用来处理图像的,而数据库不是。因此,我会强烈反对将图像存储在数据库中。
只需在数据库中存储路径(和可能的文件信息)即可。
我个人会将大量数据存储在数据库之外。
优点:将所有内容存储在一个地方,易于访问数据文件,易于备份。 缺点:降低数据库性能,导致页面分裂,可能导致数据库损坏。
我们将图像存储在表格中的唯一原因是每个表格(或每个工作范围的一组表格)都是临时的,并在工作流程结束时删除。如果有任何长期存储,我们肯定会选择存储文件路径。
还应该注意的是,我们在内部使用客户端/服务器应用程序,因此无需担心Web界面。
对于大量的小图像,数据库可能更好。
我有一个应用程序有许多小缩略图(每个2Kb)。当我把它们放在文件系统上时,由于文件系统的块大小,它们每个都消耗了8kb。空间增加了400%!
有关块大小的更多信息,请参见此帖子: iPhone文件系统的块大小是多少?
我会选择文件系统方法,主要是因为它更灵活。考虑到如果图片数量变得非常庞大,一个数据库可能无法处理。使用文件系统,您可以简单地添加更多的文件服务器,假设您正在使用NFS或类似的东西。
文件系统方法的另一个优点是能够做一些花哨的事情,例如您可以使用Amazon S3作为主要存储(将URL保存在数据库中而不是文件路径)。如果S3发生故障,您可以回退到文件服务器(可能是另一个包含文件路径的数据库条目)。对于Apache或任何您正在使用的Web服务器应用一些巫术。
数据存储使用数据库
文件存储使用文件系统
我曾经使用过许多数字存储系统,它们都将数字对象存储在文件系统中。它们倾向于使用分支方法,因此文件系统上会有一个存档树,通常以入口年份为开始,例如2009年,子目录将是月份,例如8月,下一个目录将是日期,例如11日,有时它们还会使用小时,然后文件将以记录的持久ID命名。使用BLOBS具有其优点,我听说它经常用于化学工业的IT部分,用于存储数千或数百万张照片和图表。它可以提供更细粒度的安全性、单一的备份方法、潜在的更好的数据完整性和改进的媒体搜索功能,Oracle在他们曾经称之为Intermedia的软件包中有许多这方面的功能(我认为现在叫做其他名称)。文件系统也可以通过诸如XACML或其他XML类型的安全对象提供细粒度的安全性。请参见D Space或Fedora Object Store的示例。