Mongodb base64图像vs gridfs

时间:2013-03-24 20:22:55

标签: mongodb base64 gridfs

我正在使用mongodb,我想在我的服务器中存储一些缩略图。什么是最好的?使用GridFS或将这些图像转换为base64并将它们直接存储在文档中。

3 个答案:

答案 0 :(得分:8)

一如既往有一些优势:

<强>优点:

  • 如果只需要文档+缩略图,则减少数据库请求。
  • 减少客户请求。 (当然你可以从GridFS中获取缩略图,并将它们放在响应中,但这会导致更多的数据库请求)

<强>中性:

  • 存储要求相等

<强>缺点:

  • 您无法轻松地在另一个文档中重复使用相同的图像缩略图,因为没有可引用的ID。 (对我们来说,这不是问题,因为服务器响应是gzip压缩的,你无法真正区分1到5个相等的图像)

使用MongoDB和NoSQL可以了解您的用例!

  • 如果您的文档中的批次共享相同的图像,则应使用GridFS并仅提供指向这些文件的链接,因为 1。共享数据的空间效率更高且 2。 客户端可以缓存图像请求,只需检索一次。

  • 如果您的客户始终需要缩略图,您可以考虑在响应中将文件嵌入base64。如果 1。图像不在文档之间共享和/或 2。图像经常更改并且缓存无用/不可能,这一点尤其好。

  • Base64当然意味着线路上的流量更多,因为它需要8位才能传输6位。即75%的效率。这当然只影响客户端 - 服务器通信,因为在MongoDB中,您始终可以将数据存储为二进制字段。

  • 您是否更喜欢数据库请求(=使用GridFS)?或者更大的数据/文档大小(=嵌入式)?

我们做了什么:

我们使用嵌入式缩略图,即使我们可能有重复的图像。在服务器上激活gzip压缩后,服务器 - 客户端传输大小不再重要。但如前所述,这是一个权衡:现在我们有更少的客户端请求和更少的数据库请求,但由于嵌入使得缓存图像变得不可能,我们现在有了更多的数据。

<强>结论:

没有一种尺寸适合所有解决方案。

答案 1 :(得分:3)

这实际上取决于您的服务器端技术和个人偏好。 10gen建议您使用文档,除非您存储的文件大于文档限制(16MB)。鉴于您使用的语言,我建议您做任何更容易的事情。如果您在遵循文档后有其他文档要建模,否则请给gridFS一个镜头。

答案 2 :(得分:0)

我建议您使用GridFS。使用GridFS,您可以利用MongoDB REST API。因此,使用MongoDB API检索文档不会有任何过热。 REST API将完成所有艰苦工作并节省您的时间。