23

当您保存图像(假设您有很多图像)时,您是在数据库中存储为 blob 还是文件?为什么?

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

4

11 回答 11

26

我通常将它们存储为文件,并将路径存储在数据库中。对我来说,这是一种比将它们作为 blob 推入数据库更容易、更自然的方法。

将它们存储在数据库中的一个论点是:进行完整备份要容易得多,但这取决于您的需要。如果您需要能够轻松地获取数据库(包括图像)的完整快照,那么将它们作为 blob 存储在数据库中可能是可行的方法。否则,您必须将数据库备份与文件备份配对,并以某种方式尝试将两者关联起来,这样如果您必须进行恢复,您就知道要恢复哪一对。

于 2009-08-28T14:45:20.853 回答
14

这取决于图像的大小。

微软研究院有一个关于这个主题的有趣文档

于 2009-08-28T14:48:36.353 回答
11

我尝试使用 db(SQL Server 和 MySQL)来存储中等(< 5mb)文件,但遇到了很多麻烦。

1) 一些 DB (SQL Server Express) 有大小限制;

2)一些数据库(MySQL)变得非常缓慢;

3)当你必须显示一个对象列表时,如果你不小心做了SELECT * FROM table,大量的数据会尝试从db上上下下,导致致命的响应慢或内存失败;

4) 一些前端(ruby ActiveRecord)在处理 blob 时遇到了很大的麻烦。

只使用文件。不要将它们全部存储在同一个目录中,使用一些技术将它们放在多个目录中(例如,您可以使用 GUID 的最后两个字符或 int id 的最后两个数字),然后将路径存储在 db 中。

于 2009-08-28T14:51:31.967 回答
5

数据库服务器的性能影响是一个没有实际意义的问题。如果您需要文件系统的性能优势,您只需在第一次请求时将其缓存在那里。然后可以通过直接链接直接从文件系统提供后续请求(对于 Web 应用程序,您可以在刷新输出缓冲区之前重写 HTML)。

这提供了两全其美:

  • 权威存储是数据库,保持事务和参照完整性
  • 只需部署数据库即可部署所有用户数据
  • 清空此缓存(例如通过添加 Web 服务器)只会在自动重新填充时导致临时性能下降。

没有必要为不会一直改变的东西不断地锤击数据库,但重要的是用户数据都在那里,而不是分散在不同的地方,使得多服务器操作和部署变得一团糟。我一直提倡“数据库作为用户数据存储,除非”方法,因为它在架构上更好,并且在有效缓存时不一定更慢。

话虽如此,使用文件系统作为权威存储的一个很好的理由是当您确实需要使用外部独立工具来访问它时,例如 SFTP 和诸如此类。

于 2011-07-02T16:50:48.013 回答
2

如果我在一台 Web 服务器上运行并且只会在一台 Web 服务器上运行,我将它们存储为文件。如果我在多个 webheads 上运行,我将图像的引用实例放在数据库中BLOB,并将其作为文件缓存在 webheads 上。

于 2009-08-28T14:48:20.333 回答
2

鉴于您可能希望将图像连同名称、简要说明、创建日期、创建者等一起保存,您可能会发现保存在数据库中会更好。这样,一切都在一起了。如果您保存了相同的信息并将图像存储为文件,您将不得不从两个地方检索整个“图像对象”......并且在路上,您可能会发现自己遇到同步问题(找不到某些图像) . 希望这是有道理的。

于 2009-08-28T14:49:35.667 回答
2

通过保存您的意思是使用它们显示在网页或类似的东西?如果是这种情况,更好的选择是使用文件,如果您使用数据库,它将不断受到照片请求的影响。而且这种情况不能很好地扩展。

于 2009-08-28T14:50:40.627 回答
2

问题是,您的应用程序是否像处理其他应用程序数据一样处理 BLOBS 或其他文件?您的用户是否将图像与其他数据一起上传?如果是这样,那么您应该将 BLOB 存储在数据库中。它可以更轻松地备份数据库,并在出现问题时恢复到事务一致的状态。

但是,如果您指的是属于应用程序基础结构而不是用户数据的图像,那么答案可能是,不。

于 2009-08-28T21:10:59.360 回答
1

Blob 在 db/scripts 上可能很重,为什么不只存储路径。我们使用 blob 的唯一原因是它是否需要合并复制或资产的超严格安全性(如无法拉取图像,除非登录或其他东西)

于 2009-08-28T14:49:35.213 回答
1

我建议去文件系统。首先,让我们讨论一下为什么不是 Blob?因此,要回答这个问题,我们需要考虑 DB 相对于文件系统为我们提供了哪些优势?

  1. 可变性:我们可以在存储后修改数据。不适用于图像。图像只是一系列 1 和 0。每当我们更改图像时,都不会改变几个 1 和 0,因此,修改相同的图像内容是没有意义的。最好删除旧的,并存储新的。
  2. 索引:我们可以创建索引以加快搜索速度。但它不适用于图像,因为图像只是 1 和 0,我们无法对其进行索引。

那为什么是文件系统?

  1. 更快的访问:如果我们将图像存储在数据库中的 Blob 中,那么获取完整记录 ( select *) 的查询将导致查询性能非常差,因为大量数据将进出数据库。相反,如果我们只是将图像的 URL 存储在 DB 中,并将图像存储在分布式文件系统 (DFS) 中,它会快得多。
  2. 大小限制:如果数据库正在存储图像,大量图像,那么它可能会面临性能问题,并且会达到其内存限制(很少有数据库拥有它)。
于 2020-11-03T16:17:07.527 回答
0

使用文件系统更好,因为在将图像存储为 blob 时将提供的基本功能是 1. 图像不需要的可变性,因为我们不会更改图像的二进制数据,我们将删除图像仅作为整体 2. 索引搜索:图像不需要索引搜索,因为图像的内容无法被索引,索引搜索搜索 BLOB 的内容。

在这里使用文件系统是有好处的,因为 1. 它更便宜 2. 使用 CDN 进行快速访问

因此,一种前进的方法可能是将图像存储为文件并在数据库中提供其路径

于 2019-10-20T09:55:32.120 回答