将图片存储为文件或存储在Web应用程序的数据库中?

时间:2009-02-18 15:16:49

标签: asp.net database filesystems image

我的问题相当通用,我知道可能没有100%的答案。我正在构建一个ASP .NET Web解决方案,其中包含大量图片,并希望有相当多的流量。我确实想要达到性能。

我应该将图片保存在数据库还是文件系统中?无论答案如何,我都更感兴趣为什么选择特定的方式。

非常感谢, 斯特凡

DUPLICATE Storing Images in DB - Yea or Nay?How to store images in your filesystemStoring a small number of images: blob or fs?以及其他一些人。


意见:感谢许多好的答案。即使我喜欢使用100%数据库驱动的解决方案,我也会选择基于文件的解决方案。似乎今天有很好的解决方案来做我想要的数据库等,但我有几个理由不这样做。

  • 我将使用托管解决方案,我有大量的存储空间(10gb)但数据库只有300mb。在DB中额外存储会花费很多。

  • 我不是数据库专家,也不能控制数据库的设置。基于数据库的解决方案可能需要自定义配置。

如果我们要在我们自己的服务器上运行该站点,我可能会考虑基于数据库的解决方案。 谢谢, 斯特凡

10 个答案:

答案 0 :(得分:169)

将图片存储在文件系统和数据库中的图片位置。

为什么呢?因为...

  1. 您可以将图片作为静态文件提供。
  2. 无需数据库访问或应用程序代码即可获取图片。
  3. 可以从其他服务器提供图像以提高性能。
  4. 它将减少数据库瓶颈。
  5. 数据库最终将其数据存储在文件系统中。
  6. 存储在文件系统上时,可以轻松缓存图像。

答案 1 :(得分:11)

在我最近开发的项目中,我将图像(和各种二进制文档)存储为数据库表中的图像列。

将文件存储在数据库中的优势显然是,如果删除记录,您不会在硬盘上找到未引用的文件,因为数据库(=元数据)和硬盘(=文件存储)之间的同步不是内置并且必须手动编程。

使用今天的技术,我建议您将图像存储在SQL Server 2008 FILESTREAM列中(至少这是我将要对下一个项目执行的操作),因为它们结合了在数据库中存储数据和在单独存储大型二进制文件的优点文件(至少根据广告;))

答案 2 :(得分:7)

格言一直是“文件系统中的文件,数据库中的文件元数据”

答案 3 :(得分:6)

最好将文件存储为文件。不同的数据库以不同的方式处理Blob数据,因此如果您必须迁移后端,则可能会遇到麻烦。

当服务时,一个< img src =到服务器上已存在的文件可能比从数据库字段创建临时文件并指向< img标签。

我通过Google搜索您的问题并在http://databases.aspfaq.com/database/should-i-store-images-in-the-database-or-the-filesystem.html

阅读评论时找到了这个答案

答案 4 :(得分:6)

我通常喜欢在数据库中使用二进制文件,因为:

  • 数据完整性:没有未引用的文件,没有任何文件关联的数据库中没有路径
  • 数据一致性:采取数据库转储,这就是全部。不,“我忘记了这个数据目录。”

答案 5 :(得分:4)

在数据库中存储图像会增加数据库开销,以便为单个图像提供服务,并且如果增长到该级别,则很难卸载到备用存储(S3,Akami)。将它们存储在数据库中可以更容易地将应用程序移动到其他服务器,因为它只是需要立即移动的数据库。

将图像存储在磁盘上可以轻松卸载到备用存储,使图像成为静态元素,因此您不必乱用Web应用程序中的HTTP标头来使图像可缓存。缺点是,如果您将应用程序移动到其他服务器,则需要记住移动图像;一些容易被遗忘的东西。

答案 6 :(得分:3)

对于基于Web的应用程序,您将通过使用文件系统来存储图像,从而获得更好的性能。这样做可以让您轻松地在应用程序中的多个级别实现图像缓存。将图像存储在数据库中有一些优点,但大多数时候这些优点都来自基于客户端的应用程序。

答案 7 :(得分:0)

到目前为止,只是为已经很好的答案添加更多内容。如果您沿着路线保留数据库中的图像,您仍然可以从网站级别 可能 和数据库级别获得缓存的好处。

我认为对于数据库,你可以通过如何存储与它们相关的文本数据相关的图像,以及是否可以将图像访问到特定查询中,以便数据库可以缓存查询(只是理论,但在那一部分我可以自由地对我进行核对)。

在网络方面,我猜是因为你的问题是用asp.net标记的,你会选择使用http处理程序来提供图像。然后,您可以使用框架的所有好处,只需将密钥传递给http处理程序,就可以保持域逻辑清洁。

答案 8 :(得分:-1)

为什么不选择单独的NoSql数据库来存储文件。

它为您提供了数据完整性,数据一致性,如@chburd所述。

虽然你的rdbms仍然很小。

答案 9 :(得分:-1)

  1. 以下是在文件系统中存储图像并将其元数据保存在数据库中的分步示例(一般方法,Spring实现,Eclipse) - http://www.devmanuals.com/tutorials/java/spring/spring3/mvc/Spring3MVCImageUpload.html
  2. 这是一个例子 - http://www.journaldev.com/2573/spring-mvc-file-upload-example-tutorial-single-and-multiple-files
  3. 您还可以调查此项目的代码库 - https://github.com/jdmr/fileUpload。注意this控制器。