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

Jos*_*yes 17 profile image-upload

我正在构建一个asp.net mvc应用程序,用户可以将图片附加到他们的个人资料中,也可以在系统的其他区域附加,例如仪表板上显示最近消息等的消息小工具.

当用户上传这些内容时,我想知道将它们存储在数据库或磁盘上是否更好.

数据库优势

  • 易于备份整个数据库,并保留配置文件内容/图像与相关的配置文件/用户表

  • 当我稍后在轨道上构建Web服务时,他们可以从一个位置(数据库)中提取所有与profiile相关的数据

文件系统的优点

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

  • 还有其他什么好处

其他网站在哪里存储此类信息.对于类似这样的事情,我是否有点担心数据库性能?

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

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

有问题的基础设施

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

摘要

在SO上阅读很多相关的线程,许多人现在趋向于SQL Server Filestream类型.然而,从我可以收集的内容(我可能是错的),当文件非常小时,没有太大的好处.然而,当文件是多个MB或更大时,文件流看起来会大大提高性能.

由于我的个人资料图片往往约为5kb,我决定将它们作为varbinary(max)存放在数据库的文件存储中.

在ASP.NET MVC中,我确实看到了一些性能问题,返回FileContentResults从这样的数据库中拉出的图像.所以如果在我的应用程序缓存中找不到该文件的位置,我最终会在磁盘上缓存该文件.

所以我想我选择了混合动力车;

  • 数据库存储使数据烘焙更容易,文件直接链接到配置文件
  • 影子复制到磁盘以允许更好的缓存

在任何时候我都可以删除磁盘上的缓存文件夹,并且当重新请求图像时,它们将在第一次命中时被重新复制并在之后从缓存中提供.

Fra*_*kie 8

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

这种方法更灵活,更容易扩展。

您可以拥有一个数据库和多个服务静态内容的服务器。让多个数据库来完成这项工作会更加棘手。

Flickr 就是这样工作的。

在这里给出了更详细的答案,您可能会发现它很有用。


小智 5

实际上,除非您使用高度优化的文件系统引擎,否则您使用数据库查找数据存储实际上可能会更快,具体取决于您拥有的图像数量。数据库是为快速查找而设计的,并且使用了比文件系统更有趣的技术。

reiserfs(已过时)对于查找来说真的很棒,zfs、xfs 和 NTFS 都有很棒的散列算法,linux ext4 看起来也很有前途。

在块读取方面,系统受到的打击不会有任何不同。问题是返回文件名(可能是哈希?)的查询查找速度更快,而文件名又使用单独的打开,文件发送关闭?还是只是将 blob 倾倒出来?

有几件事情需要考虑,包括网络命中、处理命中、可分发性等。如果您将内容存储在数据库中,那么您可以移动它。再说一次,如果您将图像存储在内容交付服务上,这可能会更快,因为您没有对 yrouself 进行任何网络访问。

想一想,记住一点基准测试永远不会伤害任何人:-) 所以用你的典型数据集大小来测试它,并考虑到诸如同时查询之类的事情。