可能已经有几个关于这个的问题,但我想得到一个更新的答案,因为现在大多数答案都是旧的。图像、数据库或文件系统的存储哪个更好?
我认为 facebook 正在使用数据库,因为图像可以有各种扩展:| 例如,请参阅此链接:jpeg jpg png gif
尽管看起来如此,但这不是品味问题,而是性能问题。对于现在活跃的项目,我已经尝试了两种方式,并在他们的开发期间吸取了教训。
将文件存储在数据库中似乎是创建易于部署、维护等的一体化设置的好方法。但是当涉及到较大的文件(例如高分辨率图像)时,它可能会显着增加加载时间。
另一方面,对于较小的图像,作为用户头像、产品缩略图、其他缩略图,它可以通过减少对服务器文件系统的请求来提高您的加载速度。在这种特定情况下,这完全取决于您可能拥有的 SQL 技能和查询的优化级别。
我会给你一个建议,我现在已经在涉及许多图像的项目中使用了它,而不仅仅是那些。
在您的数据库中创建一个表,其结构大致如下:
id INT(5) AUTO_INCREMENT PRIMARY KEY
filename VARCHAR(255)
fullsize_path CHAR(255)
image BLOB
mime CHAR(25)
size INT(20)
呃......你明白了,BLOB 字段是你的图像的去向。如果它是某物的缩略图,则 fullsize_path 不会留空并提及全尺寸图像的路径。
这样,当显示,例如一个有产品的页面时,所有的查询都将是基于 SQL 的,但是当访问一个特定的产品时,fullsize_path 会告诉浏览器在哪里可以找到大哥。
当然,在部署这样的东西时,你有更多的事情要担心,我将在这里概述一些:
当然,之前做一些性能测试是非常宝贵的实践!
我建议将文件存储在您网站上的图像/文件夹或类似文件夹中,我会使用随机数或 ID 保存它们的名称,然后将该信息存储在数据库中。那将是两者的完美结合!
我以前做过使用两种存储方式的系统,它通常取决于上下文。
对于访问大量文件且服务器数量较少(通常为 1 台服务器)的系统,存储在文件中更易于开发和维护。
对于服务器数量较多且所有服务器都需要访问文件的系统。有时我用文件和 rsync 设置它。有时我将文件存储在数据库中并让复制处理它。
Facebook 或其他网站将其图像存储在数据库中的原因很可能是因为这个。他们需要在许多服务器中访问文件,而无需复制文件的开销。
将图像存储在数据库中比将数据存储在文件系统中要安全得多。但在性能方面,将图像存储在文件系统中效率更高。我们必须根据我们的要求选择最好的方式。
您可能还想查看 Filetable 选项。优点是更简单的编程模型(可以使用 T-SQL 和 Windows API)和更简单的管理(通过 SSMS),缺点是这会使数据库更大。如果您选择此选项,您将希望将文件表放在专用文件组上,并且您将需要调整备份策略以包括文件组备份。
另一种可能性是查看 RBS(远程 BLOB 存储),它作为 SQL Server 2012 功能包的一部分(不在主要产品中)提供。