【问题标题】:Mongodb base64 image vs gridfsMongodb base64图像与gridfs
【发布时间】:2013-03-14 06:28:28
【问题描述】:

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

【问题讨论】:

  • K 的最终尺寸是多少?在文件超过 256k 之前,GridFs 不会拆分。您将使用最终文件作为二进制文件还是 base64 文件?

标签: mongodb base64 gridfs


【解决方案1】:

一如既往地有一些(dis)优点:

优点:

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

中性:

  • 存储要求相同

缺点:

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

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

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

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

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

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

我们做了什么:

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

结论:

没有一种万能的解决方案。

【讨论】:

  • 你能举一个例子,说明你在上传到 GRIDFS 后如何获取文件的链接/url/路径(它可以帮助很多)?
  • 当您将文件上传到 GridFS 时,MongoDB 将生成一个 ObjectId - 就像您存储的任何其他文档一样。 GridFS 并不是真正的 MongoDB 功能,它通常是 MongoDB 客户端库的一部分。例如:mongodb.github.io/mongo-java-driver/3.5/driver/tutorials/gridfs
【解决方案2】:

这真的取决于您的服务器端技术和个人喜好。 10gen 建议您使用文档,除非您存储的文件大于文档限制 (16MB)。鉴于您使用的语言,我建议您做任何更容易的事情。如果你有其他文档可以按照文档建模,否则可以试试gridFS。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 2016-04-27
      • 1970-01-01
      相关资源
      最近更新 更多