将用户个人资料图片存储在磁盘上还是数据库中?

25

我正在构建一个asp.net MVC应用程序,用户可以在其个人资料上上传图片,也可以在其他地方使用,比如仪表板上显示最近消息的消息小部件等。

当用户上传这些图片时,我在考虑是将它们存储在数据库中还是在磁盘上。

数据库的优点

  • 整个数据库备份容易,并且与相关的用户/个人资料表一起保留内容/图像

  • 当我在后面创建Web服务时,它们可以从一个地方(数据库)获取所有相关的个人资料数据

文件系统的优点

  • 从磁盘加载文件可能更快

  • 还有其他优点吗?

其他网站将此类信息存储在哪里?对于这样的事情,我是否应该稍微担心一下数据库性能?

也许有一种方法可以缓存从数据库中提取的图像,以便在一段时间内使用?

或者,将这些图像存储在数据库中,但在影子复制到磁盘上,以便Web服务器可以从那里加载它们?这似乎既提供了Db的备份和方便,同时也提供了磁盘上文件的速度优势。

相关基础设施

  • 该网站将部署到运行NTFS文件系统的Windows Server 2003上的IIS中。
  • 数据库将使用SQL Server 2008

总结

在阅读了许多相关线程后,我发现很多人现在趋向于使用SQL Server Filestream类型。然而,从我收集到的信息来看(我可能错了),当文件相当小的时候并没有太多好处。但是,当文件为多个MB或更大时,Filestreaming似乎可以大大提高性能。

由于我的个人资料图片通常在5KB左右,因此我决定将它们存储在数据库中的文件存储区作为varbinary(max)。

在ASP.NET MVC中,我注意到从数据库中获取图像并返回FileContentResult会导致一些性能问题。因此,如果在应用程序缓存中找不到此文件的位置,我最终将其缓存在磁盘上进行读取时。
所以我选择了混合方案:
  • 使用数据库存储使数据备份更容易,并且文件直接链接到配置文件
  • 使用影子复制到磁盘以允许更好的缓存
随时可以删除磁盘上的缓存文件夹,当重新请求图像时,它们将在第一次命中时重新复制并从缓存中提供。

3
你应该阅读这篇文章:https://dev59.com/OnVD5IYBdhLWcg3wXaYd。 - Anders
抱歉,我的问题中有几个错别字。我正在用iPhone打字。等到我到电脑前再进行编辑。 - Joshua Hayes
谢谢Anders,这正是我在寻找的。你提供的链接中有很多观点和意见。 - Joshua Hayes
2个回答

12

您应该将文件的引用存储在数据库中,而将实际文件存储在磁盘上

这种方法更加灵活并且易于扩展。

您可以拥有一个单一的数据库和多个服务器提供静态内容。如果要让多个数据库完成这项工作,将会更加棘手。

Flickr就是采用这种方式。

我在这里提供了更详细的答案,您可能会发现它有用。


1
太棒了。我一直在寻找一个好的方法来存储网站上的个人资料照片,我也会采用这个解决方案。 - Jon Koivula
@JonKoivula 我有另一个回答,详细介绍了更多细节。可能会有帮助。https://dev59.com/iWox5IYBdhLWcg3w3YD-#8922090 - Frankie
1
哇,非常感谢你,Frankie。你真的给了我一个很有帮助的答案。我非常感激。 - Jon Koivula

6
实际上,根据您拥有的图像数量,使用数据库进行数据存储查询可能会更快,除非您使用高度优化的文件系统引擎。数据库专为快速查询而设计,并使用比文件系统更多的有趣技术。
ReiserFS(过时),ZFS、XFS和NTFS都具有出色的哈希算法,Linux Ext4看起来也很有前途,非常适合查找。
在块读取方面,系统的影响并不会有任何不同。问题是使用查询查找并返回文件名(可能是哈希?),然后使用单独的打开、文件发送和关闭访问文件,还是直接输出Blob?
有几件事情需要考虑,包括网络影响、处理影响、可分配性等。如果您将东西存储在数据库中,那么您可以移动它。反过来,如果您将图像存储在内容交付服务上,那么可能会更快,因为您没有对自己进行任何网络查询。
好好思考一下,记住,做一点基准测试从未伤害过任何人 :-),所以请使用您的典型数据集大小进行测试,并考虑同时查询等因素。

嗨,Elf King。你对基础架构提出了很好的观点,我已经更新了我的问题。虽然我意识到有许多因素需要考虑(就像你所指出的那样),但我正在寻找一些明智的建议/可能是一些有经验的人对尝试过某种方式的看法,以及它的成果如何。 - Joshua Hayes
我已经在大型项目的生产环境中成功地完成了这两个任务。在一个项目中,系统每天每秒产生约10个大小为10MB的图像,并且所有图像都必须进行排序并与多个用户相关联(使用了FS和DB的组合)。由于生产速率很高,因此必须使用分布式FS。在另一个项目中,图像虽然较大但是静态的,因此使用了DB blobs。我认为对于您的应用程序,您最好只使用DB。您还需要考虑谁拥有数字图像的法律问题。 - Elf King

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