我正在使用一款将图片大量存储在数据库中的应用程序。你对此有何看法?我更倾向于将其位置存储在文件系统中,而不是直接存储在数据库中。
你认为这样做的利弊是什么?
这是一篇关于该主题的有趣白皮书。
答案是“取决于情况”。当然,这取决于数据库服务器及其处理blob存储的方法。这也取决于存储在blob中的数据类型以及如何访问该数据。
较小的文件可以使用数据库作为存储机制有效地存储和传递。较大的文件最好使用文件系统进行存储,特别是如果它们经常被修改/更新。(blob碎片化成为与性能有关的问题。)
还有一点要记住。支持使用数据库存储blob的原因之一是ACID合规性。然而,在白皮书中测试人员使用的方法(SQL Server的批量记录选项)使SQL Server吞吐量翻倍,实际上将ACID中的'D'改变成了'd',因为blob数据没有随事务的初始写入一起被记录。因此,如果完全的ACID合规性是您系统的重要要求,请在比较文件I/O和数据库blob I/O时将SQL Server写入的吞吐量数字减半。
还没有人提到但值得注意的是,在大多数文件系统中存储大量图像也存在问题。例如,如果按上述方法为每个图像文件命名主键,当你达到非常大量的图像时(例如数十万或数百万),尝试将所有图像放在一个大目录中就会遇到问题。
通常的解决方案是将它们哈希成平衡子目录树。
有一件没有被提到的事情是数据库能够保证原子操作、事务完整性并处理并发。甚至在文件系统中,参照完整性也会失效——那么你怎么知道你的文件名是否仍然正确?
如果你把你的图片存储到一个文件系统里,当你正在写入新版本或者删除文件时,有人正在读取这个文件——会发生什么?
我们使用blob是因为它们更容易管理(备份、复制、传输)。对我们来说,它们的表现很好。
只将图片路径存储在数据库中存在的问题是无法强制维护数据库完整性。
如果被路径指向的实际图像不可用,则数据库会无意中出现完整性错误。
鉴于这些图像是需要寻找的实际数据,并且它们可以更容易地管理(图像不会突然消失)在一个集成的数据库中,而不必与某种文件系统进行接口交互(如果独立访问文件系统,则图像可能会突然“消失”),我建议直接将它们作为BLOB或类似对象存储。
我曾在一家公司工作,我们在 Oracle 8i (后升级到9i) 数据库中存储了1.55亿张图片,总共7.5TB。
如果你没有使用SQL Server 2008,而且有一些充分的理由需要将特定的图像文件放在数据库中,那么你可以采用“两者兼备”的方法,使用文件系统作为临时缓存,并使用数据库作为主要仓库。
例如,你的业务逻辑可以在提供图像文件之前检查磁盘上是否存在该文件,必要时从数据库中检索。这样做可以让你拥有多个Web服务器并减少同步问题。