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


124

我的问题很笼统,我知道可能不会100%回答。我正在构建一个ASP .NET Web解决方案,该解决方案将包含很多图片,并希望有大量流量。我确实很想实现性能。

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

非常感谢,斯特凡

重复将图像存储在数据库中-是或否?如何在文件系统中存储图像存储少量图像:blob或fs?可能还有一些。


评论:感谢您提供许多好的答案。即使我喜欢拥有100%数据库驱动的解决方案的想法,我也将寻求基于文件的解决方案。似乎今天有很好的解决方案来完成我想要对数据库进行的操作,但是我有一些不这样做的原因。

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

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

如果我们要在自己的服务器上运行站点,则可以考虑基于数据库的解决方案。谢谢,Stefan


1
请指定您正在使用的数据库。
Gerrie Schenck,2009年

1
我确实打算使用更高版本的MSSQL。
StefanE

1
@StefanE,文件系统在所有方面都是针对文件存储进行优化的专用数据库。
路加福音

Answers:


175

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

为什么?因为...

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

1
同样,在SQL Server中,当将图像存储为“图像”字段时,这实际上是SQL所做的-将指向文件的指针存储在磁盘上的某个位置。这就是如何解决8KB页面限制的问题。
Zhaph-Ben Duguid

9
这实际上已经在SQL Server 2008中得到解决。引入了FILESTREAM technet.microsoft.com/en-us/library/bb895234.aspx这个新类型,它可以利用“文件系统的性能并同时维护”非结构化数据和相应的结构化数据之间的事务一致性”
kristof

是的,您不对。我的问题是斑点的大小是多少?或它可以存储多少内存?
Ameer

11

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

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

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


您是否已经测试过Filestream功能?
StefanE

1
实际上,在删除数据库记录时,也可以被编码为从文件系统中删除。因此,我发现将其存储在FS中而不是DB中是很好的
做法


6

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

在服务器上已存在的文件中提供<img src =时,可能比从数据库字段中创建一个临时文件并将<img标记指向该文件更快。

我通过搜索您的问题并阅读http://databases.aspfaq.com/database/should-i-store-images-in-the-database-or-the-filesystem.html中的注释找到了这个答案。


1
推荐的帖子似乎有点过时了。
devio

6

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

  • 数据完整性:没有未引用的文件,db中没有任何关联文件的路径
  • 数据一致性:完成数据库转储,仅此而已。否“我忘记保存此数据目录。”

4

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

将图像存储在磁盘上可以很容易地将其卸载到备用存储中,使图像成为静态元素,因此您不必为了使图像可缓存而在Web应用程序中惹恼HTTP标头。不利的一面是,如果您曾经将应用程序移动到其他服务器,则还需要记住也要移动图像。容易忘记的东西。


3

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


0

只是为到目前为止已经很好的答案添加更多内容。您仍然可以从两个Web级别获得缓存的好处,也许,如果你去的路线让您的图像数据库和数据库级别。

我认为对于数据库,您可以通过以下方式来实现此目的:如何存储与关联的文本数据相关的图像,以及是否可以将图像访问到特定查询中,以便数据库可以缓存查询(尽管如此,但理论如此)请随意在那部分上指责我)。

在网络方面,我想您可能会因为使用asp.net标记了您的问题而走上了使用http处理程序提供图像的路线。然后,您可以使用框架的所有好处,并且只需要将映像的密钥传递给http处理程序,就可以使域逻辑更整洁。


-1

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

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

尽管您的rdbms仍然很小。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.