在数据库中存储大量图像?一个很好的经历?

时间:2011-05-17 11:39:31

标签: postgresql blob blobstore

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

默认情况下,我会去Postgres,documentation suggests可以。

  • 这是一个明智的想法吗?
  • 它是否会使数据库备份完全成为一场噩梦。经历?
  • 任何可靠性问题?
  • 这是否会影响数据库其他部分的性能?请记住,每个图像只会对数据库进行一次或两次点击。

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

我有使用PostgreSQL的经验,将图像存储为ByteA(类似BLOB的数据类型),良好的体验,并将图像存储在“dual solution”(文件系统中的图像,MySQL和PostgreSQL等数据库中的元数据),我不推荐。

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

  1. 是否统一解决方案?今天,当我们看到图像量(图像的大小和数量)不断增长和增长时,在所有应用程序中,“统一解决方案”就是目标。示例:Wikimedia是维基百科的统一且专业的解决方案。
  2. 直接或间接存储?像旧的“双解决方案”,即不将图像存储到SQL表中,一些解决方案可以使用外部数据库或外部数据指针...在PostgreSQL上BLOB数据类型有间接store(生成单独的备份),BYTEA数据类型是直接的(使用表备份)。选择需要技术和性能方面的考虑。
  3. 原始图像或已处理图像?我们需要区分“原始图像”和“已处理图像”,如缩略图,需要数据库存储(用于缓存!),但不需要备份。
  4. 我建议:

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

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

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

答案 2 :(得分:2)

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