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

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



评论:感谢您提供许多好的答案。即使我喜欢拥有100%数据库驱动的解决方案的想法,我也将寻求基于文件的解决方案。看来今天有很好的解决方案可以执行我想要的数据库等操作,但是我有一些不这样做的原因。存储量(10gb),但数据库仅300mb。要在数据库中额外存储,将花费很多。
我不是数据库专家,也不是在控制数据库设置。基于数据库的解决方案可能需要自定义配置。

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

评论

请指定您正在使用的数据库。

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

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

#1 楼

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

为什么?因为...


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


评论


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

–扎夫-本·杜吉德
09年2月18日在16:55

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

– kristof
09年5月12日13:25

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

–阿米尔
13年4月4日上午8:45

#2 楼

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

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

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

评论


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

– StefanE
09年2月18日在15:36

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

– kailash19
2012年12月11日的13:00

#3 楼

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

#4 楼

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


我通过在http://databases.aspfaq.com/database/should-i-store-images-in-the-database-or-the- filesystem.html

评论


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

– devio
09年2月18日在15:27

#5 楼

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


数据完整性:没有未引用的文件,没有任何文件关联的db中没有路径
数据一致性:获取数据库转储,仅此而已。否“我忘了给这个数据目录添加参数。”


#6 楼

在数据库中存储映像会增加数据库开销以提供单个映像,并且如果您增长到该级别,则很难将其卸载到备用存储(S3,Akami)。将它们存储在数据库中可以使将应用程序移动到其他服务器上变得更加容易,因为现在只需要移动数据库即可。将图片设为静态元素,因此您不必为使图片可缓存而在Web应用程序中惹恼HTTP标头。缺点是,如果您曾经将应用程序移动到其他服务器,则还需要记住也要移动图像。容易忘记的东西。

#7 楼

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

#8 楼

只是为到目前为止已经很好的答案添加更多内容。如果您选择将图像保存在数据库中的路线,那么仍然可以从Web级别和数据库级别同时获得缓存的好处。存储与图像相关联的文本数据有关的图像,以及是否可以将图像访问到特定查询中,以便数据库可以缓存查询(尽管只是理论上的问题,所以请随意指点我)。

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

#9 楼

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

它为您带来数据完整性和@chburd提到的数据一致性。 br />

#10 楼


这是一个分步示例(通用方法,Spring实现,Eclipse),将图像存储在文件系统中并将元数据保存在DB中-
http://www.devmanuals.com/教程/java/spring/spring3/mvc/Spring3MVCImageUpload.html

这也是一个示例-http://www.journaldev.com/2573/spring-mvc-file-upload-example- tutorial-single-and-multiple-files

还可以研究该项目的代码库-https://github.com/jdmr/fileUpload。请注意此控制器。