在Mongo数据库中存储图像文件,这是一个好的想法吗?

24

使用MySQL时,将图像存储为BLOB格式的数据不是一个好主意,因为会使数据库变得非常庞大,对于数据库的正常使用是有害的。相反,最好将图像文件保存在磁盘上,并在数据库中保存链接。

然而,在MongoDB中,增加数据库文件大小对性能几乎没有影响(这也是MongoDB可以成功处理数十亿条记录的原因)。

您认为将图像文件保存在MongoDB中(作为GridFS)以减少服务器上存储的文件数量是否更好;还是尽可能保持数据库尽可能小呢?

4个回答

34

问题并不是数据库变得很大,数据库可以处理它(尽管MongoDB在这方面不如许多其他数据库)。问题在于要将数据发送到客户端,数据库首先必须将其移动到RAM中,然后复制到应用程序的内存中,然后交给内核通过套接字发送。这浪费了大量的RAM和CPU周期。之所以将大文件放在文件系统中更好,是因为更容易避免复制,您可以请求内核直接从磁盘向套接字流式传输文件。

将大文件存储在文件系统中的缺点是分发更加困难。使用数据库和像Mongo的GridFS这样的工具使得扩展成为可能。您只需确保不要一次将整个文件复制到应用程序的内存中,而是逐块复制。现今大多数网络应用框架都支持发送分块HTTP响应。


这个答案已经过时了:https://github.com/workshopper/stream-adventure - Michael Cole

13

答案是肯定的。在史前时代,服务器具有可变的文件系统,您可以更改它们。这很好,直到我们尝试扩展规模。

如今,现代人使用不可变部署构建应用程序。HerokuDokku就是其中的例子。由于Web应用程序服务器没有状态,因此它们可以轻松创建、升级、扩展和销毁。

由于我们仍然有文件,所以需要将它们放在某个地方。有几种解决方案:nfs、我们的数据库、别人的数据库。

  • nfs是一种“网络文件系统”,它允许您在网络资源上进行文件I/O操作。如果您已经处理了网络,除非这是您已知的内容,否则它不会增加太多价值。

  • 我们的数据库 - 对于MongoDB有两个选项:(文件> 16mb)?GridFS:BinData

  • 其他人的数据库 - 有些像Amazon S3这样基本,有些则提供额外的服务,如Cloudinary或Dropbox。

如果您在大型企业团队中,并且有人每周花费40小时来管理服务器,那么可以使用文件系统。如果您正在构建可扩展的Web应用程序,则将文件放入数据库是有意义的。

如果您担心性能:

1)使用代理(例如nginx)或CDN来为客户端托管您的内容。您的服务器应该只提供缓存未命中。

2) 使用流式IO Nodeschool 有一个很酷的Node.js教程


2

将图片存储在任何数据库中都不是一个好主意,因为:

  • 与文件系统相比,读写数据库始终更慢
  • 您的数据库备份变得巨大且更耗时
  • 现在访问文件需要通过您的应用程序和数据库层

最后两个原因是真正的问题所在。

来源:三件事情,您永远不应该放入数据库

因此,如果您的应用程序聪明一些,最好不要上传您的图片到 MongoDB

然而,如果您接近截止日期...并且数据库非常小,它不会大量增长,并且其大小永远不会超过运行应用程序的机器上可用的RAM,则我认为(与引用文章的作者相反),您可以考虑将图像存储在 MongoDB 中。它很简单,方便,快速实现并为您提供一些灵活性。


1
MongoDB的GridFS专为此类存储而设计,在许多不同的服务器上存储图像文件非常方便,并且所有服务器都可以使用它们。

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