在数据库中存储大量图像?是个好的经验吗?

5
我正在编写一个应用程序,将存储大量的图像(可能还有视频)文件。上传后,它们将立即推送到一些云服务CDN以供公众实际使用。这个想法是将图像存储在可靠、可备份的存储中。我预计会有约200,000个对象,每个对象最多为10KB,可能还会有几个MB的视频文件。
默认情况下,我会选择Postgres,文档建议这样做是可以的。
  • 这是一个明智的想法吗?
  • 备份数据库会成为一个完整的噩梦吗?有经验的人可以分享一下吗?
  • 是否存在任何可靠性问题?
  • 这会影响数据库其他部分的性能吗?请记住,每个图像只会访问数据库一两次。

可能是在数据库中存储图像-是还是不是?的重复问题。 - Mat
请重新阅读FAQ,你的问题并没有客观可答,你正在请求意见。 - Mat
请求经验...那很好,对吧? - GolezTrol
@Mat,CWs怎么了?我认为我的问题(包括不从数据库中提供它们的部分)已经足够不同了。哦,算了。 - Joe
3个回答

6

我有在Oracle和MySQL中以这种方式存储图片的经验。性能和可靠性不是问题,备份才是关键。备份会变得很大,因为备份费时又昂贵,所以节省空间是个好主意。如果只需通过从数据库中删除图片就可以将数据库缩小80%,那么把它们存储在其他地方可能是个好主意。备份单独的文件更加高效,因为你可以轻松创建仅包含新的和修改过的图片的增量备份。


4
我有使用PostgreSQL的经验,将图像存储为ByteA(类似BLOB的数据类型),这是一种良好的经验。同时,我还有将图像存储在“dual solution”中的经验(即将图像存储在文件系统中,将元数据存储在像MySQL和PostgreSQL这样的数据库中),但我不建议这样做。
在做决策时,有三个方面或架构考虑因素可以帮助我们:
  1. 统一解决方案还是不统一? 如今,我们看到图像数量和大小在所有应用中都在增长,"统一解决方案"成为了目标。例如:Wikimedia 是维基百科的一个统一专业解决方案。
  2. 直接存储还是间接存储? 像旧的 "双重解决方案" 一样,不将图像存储在SQL表中的一些解决方案可以使用外部数据库或外部数据指针... 在PostgreSQL中,BLOB数据类型有间接存储(生成单独的备份),而BYTEA数据类型是直接存储(与表一起备份)。选择需要考虑技术和性能因素。
  3. 原始图像还是处理后的图像? 我们需要区分 "原始图像" 和 "处理后的图像",如缩略图,需要数据库存储(用于缓存!),但不需要备份。

我建议:

  • 将原始图像存储为blob(具有间接存储的二进制大对象)在您的表中:用于原始图像存储,但分离备份。请参见Ivan's answerPostgreSQL additional supplied modulesHow-tos等。

  • 将原始图像作为bytea(或blob)存储在另一个(统一的)数据库中(使用DBlink):在这种情况下,我更喜欢bytea,但blob几乎相同。分离数据库是“统一图像网络服务”的最佳方式。

  • 将处理后的图像(通常是缩略图)存储为bytea(具有直接存储的BYTE数组)在您的表中:将小图像缓存以快速发送到Web浏览器(避免渲染问题)并减少服务器处理。还要缓存基本元数据,例如宽度和高度。数据库缓存是最简单的方法,但请检查您的需求和服务器配置(例如Apache模块):store thumbnails at file system可能更好,比较性能。请记住,它是一个(统一的)Web服务,因此可以存储在一个没有备份的单独数据库中,为多个表提供服务。另请参见PostgreSQL binary data types manualtests with bytea column等。


2

我的经验仅限于 SQL Server,但是我有数百万个大于10KB的PDF文件存储在数据库中,而且性能仍然表现得相当不错。当然需要使用索引。对于这么多数据,完整的数据库备份所需时间与预期相符。再次强调,这适用于 MS-SQL Server!


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