9

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

4

3 回答 3

8

与往常一样,有一些(dis)优点:

优点:

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

中性的:

  • 存储要求相同

缺点:

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

使用 MongoDB 和 NoSQL,一切都是为了了解您的用例!

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

  • 如果您的客户总是需要缩略图,您可能应该考虑将文件作为 base64 嵌入响应中。这特别好,如果1.图像不在文档之间共享和/或2.图像经常更改并且缓存是无用的/不可能的。

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

  • 你喜欢更多的数据库请求(= 使用 GridFS)吗?或者网络上更大的数据/文档大小(=嵌入)?

我们做了什么:

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

结论:

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

于 2015-08-08T17:45:01.927 回答
3

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

于 2013-05-19T05:48:35.897 回答
0

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

于 2013-04-06T17:22:30.133 回答