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

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

我应该将图片保存在数据库还是文件系统上? 而不pipe答案,我更感兴趣的是为什么select一个特定的方式。

非常感谢,Stefan

DUPLICATE : 在DB中存储图像 – 是或否? , 如何将图像存储在文件系统中 , 存储less量图像:blob或fs? 可能还有其他一些


评论:感谢您的许多很好的答案。 即使我喜欢100%数据库驱动的解决scheme,我也会select基于文件的解决scheme。 看来,今天有好的解决scheme来做我想要的数据库等,但我有一些不这样做的原因。

  • 我将在一个托pipe的解决scheme,我有大量的存储(10GB),但只有300MB的数据库。 在数据库中额外存储会花费很多。

  • 我不是DB专家,也不是DB的设置控制。 基于DB的解决scheme可能需要自定义configuration。

如果我们将移动到我们自己的服务器上运行该网站,我可能会考虑一个基于DB的解决scheme。 谢谢,Stefan

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

为什么? 因为…

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

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

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

使用今天的技术,我build议你将图像存储在SQL Server 2008 FILESTREAM列中(至less这就是我要做的下一个项目),因为它们结合了数据库中存储数据的优点,并在单独的文件中包含大的二进制文件至less根据广告;))

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

最好将文件存储为文件。 不同的数据库不同地处理Blob数据,所以如果你不得不迁移你的后端,你可能会遇到麻烦。

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

我发现这个答案从谷歌search您的问题,并阅读在http://databases.aspfaq.com/database/should-i-store-images-in-the-database-or-the-filesystem.html

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

  • 数据完整性:没有未引用的文件,数据库中没有任何文件关联的path
  • 数据一致性:采取数据库转储,这一切。 不,“我忘了打这个数据目录。”

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

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

对于基于Web的应用程序,使用文件系统来存储图像将会获得更好的性能。 这样做可以让您轻松实现应用程序中多个级别的图像caching。 将图像存储在数据库中有一些优点,但大多数情况下这些优点都是基于客户端的应用程序。

只是为了增加更多已经很好的答案。 如果你走的路线保持你的图像在数据库中,您仍然可以从networking级别和数据库级别获得caching的好处。

我认为,对于数据库,您可以通过如何将图像与关联的文本数据相关联来存储,以及如何将图像访问到特定的查询中,以便数据库可以caching查询(尽pipe理论上是这样的随时在这一部分对我进行攻击)。

在networking方面,我猜想,因为你的问题被标记为与asp.net,你会去使用HTTP处理程序来提供图像的路线。 然后,您可以使用框架的所有优势,只需将密钥传递到http处理程序,就可以保持域逻辑清洁。

为什么不select一个单独的NoSql数据库来存储您的文件。

它为您带来数据完整性,数据一致性如@chburd所述。

而你rdbms仍然很小。

  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 。 注意这个控制器。