【问题标题】:Storing image in DB vs filesystem for user uploaded images in website将图像存储在数据库与文件系统中以供用户在网站上上传图像
【发布时间】:2014-06-09 10:01:35
【问题描述】:

我正在建立一个允许用户上传图片的网站。每个用户可以使用的最大空间也有限制。

我有两个想法。

  1. 使用 GridFS 将图像存储在像 mongoDB 这样的 NoSQL 数据库中。
  2. 将图像存储在文件系统中,并在数据库中存储路径。

以上哪个更好?为什么?

【问题讨论】:

  • 这是非常主观的,但就我个人而言,我总是将图像放在可以单独管理、访问、修改、分发和备份的文件系统中,而不是放在一些巨大的、无定形的数 TB 的全局中需要数小时才能备份的数据库,并且您需要大量 SQL 才能执行最简单的操作。 YMMV。
  • 这个问题可能更适合programmers.stackexchange.com,如果你把它改成不那么主观的话。这两种方法都可能很好,具体取决于多种因素(例如数据大小、使用模式、您拥有多少台服务器等)。尝试编辑此问题,使其不那么宽泛且难以回答。
  • 您应该考虑托管和管理大型 MongoDB 解决方案与文件系统或 AWS S3/Azure Blob/等解决方案的成本。

标签: image web-services mongodb upload gridfs


【解决方案1】:

叹息为什么大家都跳到 GridFS?

根据图像的大小和确切的用例,我建议将图像直接存储在数据库中(而不是通过 GridFS)。原因如下:

文件系统

  • 证明将图像存储在文件系统中效果很好,但它并非易事
  • 您将需要不同的备份系统、故障转移、复制等。这在 DevOps 方面可能会很棘手
  • 您将需要创建一个智能目录结构,它是一种泄漏抽象,因为不同的文件系统具有非常不同的特性。有些人在一个文件夹中存储 16k 个文件没有问题,而另一些人则开始窒息仅 1k 个文件。一种常见的方法是使用像 af/2c/af2c2ab3852df91.jpg 这样的约定,其中文件夹 af2c 是从文件名中推断出来的(它本身可能是用于重复数据删除目的的内容的哈希)。

GridFS

GridFS 用于存储 文件,并以与文件系统非常相似的方式存储文件。这有一些缺点:

  • 对于每个文件,您将需要一个 fs.file 和一个 fs.chunk 文档。大文件完全需要分块,但如果您的文件平均低于 256k,则不会进行真正的分块(默认块大小为 256k)。因此,在 GridFS 中存储小文件时,您会获得开销而没有优势。糟糕的交易。它还需要两个查询而不是一个。
  • 它为您的收藏强加了某种结构,例如拥有一个“文件名”。这取决于用例,但我经常选择使用哈希作为 id 并将哈希存储在用户中,例如。重复数据删除,易于实现,与缓存完美对齐,并且不需要提出任何约定。它也非常高效,因为索引是一个字节数组。

如果您为摄影师运营的网站可以上传 RAW 文件或 10MB 的大型 JPEG,情况可能会有所不同。在这种情况下,GridFS 可能是一个不错的选择。为了存储用户图像、缩略图等,我只需将图像放在其自己的文档中即可。

【讨论】:

    猜你喜欢
    • 2014-05-04
    • 2012-06-26
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多