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

138

我正在构建一个ASP .NET Web解决方案,其中将包含大量图片和希望获得相当数量的访问量。我真的很想实现高性能。

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

将图片保存在文件系统中通常比将其保存在数据库中更具效率。这是因为数据库需要进行额外的处理和查询,而文件系统只需要简单地读取文件并显示它们。此外,将大量图像存储在数据库中可能会导致数据库变得非常庞大,从而影响性能。但是,如果您需要控制对图像的访问权限,则可以将它们保存在数据库中以更好地保护它们。

1
请指定您正在使用的数据库。 - Gerrie Schenck
2
我打算使用较新版本的MSSQL。 - StefanE
2
@StefanE,文件系统在所有意义上都是一个专门为文件存储优化的专业数据库。 - LukeH
9个回答

190

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

为什么?因为...

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

2
此外,在 SQL Server 中,当您将图像存储为“Image”字段时,这实际上就是 SQL 所做的 - 存储指向磁盘上某个文件的指针。这是它如何避免8KB页面限制的方法。 - Zhaph - Ben Duguid
10
这个问题实际上已经在 SQL Server 2008 中得到了解决。引入了一个新类型 FILESTREAM,可以利用“文件系统的性能,同时保持非结构化数据和相应结构化数据之间的事务一致性”。(链接:http://technet.microsoft.com/en-us/library/bb895234.aspx) - kristof
是的,你说得对。我的问题是blob的大小是多少?或者它可以存储多少内存? - Ameer

12
在我的最近开发的项目中,我把图片(和各种二进制文件)存储为数据库表中的图像列。
显然,将文件存储在数据库中的好处是,如果记录被删除,硬盘上不会有未引用的文件,因为数据库(=元数据)和硬盘(=文件存储)之间的同步并没有内置,必须手动编程实现。
使用今天的技术,我建议您将图像存储在SQL Server 2008 FILESTREAM列中(至少这是我下一个项目要做的),因为它们结合了在数据库中存储数据的优点和将大型二进制文件存储在单独的文件中的优点(至少根据广告;)) 。

你测试过Filestream功能了吗? - StefanE
1
实际上,在删除数据库记录时,可以编写代码从文件系统中删除。因此,我认为将其存储在文件系统中比存储在数据库中更好。 - kailash19

12

一直以来的格言是"文件放在文件系统中,文件元数据存储在数据库中"


7

3
所提及的帖子似乎有点过时。 - devio

6

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

  • 数据完整性:没有未引用的文件,在数据库中没有与任何文件相关联的路径
  • 数据一致性:进行数据库转储即可。不需要担心“哦,我忘记压缩这个数据目录了”等问题。

5
将图片存储在数据库中会增加单个图像的数据库开销,并且如果您发展到需要使用备用存储(S3,Akami),将难以卸载。但将其存储在数据库中使得将应用程序移动到不同服务器变得更加容易,因为现在只需要移动数据库即可。
将图片存储在磁盘上可以轻松地转移到备用存储,使图像成为静态元素,因此您无需在Web应用程序中混乱处理HTTP标头以使图像可缓存。缺点是,如果您将应用程序移动到另一台服务器,则需要记住同时移动图像,这是很容易被忽视的事情。

4

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


0

0

补充一些之前回答中没有提到的内容。如果你将图片保存在数据库中,你仍然可以从Web 级别(也许)和数据库级别获取缓存的好处。

我认为对于数据库来说,你可以通过与文本数据相关的图像存储方式以及将图片访问放入特定查询中来实现缓存查询(只是理论,所以欢迎在这方面指出错误)。

对于 Web 端,我猜测,由于你的问题标记上了 ASP.NET,你会使用 HTTP 处理程序来提供图片服务。这样,你就可以利用框架的所有优势,并且只需要将图片关键字传递给 HTTP 处理程序,就可以保持领域逻辑的整洁。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接