【问题标题】:Store user profile pictures on disk or in the database?将用户个人资料图片存储在磁盘上还是数据库中?
【发布时间】:2011-03-19 06:56:47
【问题描述】:

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

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

数据库优势

  • 轻松备份整个数据库并将配置文件内容/图像与关联的配置文件/用户表一起保存

  • 当我稍后构建网络服务时,他们可以从一个位置(数据库)提取所有与配置文件相关的数据

文件系统优势

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

  • 还有其他优势吗?

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

也许有办法将从数据库中提取的图像缓存一段时间?

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

有问题的基础设施

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

总结

在 SO 上阅读了很多相关主题后,现在很多人都倾向于 SQL Server Filestream 类型。然而,从我可以收集到的信息(我可能错了),当文件非常小时没有太多好处。然而,当文件为数 MB 或更大时,文件流看起来会大大提高性能。

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

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

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

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

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

【问题讨论】:

  • 你应该阅读这个:stackoverflow.com/questions/3748/…
  • 对不起,我的问题有一些错别字。从我的 iPhone 上输入这个。当我使用电脑时将进行编辑。
  • 谢谢安德斯,这正是我想要的。您链接的主题中有很多观点和意见。

标签: profile image-upload


【解决方案1】:

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

reiserfs(已过时)非常适合查找,zfs、xfs 和 NTFS 都有出色的哈希算法,linux ext4 看起来也很有前途。

就块读取而言,系统命中不会有任何不同。问题是返回文件名(可能是哈希?)的查询查找更快,而文件名又使用单独的打开、文件发送关闭来访问?或者只是把blob倒掉?

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

想一想,并记住一点基准测试永远不会伤害任何人 :-) 因此,请使用您的典型数据集大小对其进行测试,并考虑同时查询等因素。

【讨论】:

  • 嗨精灵王。你对基础设施提出了一个很好的观点,我已经更新了我的问题。虽然我意识到有很多因素需要考虑(正如你所指出的),但我正在寻找一些有见地的意见/可能是关于尝试过一种或另一种方法的人的一些经验以及它是如何奏效的。
  • 嗯,我已经成功地在大型项目的生产环境中完成了这两项工作。在一个项目中,系统每天每秒生成大约 10 x 10MB 图像,所有图像都必须分类并关联到多个用户。 (在那里使用了 FS 和 DB 的组合)。这里由于生产率高不得不使用分布式FS。在其他情况下,图像很大但是静态的,在那里使用了 DB blob。我认为对于您的应用程序,仅使用 DB 可能会更好。您可能还需要考虑谁拥有数字图像的合法性。
【解决方案2】:

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

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

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

Flickr 就是这样工作的。

我给了more detailed answer here,你可能会觉得有用。

【讨论】:

  • 太棒了。我试图找到一种在我的网站中存储个人资料图片的好方法,我也将采用此解决方案
  • @JonKoivula 我有另一个更详细的答案。这可能会有所帮助。 stackoverflow.com/questions/8922056/…
  • 哇,非常感谢弗兰基,你真的给了我一个有用的答案。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 2014-12-20
  • 2016-10-24
相关资源
最近更新 更多