将图像作为文件存储在文件系统中还是将其作为二进制数据存储在BLOB数据库字段中?

3

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

哪种方法更好?有什么优缺点?

以我个人的看法,将图像存储在数据库中的优点如下:

  • 数据库完整性(使用外键更容易保持所有数据库条目的有效性,而不是在每次更改数据库时关注文件系统并进行所需更改)
  • 工作量更少,维护更容易(只需要关心一个数据存储位置 - 数据库)

劣势可能是:

  • 对数据库服务器的负载更大

你同意以上观点吗?

目前我所做的是将小型图像(例如头像和缩略图)作为BLOB存储在数据库中,并将大型图像(例如全尺寸照片或壁纸)存储在文件系统中。你认为这是一个好方法吗?如果是,是否有一些魔法数字(文件大小)来决定是否仍然有利于将图像存储在数据库中?如果不是,我应该将所有图像都存储在一个位置(数据库或文件系统)中吗?


重复:https://dev59.com/OnVD5IYBdhLWcg3wXaYd - Jørn Schou-Rode
将数据存储在数据库中可以使备份和恢复变得更加容易,但会增加数据库使用的磁盘空间。 - OMG Ponies
我认为将它们存储在数据库中可以使备份和还原变得更加容易,只需少量文件即可。但是一旦达到关键大小,备份和还原就会成为一个主要的麻烦事... - roman
2个回答

2
我曾试图将图像存储到数据库中,但是遇到了严重的性能问题。由于BLOB的存在,数据库大小会变得更大,对包含BLOB的表的查询速度也会变慢。此外,这还会给你的代码增加额外的复杂性,因为你必须使用非标准的数据访问来检索图像,还必须配置懒加载。同时,备份和复制的时间也显著增加。
而将图像存储在文件中则容易处理得多,你可以轻松地备份并只同步已更改的文件。
基本上,我从不尝试将除元数据以外的任何东西存储到数据库中。

我认为使用数据库进行备份更容易,因为你只需要关心备份数据库,而不需要备份文件系统。此外,关于复杂性的观点并不正确,它与文件系统完全相同,你只需要向浏览器发送正确的头部和 MIME 类型以显示图像。而这只需要一行代码即可。 - Richard Knop
在数据库中,你无法使用 Blob 进行增量备份,但可以使用文件系统中的文件进行增量备份,即只备份已更改的文件。 - mythz
@richard:一行代码最多......这正是瓶颈所在,以PHP为例(但Ruby、Java、Perl也是如此),你需要PHP连接到数据库并发送头文件,这意味着你很可能有一个巨大的Apache进程。将文件存储在文件系统中可以让你使用例如lighttpd来处理这些文件,当它们在数据库中时,它可以比你更快地向客户端提供图像。 - Rufinus

1

在我看来,二进制数据没有存在数据库中的地方。(当然也可能有例外情况)


连头像或缩略图都没有吗? - Richard Knop

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