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

时间:2010-07-21 23:07:26

标签: 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这样从数据库中拉出的图像。所以如果在我的应用程序缓存中找不到该文件的位置,我最终会在磁盘上缓存该文件。

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

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

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

2 个答案:

答案 0 :(得分:4)

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

reiserfs(已废弃)对查找非常棒,zfs,xfs和NTFS都有很棒的哈希算法,linux ext4看起来也很有希望。

在块读取方面,对系统的命中不会有任何不同。问题是什么是更快的查询查找返回文件名(可能是一个哈希?)反过来使用单独的open,filesend close访问?或者只是将blob倾倒出去?

有几件事要考虑,包括网络命中,处理命中,可分发性等。如果你将东西存储在数据库中,那么你可以移动它。然后再次,如果您将图像存储在内容传送服务上,因为您没有对自己进行任何网络点击,可能会更快。

考虑一下,记住一点基准测试从来没有伤害过任何人:-)所以用典型的数据集大小测试一下,并考虑同步查询等问题。

答案 1 :(得分:4)

存储对数据库中文件的引用并将文件本身存储在磁盘上

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

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

Flickr以这种方式工作。

希望它有所帮助。