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

问题描述 投票:0回答:2

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

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

数据库优势

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

  • 当我稍后构建 Web 服务时,他们可以从一个位置(数据库)提取所有与个人资料相关的数据

文件系统优点

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

  • 还有其他优点吗?

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

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

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

基础设施有问题

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

总结

阅读了 SO 上的许多相关主题,许多人现在倾向于 SQL Server Filestream 类型。然而,根据我收集到的信息(我可能是错的),当文件很小时,并没有多大好处。然而,当文件为多个 MB 或更大时,文件流看起来可以极大地提高性能。

由于我的个人资料图片往往约为 5kb 左右,我决定将它们以 varbinary(max) 形式存储在数据库的文件存储中。

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

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

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

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

profile image-upload
2个回答
14
投票

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

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

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

Flickr 就是这样工作的。

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


6
投票

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

ReiserFS(已过时)对于查找来说确实很棒。 ZFS、XFS 和 NTFS 都有出色的哈希算法。 Linux ext4 看起来也很有前途。

在块读取方面,系统上的命中不会有任何不同。问题是:什么更快,一个返回文件名(可能是哈希?)的查询查找,然后使用单独的打开、文件发送、关闭来访问文件名?或者只是把斑点倒掉?

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

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

© www.soinside.com 2019 - 2024. All rights reserved.