【发布时间】:2013-03-14 06:28:28
【问题描述】:
我正在使用 mongodb,我想在我的服务器中存储一些缩略图。什么是最好的?使用 GridFS 或将这些图像转换为 base64 并将它们直接存储在文档中。
【问题讨论】:
-
K 的最终尺寸是多少?在文件超过 256k 之前,GridFs 不会拆分。您将使用最终文件作为二进制文件还是 base64 文件?
我正在使用 mongodb,我想在我的服务器中存储一些缩略图。什么是最好的?使用 GridFS 或将这些图像转换为 base64 并将它们直接存储在文档中。
【问题讨论】:
一如既往地有一些(dis)优点:
优点:
中性:
缺点:
使用 MongoDB 和 NoSQL,一切都是为了了解您的用例!
如果您的许多文档共享相同的图像,您应该使用 GridFS 并只提供指向这些文件的链接,因为 1. 共享数据更节省空间并且 2. 客户端可以缓存图像请求,只需检索一次。
如果您的客户总是需要缩略图,您可能应该考虑将文件作为 base64 嵌入到响应中。如果 1. 图像不在文档之间共享和/或 2. 图像经常更改并且缓存无用/不可能,则这尤其好。
李>Base64 当然意味着更多的网络流量,因为它需要 8 位来传输 6 位。即 75% 的效率。这当然只会影响客户端-服务器通信,因为在 MongoDB 中,您始终可以将数据存储为二进制字段。
您更喜欢更多的数据库请求(= 使用 GridFS)吗?还是网络上更大的数据/文档大小(= 嵌入)?
我们做了什么:
我们使用嵌入的缩略图,即使我们可能有重复的图像。在服务器上激活 gzip 压缩后,服务器-客户端传输大小不再重要。但如前所述,这是一个折衷方案:现在我们的客户端请求和数据库请求减少了,但是因为嵌入使得缓存图像变得不可能,所以我们现在有更多的在线数据。
结论:
没有一种万能的解决方案。
【讨论】:
这真的取决于您的服务器端技术和个人喜好。 10gen 建议您使用文档,除非您存储的文件大于文档限制 (16MB)。鉴于您使用的语言,我建议您做任何更容易的事情。如果你有其他文档可以按照文档建模,否则可以试试gridFS。
【讨论】:
我建议你使用GridFS。使用GridFS,您可以利用MongoDB REST API。因此,使用 MongoDB API 检索文档不会有任何过热。 REST API 将完成所有繁重的工作并节省您的时间。
【讨论】: