保存图像:文件还是blob?

时间:2009-08-28 14:44:19

标签: database performance image blob

当您保存图像时(假设您有很多图像)是否将它们存储为数据库中的blob或文件?为什么呢?

重复:Storing Images in DB - Yea or Nay?

11 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:10)

取决于图像的大小。

Microsoft Research对此主题有interesting document

答案 2 :(得分:9)

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

1)某些数据库(SQL Server Express)具有大小限制;

2)有些DB(MySQL)变得非常慢;

3)当你必须显示一个对象列表时,如果你无意中做了SELECT * FROM表,那么大量数据会尝试从db上下移动,导致响应速度慢或内存失败;

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

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

答案 3 :(得分:3)

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

这提供了两全其美的优势:

  • 权威商店是 数据库,保持交易和 参照完整性
  • 您可以按部署所有用户数据 简单地部署数据库
  • 清空此缓存(例如,添加一个 网络服务器)只会导致 暂时性能受到影响 自动补充。

没有必要经常锤击数据库以查找不会一直改变的事情,但重要的是用户数据全部存在并且不会分散在不同的地方,使得多服务器操作和部署成为可能。一团糟。 我总是提倡“数据库作为用户数据存储,除非”的方法,因为它在架构上更好,并且有效缓存不一定更慢。

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

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

答案 6 :(得分:2)

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

答案 7 :(得分:2)

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

但如果你的意思是图像是应用程序infratstructure的一部分而不是用户数据,那么答案可能就是答案。

答案 8 :(得分:1)

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

答案 9 :(得分:0)

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

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

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

答案 10 :(得分:0)

我建议您使用文件系统。首先,让我们讨论为什么不选择Blob?因此,要回答这个问题,我们需要考虑数据库相对于文件系统具有哪些优势?

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

那为什么要使用文件系统?

  1. 快速访问:如果我们将图像存储在数据库内部的Blob中,则用于获取完整记录(select *)的查询将导致查询的性能非常差,因为大量数据将往返数据库。相反,如果我们仅将图像的URL存储在DB中并将图像存储在分布式文件系统(DFS)中,则会更快。
  2. 大小限制:如果数据库正在存储图像,那么很多图像可能会遇到性能问题,并且还会达到其内存限制(很少有DB做到这一点)。
相关问题