存储少量图片:使用blob还是fs?

10

我正在为我的网站添加一些功能,使用户可以上传自己的个人资料照片,所以我在考虑是将它们作为BLOB存储在数据库中,还是将它们放在文件系统中。

我在这里找到了一个类似的问题:Storing images in DB: Yea or Nay,但给出的答案更适用于期望有数千甚至数百万张图像的用户,而我更关心小图像(JPEGs,最多为150×150像素),数量很少:可能不超过一两千张。

这种情况下使用DB BLOB和文件系统的感觉如何? 客户端如何缓存从数据库和文件系统获取的图像?

如果将BLOB存储在数据库中是正确的方法 - 是否有关于存储位置的任何信息?由于我想象大多数用户不会上传图片,所以我是否应该创建一个user_pics表,并在需要时与常规的users表进行(outer)连接?


编辑:我重新打开了这个问题,因为它不是你链接的那两个问题的重复。这个问题特别涉及使用DB或FS存储少量图像的优缺点。正如我上面所说,另一个问题是针对需要存储数千个大型图像的人。

8个回答

8
回答你问题的一部分:
客户端如何缓存从数据库和文件系统中获取的图像?
对于数据库:在数据库中设置一个last_modified字段。使用Last-Modified HTTP头,以便客户端浏览器可以正确地缓存。确保在浏览器请求“如果更新”(无法回忆起它的名称;一些HTTP请求头)的图像时发送适当的响应。
对于文件系统:做同样的事情,但使用文件的修改时间。
如果将BLOB存储在数据库中是最好的方法 - 是否有什么我需要知道的关于存储它们的位置?由于我想象大多数用户不会上传图片,所以我应该创建一个用户图片表,以便在需要时与常规用户表(outer)连接吗?
我会将BLOB和相关的元数据放在它自己的表中,并与您的用户表之间建立某种关系。这样做将使为数据优化表存储方法更容易,使事情更整洁,并留出扩展性的余地(例如通用的“文件”表)。

1

数据库针对延迟、事务等进行了优化。

图像存储优化了读取延迟、存储成本等方面。

大型二进制对象存储适合存储数百万张图片。我在 SeaweedFS 上工作,它是基于 Facebook 存储用户照片的设计而开发的。


1

我曾经为一个小型PDF文件DMS面临过类似的问题。情境与你的不同:最多可能有100个文件,每个文件大小高达10 MB - 不是你期望的个人资料图片。但是当时我的一个朋友给我的答案也适用于你的情况:

将每个存储系统用于其设计的目的。

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

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

我从未听说过Windows文件系统慢且不可靠,正如Aaron Digulla在他的回答中所述。如果确实存在这样的问题,那么肯定需要考虑到这一点。但对于头像图片,我认为这并不重要。

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


0

从为他们提供服务的角度来看,编写为他们提供服务的代码、备份程序等哪种方式更方便?你需要适合自己的答案,而不是适合别人的答案。


你告诉我,你认为什么是最方便/最可靠/最容易/或者其他什么? - nickf

0
在我看來,任何可以留在數據庫之外的內容都應該留在外面。這些內容可能是文件系統或者是不需要每天備份和複製的單獨表格。這樣可以使數據庫變得更輕量級,增長速度更慢,也更容易理解和維護。
如果你使用MSSQL,請確保將BLOB存儲在單獨的數據文件中,而不是與所有其他數據存儲在同一個PRIMARY文件中。

如果你不每天复制或备份它们,你将如何进行恢复呢?还是你不太关心这些文件? - WW.

0
在Windows上,尽可能将数据存储在数据库中。文件系统有些缓慢,甚至不可靠。
在Linux上,你有更多的选择。在这里,你应该考虑将大文件移动到文件系统中,只保留名称在数据库中。如果你使用像Ext3或ReiseFS这样的现代文件系统,你甚至可以创建许多小文件,并获得相当不错的性能。
你还需要考虑如何访问数据。如果你把所有东西都放在数据库中,你只有一个访问路径,不必担心另一组权限,但你必须处理读/写BLOBs的额外复杂性。在许多数据库中,BLOBs无法被搜索。
在文件系统上,你可以运行其他工具来处理数据,而如果文件存储在数据库中,则不可能实现。

0

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

  1. 备份/还原很容易(如果您备份文件和数据库,时间点恢复更加复杂)
  2. 数据库中的事务意味着您永远不会指向不存在的文件名
  3. 较小的机会使某人通过可疑的图像上传黑客攻击以巧妙的方式将脚本放到您的服务器上

由于您谈论的是少量图像,因此易用性/管理应优先考虑性能问题,这些问题在链接的问题中进行了讨论。


0

我认为将它们存储在数据库中有一个可管理性的优势; 它们可以与其他数据一致地进行备份和恢复 - 您不会忘记删除过时的内容(虽然可能性较小),并且如果您将数据库迁移到另一台计算机,图像也将随之而去。


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