代码之家  ›  专栏  ›  技术社区  ›  kurast

保存图像:文件还是水滴?

  •  15
  • kurast  · 技术社区  · 17 年前

    副本: Storing Images in DB - Yea or Nay?

    9 回复  |  直到 9 年前
        1
  •  25
  •   Brandon Wood    17 年前

    我通常将它们存储为文件,并将路径存储在数据库中。对我来说,这是一种比将它们作为BLOB推入数据库更简单、更自然的方法。

    将它们存储在数据库中的一个理由是:进行完整备份要容易得多,但这取决于您的需要。如果您需要能够轻松地获取数据库(包括图像)的完整快照,那么将它们作为blob存储在数据库中可能是一种方法。否则,您必须将数据库备份与文件备份配对,并以某种方式尝试将两者关联起来,以便在必须执行恢复时,您知道要恢复哪一对。

        2
  •  14
  •   Sean    17 年前

    这取决于图像的大小。

    微软研究院有一个 interesting document

        3
  •  11
  •   giorgian    17 年前

    我曾尝试使用db(SQL Server和MySQL)存储中型(<5mb)文件,但遇到了很多麻烦。

    1) 一些数据库(SQLServerExpress)有大小限制;

    3) 当您必须显示一个对象列表时,如果您不小心从表中选择*,大量数据将试图从数据库中上下移动,导致响应速度极慢或内存故障;

    4) 一些前端(ruby ActiveRecord)在处理blob时有很大的问题。

    只需使用文件。不要将它们都存储在同一个目录中,使用一些技术将它们放在多个目录中(例如,可以使用GUID的最后两个字符或int id的最后两个数字),然后将路径存储在db上。

        4
  •  5
  •   Sfynx    15 年前

    数据库服务器的性能影响是一个没有实际意义的问题。如果您需要文件系统的性能优势,只需在第一次请求时将其缓存在那里即可。随后,可以通过直接链接直接从文件系统提供后续请求(对于web应用程序,您可以在刷新输出缓冲区之前使用该链接重写HTML)。

    这提供了两个方面的最佳效果:

    • 权威商店是 数据库,保持事务性和 参照完整性
    • 您可以通过以下方式部署所有用户数据:
    • 清空此缓存(例如,通过添加 web服务器)只会导致 临时性能在运行时受到影响 自动重新加注。

    我一直提倡“数据库作为用户数据存储,除非”的方法,因为它在体系结构上更好,并且不一定因为有效的缓存而更慢。

    话虽如此,将文件系统用作权威存储的一个很好的理由是当您确实需要使用外部独立工具来访问它时,例如SFTP和诸如此类的工具。

        5
  •  2
  •   Mikey    17 年前

        6
  •  2
  •   The Disintegrator    17 年前

    通过保存,你的意思是使用它们显示在网页或类似的东西? 如果是这样的话,更好的选择是使用文件,如果你使用一个数据库,它会不断地受到照片请求的影响。这是一种规模不太大的情况。

        7
  •  2
  •   APC    17 年前

    但是如果你指的是属于应用程序基础结构的图像,而不是用户数据,那么答案可能是否定的。

        8
  •  2
  •   chaos    12 年前

    如果我在一台web服务器上运行,并且只在一台web服务器上运行,我会将它们存储为文件。如果我在多个webheads上运行,我会将图像的引用实例放在数据库中 BLOB 并将其作为文件缓存在webheads上。

        9
  •  1
  •   Chet Chet    17 年前

        10
  •  0
  •   Kirti Chaturvedi    6 年前

    1.易变性是图像不需要的,因为我们不会改变图像的二进制数据,我们只会删除整个图像 2.索引搜索:图像不需要索引,因为图像的内容无法索引,索引搜索搜索BLOB的内容。

    在这里使用文件系统是有益的,因为 1.更便宜 2.使用CDN实现快速访问

        11
  •  0
  •   raman bhadauria    5 年前

    我建议使用文件系统。首先,让我们讨论一下为什么不是Blob?所以要回答这个问题,我们需要思考DB比文件系统提供了什么优势?

    1. 易变性 :我们可以在存储后修改数据。 不适用 如果是图像。图像只是一系列的1和0。每当我们改变一个图像时,改变的不是几个1和0,因此,修改相同的图像内容是没有意义的。最好删除旧的,然后存储新的。
    2. :我们可以创建索引以加快搜索速度。但它不适用于图像,因为图像仅为1和0,我们无法为其编制索引。

    那为什么是文件系统呢?

    1. 更快的访问 :如果我们将图像存储在数据库中的Blob中,则需要一个获取完整记录的查询( select * )将导致查询的性能非常差,因为大量数据将进出数据库。相反,如果我们只将图像的URL存储在DB中,并将图像存储在分布式文件系统(DFS)中,速度会快得多。
    2. 尺寸限制 :如果DBs正在存储大量图像,那么它可能会面临性能问题,并达到其内存限制(很少有DBs拥有它)。