相比NoSQL,关系数据库为何不适合保存图像? - Reddit


在SQL数据库中存储这些图像只会使web开发更加困难,大多数图像只是存储在文件系统中,数据库中包含指向这些文件位置的指针。
不要把图像存储在任何一种数据库中,真的,除非有一个特定的理由这样做。

数据库在从磁盘检索数据时只会增加一层抽象。所以数据库速度总是比较慢,将整个图像存储在数据库中是没有意义的。此外,它会增加数据库的大小,因此您可能会向云计算厂商支付更多费用(或者在数据中心内部花费更多)。
数据库倾向于将所有内容都保存在 RAM 中,并且 blob 很大,因此您最终会使用大量内存,将数据放入文件系统的效率要高得多,这也意味着可以静态提供内容,从而使充分利用 CDN 和浏览器缓存。
使用数据库中的图像,您必须将图像从数据库服务器返回到应用程序服务器,然后将其发送到客户端,而文件系统在理想情况下,图像已经在客户端上,因此浏览器可以处理一切。
如果出于某种奇怪的原因必须将其存储在数据库中(例如:白痴老板这么说),那么由于所有的花里胡哨(多个索引,查询处理复杂性),在关系数据库中检索图像仍然需要更多时间ETC)。

另外值得一提的是,它绑定了一个数据库连接,否则该连接可能用于快速获取应用程序逻辑所需的重要数据。
来自文件系统的流式文件数据仍会占用服务器连接,但与数据库相比,您通常有更大的预算。对于使用共享数据库的负载平衡应用服务器来说尤其如此。

SQLite 比使用 fopen 从磁盘获取文件要快,但是SQLite 只有在处理 10KB 左右的文件时才会更快。
如果SQLite 与 mongodb 相比,mongodb 会更快,因为它的 db 保存在内存中,因此跳过磁盘检索使其比关系 db 更快。

喜欢将文件存储在数据库中的原因(特别是 MS SQL Server):

  • 符合 ACID 的事务
  • 空间不足错误
  • 良好的空间管理工具
  • 防止系统管理员删除/移动文件
  • 备份和恢复是一致的
  • 参照完整性约束