4

我正在编写一个将存储大量图像(可能还有视频)文件的应用程序。上传后,它们将立即被推送到某个云服务 CDN 上,以便实际向公众提供服务。这个想法是将图像存储在可靠的、可备份的存储中。我预计大约有 200,000 个对象,每个对象最大 10KB,可能还有更少的几 MB 视频文件。

默认情况下,我会使用文档建议的 Postgres 。

  • 这是一个明智的想法吗?
  • 它会使备份数据库成为一场彻头彻尾的噩梦吗?经验?
  • 有任何可靠性问题吗?
  • 这会影响数据库其他部分的性能吗?请记住,对于每个图像,数据库只会被击中一次或两次。
4

3 回答 3

6

我有在 Oracle 和 MySQL 中以这种方式将图像存储在数据库中的经验。性能和可靠性不是问题。备份是。您的备份将变得非常大。由于备份既耗时又昂贵,因此节省空间可能是个好主意。如果这意味着您可以通过从数据库中删除图像来将数据库缩小 80%,那么将它们存储在其他地方可能是个好主意。备份单独的文件效率更高,因为您可以轻松地创建仅包含新的和修改过的图像的增量备份。

于 2011-05-17T11:45:02.603 回答
4

我有使用 PostgreSQL 的经验,将图像存储为 ByteA(一种类似 BLOB 的数据类型),体验很好,并将图像存储在“双重解决方案”(文件系统中的图像,MySQL 和 PostgreSQL 等数据库中的元数据)中,我不推荐。

有 3 个方面或架构考虑可以帮助我们做出决定:

  1. 统一解决与否? 今天,当我们看到图像量(大小和图像数量)越来越大时,在所有应用程序中,“统一解决方案”就是目标。示例:Wikimedia是 Wikipedia 的统一且专门的解决方案。
  2. 直接店还是间接店?像旧的“双重解决方案”,不将图像存储到 SQL 表中,一些解决方案可以使用外部数据库或外部数据指针......在 PostgreSQL BLOB 数据类型有间接存储(生成单独的备份),而 BYTEA 数据类型是直接(备份-ed 与表格)。选择需要技术和性能方面的考虑。
  3. 原始图像还是处理后的图像?我们需要区分“原始图像”和“处理后的图像”,例如缩略图,它们需要数据库存储(用于缓存!),但不需要备份。

我建议:

  • 在您的表中存储为blob(具有间接存储的二进制大对象):用于原始图像存储,但单独备份。请参阅Ivan 的回答PostgreSQL 附加提供的模块操作方法等。

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

  • 在您的餐桌上存储为bytea(直接存储的 BYTE 数组):用于缓存处理后的图像(通常是缩略图)。缓存小图像以将其快速发送到 Web 浏览器(避免渲染问题)并减少服务器处理。缓存必要的元数据,如宽度和高度。数据库缓存是最简单的方法,但请检查您的需求和服务器配置(例如 Apache 模块):将缩略图存储在文件系统中可能会更好,比较性能。请记住,它是一个(统一的)Web 服务,然后可以存储在没有备份的单独数据库中,为许多表提供服务。另请参阅PostgreSQL 二进制数据类型手册使用 bytea 列的测试等。

于 2012-04-22T13:00:57.377 回答
2

我的经验仅限于 SQL 服务器,但我在数据库中有数百万个大于 10KB 的 PDF 文件,它的性能仍然非常好。当然索引是必需的。对于如此大量的数据,完整的数据库备份所用的时间不会比预期的要长。同样,这是针对 MS-SQL 服务器的!

于 2011-05-17T11:42:00.840 回答