存储less量图像:blob或fs?

我正在为我的网站添加一些function,以便用户可以上传自己的个人资料图片,所以我想知道是将它们作为BLOB存储在数据库中,还是将它们放在文件系统中。

我在这里发现了一个类似于这样的问题: 在DB中存储图像:是或否 ,但是给出的答案更多地针对期望成千上万或甚至数百万图像的人,而我更关心小图像(JPEG至多也许150×150像素),以及它们的小数目:可能高达一两千。

对于这种情况,DB BLOB vs Filesystem有什么感受? 客户端如何从数据库caching图像或从文件系统caching图像?

如果存储在数据库中的BLOB是要走的路 – 有什么我应该知道在哪里存储它们? 因为我想大多数用户不会上传图片,我需要创build一个user_pics表(外部)join常规users表吗?


编辑:我重新打开这个问题,因为它不是你链接到的那两个重复。 这个问题是关于使用数据库或FS为less量图像的优点/缺点。 正如我上面所说,另一个问题是针对那些需要存储成千上万张大型图像的人。

回答你的问题的一部分:

客户端如何从数据库caching图像或从文件系统caching图像?

对于数据库:在数据库中有一个last_modified字段。 使用Last-Modified HTTP标头,以便客户端的浏览器可以正确caching。 当浏览器请求一个图片“if newer”(不能记起它所谓的;一些HTTP请求头)时,一定要发送适当的响应。

对于文件系统:执行相同的操作,但文件的修改时间相同。

如果存储在数据库中的BLOB是要走的路 – 有什么我应该知道在哪里存储它们? 因为我想大多数用户不会上传图片,我需要创build一个user_pics表(外部)join常规用户表吗?

我会把BLOB和相关的元数据放在它自己的表中,它和你的用户表之间有某种关系。 这样做可以更容易地优化数据的表存储方法,使事情更加整洁,并为可扩展性留下空间(例如一个“文件”表)。

我曾经遇到一个类似的问题与一个小型的DMS文件的DMS。 情况与您的情况不同:最多可能是100个大小各不超过10 MB的文件 – 而不是您对个人资料图片的期望值。 但朋友给我的回答也适用于你的情况:

使用每个存储系统来devise它的目的。

数据存储在数据库中 。 将文件存储在文件系统中

这不是最终的答案(*),但是对于初学者来说这是一个很好的经验法则。

我从来没有听说过Windows FS慢,有时不可靠,正如Aaron Digulla在答复中所述。 如果有这样的问题,这当然需要考虑。但对于头像照片来说,这并不重要。

(*)我知道,我知道,42 …

从提供服务,编写代码服务,备份程序等angular度来看,更方便吗? 你想要正确的答案,而不是别人的正确答案。

从我的angular度来看,任何可能留在数据库之外的东西都应该留在外面。 它可能是文件系统或单独的表,您不需要每天复制或备份。 它使数据库更轻,增长更慢,更容易理解和维护。

如果您在MSSQL上,请确保blob存储在单独的数据文件中。 不像一切一样在主stream。

在Windows上,尽可能多地放入数据库。 文件系统有点慢,有时甚至不可靠。

在Linux上,你有更多的select。 在这里,您应该考虑将大文件移动到文件系统中,并将名称保存在数据库中。 如果使用Ext3或ReiseFS等现代文件系统,甚至可以创build很多性能相当不错的小文件。

您还需要考虑如何访问数据。 如果你拥有DB中的所有东西,那么你有一个访问path,不必担心另外一组权限,但是你必须处理读/写BLOB的额外复杂性。 在许多DB中,BLOB不能被search。

在文件系统上,如果文件存储在数据库中,则可以在数据上运行其他工具。

我会将它们存储在数据库中:

  1. 备份/恢复很容易(如果您备份文件和数据库,则时间点恢复更为复杂)
  2. 数据库中的事务意味着你永远不应该指向一个不存在的文件名
  3. 更less的机会有人会找出一个鬼鬼祟祟的方式,通过一个狡猾的图像上传黑客脚本到您的服务器上

由于您正在谈论less量图片,所以易用性/pipe理应优先考虑链接问题中讨论的性能问题。

我认为把它们存储在数据库中有一个pipe理优势。 他们可以被备份和恢复一致的其他数据 – 你不会忘记删除过时的(可能,但可能性稍差),如果你将数据库迁移到另一台机器,图像将与它。