我正在构建一个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会导致一些性能问题。因此,如果在应用程序缓存中找不到此文件的位置,我最终将其缓存在磁盘上进行读取时。所以我选择了混合方案:
- 使用数据库存储使数据备份更容易,并且文件直接链接到配置文件
- 使用影子复制到磁盘以允许更好的缓存