将图片存储为文件或存储在诸如 MSSQL 之类的数据库中以用于 Web 应用程序?
Posted
技术标签:
【中文标题】将图片存储为文件或存储在诸如 MSSQL 之类的数据库中以用于 Web 应用程序?【英文标题】:Store pictures as files or in the database like MSSQL for a web app? 【发布时间】:2010-10-08 08:49:48 【问题描述】:我正在构建一个 ASP .NET Web 解决方案,该解决方案将包含大量图片并希望有相当多的流量。我真的很想取得成绩。
我应该将图片保存在数据库中还是文件系统中?而且无论答案如何,我对为什么选择特定方式更感兴趣。
【问题讨论】:
请指定您使用的数据库。 我确实打算使用更高版本的MSSQL。 @StefanE,从所有意图和目的来看,文件系统都是针对文件存储优化的专用数据库。 【参考方案1】:将图片存储在文件系统中,并将图片位置存储在数据库中。
为什么?因为……
-
您可以将图片作为静态文件提供。
获取图片不需要数据库访问或应用程序代码。
可以从不同的服务器提供图像以提高性能。
它将减少数据库瓶颈。
数据库最终将其数据存储在文件系统中。
图像存储在文件系统中时可以轻松缓存。
【讨论】:
另外,在 SQL Server 中,当您将图像存储为“图像”字段时,这实际上就是 SQL 正在做的事情 - 将指向文件的指针存储在磁盘上的某个位置。这就是它绕过 8KB 页面限制的方式。 这实际上已经解决的是 SQL Server 2008。引入了一种新类型 FILESTREAM technet.microsoft.com/en-us/library/bb895234.aspx,它允许利用“文件系统的性能,同时保持文件系统之间的事务一致性”非结构化数据和相应的结构化数据” 是的,你错了。我的问题是blob的大小是多少?或者它可以存储多少内存?【参考方案2】:在我最近开发的项目中,我将图像(以及各种二进制文档)作为图像列存储在数据库表中。
将文件存储在数据库中的优势显然是,如果删除记录,您最终不会在硬盘上看到未引用的文件,因为数据库(= 元数据)和硬盘(= 文件存储)之间的同步不是内置,必须手动编程。
使用当今的技术,我建议您将图像存储在 SQL Server 2008 FILESTREAM 列中(至少我将在下一个项目中这样做),因为它们结合了将数据存储在数据库中和将大型二进制文件分开存储的优势文件(至少根据广告;))
【讨论】:
你测试过文件流功能了吗? 其实在删除DB记录时,也可以通过编码从文件系统中删除。所以我发现存储在 FS 中而不是 DB 中更好【参考方案3】:格言一直是“文件系统中的文件,数据库中的文件元数据”
【讨论】:
【参考方案4】:最好将文件存储为文件。不同的数据库以不同的方式处理 Blob 数据,因此如果您必须迁移后端,您可能会遇到麻烦。
在提供图像时,将
我通过谷歌搜索您的问题并阅读 http://databases.aspfaq.com/database/should-i-store-images-in-the-database-or-the-filesystem.html 的 cmets 找到了这个答案
【讨论】:
引用的帖子似乎有点过时了。【参考方案5】:我通常喜欢在数据库中有二进制文件,因为:
数据完整性:没有未引用的文件,没有任何关联文件的 db 中没有路径 数据一致性:进行数据库转储,仅此而已。 no "哦,我忘了 targz 这个数据目录。"【讨论】:
【参考方案6】:在数据库中存储图像会增加为单个图像提供服务的数据库开销,并且如果您增长到该级别,则很难将其卸载到备用存储(S3、Akami)。将它们存储在数据库中可以更轻松地将您的应用移动到不同的服务器,因为现在只需要移动数据库。
在磁盘上存储图像可以轻松卸载到备用存储,使图像成为静态元素,因此您不必在 Web 应用程序中处理 HTTP 标头以使图像可缓存。不利的一面是,如果您将应用程序移动到不同的服务器,您也需要记住移动图像;很容易忘记的东西。
【讨论】:
【参考方案7】:对于基于 Web 的应用程序,您将通过使用文件系统来存储图像获得更好的性能。这样做将允许您轻松地在应用程序中实现多个级别的图像缓存。在数据库中存储图像有一些优势,但大多数时候这些优势来自基于客户端的应用程序。
【讨论】:
【参考方案8】:只是为到目前为止已经很好的答案添加更多内容。如果您将图像保存在数据库中,您仍然可以从 Web 级别也许和数据库级别获得缓存的好处。
我认为对于数据库,您可以通过如何存储与相关文本数据相关的图像以及是否可以将图像访问到特定查询中来实现这一点,以便数据库可以缓存查询(尽管只是理论,所以请随意对我进行核弹)。
对于 web 端,我猜你的问题是用 asp.net 标记的,你会使用 http 处理程序来提供图像。然后,您可以使用该框架的所有好处,并且只需将图像的密钥传递给 http 处理程序,就可以使您的域逻辑更清晰。
【讨论】:
【参考方案9】:-
这是一个在文件系统中存储图像并将其元数据保存在数据库中的分步示例(一般方法,Spring 实现,
Eclipse
)——
http://www.devmanuals.com/tutorials/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。关注this控制器。
【讨论】:
以上是关于将图片存储为文件或存储在诸如 MSSQL 之类的数据库中以用于 Web 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 laravel 中实现诸如 Fiverr 之类的信用卡和贝宝交易
zend框架,我可以在其中存储个人资料图片或其他用户上传的图片的路径
iText7 & C# 从存储在 MSSQL DB 中的 PDF 中提取页面