存储二进制或图像文件的最佳方式

Posted

技术标签:

【中文标题】存储二进制或图像文件的最佳方式【英文标题】:Best way storing binary or image files 【发布时间】:2011-01-02 23:24:51 【问题描述】:

存储二进制图像文件的最佳方式是什么?

    数据库系统 文件系统

解释一下,为什么?

【问题讨论】:

请为这个问题提供更多背景信息。对于家庭用户、在线商店、谷歌地图和偏执的企业环境来说,答案可能完全不同。 如果有一种正确方式,我怀疑会有两种可能性!这取决于你在做什么。我有一些应用程序以一种方式开始并最终以另一种方式进行,因为事情发生了变化。无论你做什么,你都应该把它抽象出来,这样你就可以在不改变所有代码的情况下改变它。 @Wim Hollebrandse:很抱歉,您的评论出乎意料。我在这里发布问题以获得解决方案,而不是获得排名。我需要解决方案,当我拥有它时,我会感到很高兴。感谢 ***.com 提供的此类服务。 @Saiful:这不是关于你获得排名,而是关于用户花时间正确回答你的问题并以声誉的形式获得奖励。同样,它将为其他用户(遇到相同问题)提供最有助于“解决”您的问题的答案。这是一个社区的事情,你知道的。 可能重复:***.com/questions/3748/… 【参考方案1】:

没有真正的最佳方法,只有一堆取舍。

数据库专家: 1. 在集群环境中更容易处理。 2. 不依赖文件服务器等额外资源。 3. 负载均衡环境下无需设置“同步”操作。 4. 备份自动包含文件。

数据库缺点: 1. 数据库的大小/增长。 2. 根据数据库服务器和您的语言,可能难以放入和检索。 3. 速度/性能。 4. 根据数据库服务器,上传和导出时需要对文件进行病毒扫描。


文件专家: 1. 对于单 Web/单 db 服务器安装,速度很快。 2. 很好理解的文件操作能力。换句话说,如果您的磁盘空间不足,您可以轻松地将文件移动到其他位置。 3.可以在文件“静止”时进行病毒扫描。这使您可以利用扫描仪更新。

文件缺点: 1. 在多网络服务器环境中,需要一个可访问的共享。也应将其集群以进行故障转移。 2. 处理文件访问的附加安全要求。您必须小心网络服务器和/或共享不允许文件执行。 3. 事务备份必须考虑文件系统。


上面说过,SQL 2008 有一个叫做 FILESTREAM 的东西,它结合了两个世界。您上传到数据库,它会透明地将文件存储在磁盘上的目录中。检索时,您可以从数据库中提取;或者您可以直接转到它在文件系统上的位置。

【讨论】:

【参考方案2】:

在数据库中存储二进制文件的优点:

自从 系统需要的数据访问层 仅与 DB 接口而不是 DB + 文件系统。 您可以使用 基于相同的综合权限 保护其余部分的安全性 数据库。 您的二进制文件受到保护 与其他人一起对抗损失 通过数据库备份您的数据。 没有单独的文件系统备份系统 必填。

在数据库中存储二进制文件的缺点:

取决于文件的大小/数量, 可以占用大量空间 可能会降低性能 (取决于您的二进制文件是否 文件存储在一个表中 经常查询其他内容或 不是)并进行更长的备份 次。

在文件系统中存储二进制文件的优点:

这就是文件系统的优点 在。文件系统将处理 碎片整理和检索 文件(比如将视频文件流式传输到 通过网络服务器)可能会 使用 db 更快。

在文件系统中存储二进制文件的缺点:

稍微复杂的数据访问 层。需要自己的备份系统。 需要考虑参考 完整性问题(例如删除 数据库中的指针将需要 导致文件被删除,以便 中没有“孤立”文件 文件系统)。

总的来说,我会使用文件系统。过去,使用 SQL Server 2005,我只需在 db 表中存储一个指向二进制文件的“指针”。指针通常是 GUID。

如果您使用的是 SQL Server 2008(可能还有其他版本 - 我不知道),那么好消息是:内置支持使用新的 VARBINARY(MAX) FILESTREAM 数据类型的混合解决方案。这些在逻辑上的行为类似于 VARBINARY(MAX) 列,但在幕后,SQL Sever 2008 会将数据存储在文件系统中。

【讨论】:

当我开始打字时,还没有答案。 SO正在成为一个猜谜节目,最快的打字员获胜! :) 我认为你实际上比我领先一两分钟。【参考方案3】:

没有最好的办法。

什么?您需要更多信息吗?

我知道三种方式...一种,作为数据库中的字节数组。二,作为一个文件,其路径存储在数据库中。三、作为混合体(仅在 DB 允许的情况下,例如使用 FileStream 类型)。

第一个非常酷,因为您可以在同一步骤中查询和获取数据。这总是很好。但是当你有很多文件时会发生什么?你的数据库变大了。现在您必须处理大型数据库维护问题,例如备份超过 TB 的数据库的试验。如果您需要外部访问文件会发生什么?例如类型转换、批量操作(调整所有图像大小、应用水印等)?这比你有文件时要难得多。

第二个非常适合大量文件。您可以将它们存储在 NAS 设备上、增量备份、保持数据库较小等。但是,当您拥有大量文件时,您开始在文件系统中遇到限制。如果你将它们传播到网络上,你会遇到延迟问题、用户权限问题等。另外,如果你的网络被重新安排,我很同情你。现在您必须在数据库上运行大量更新以更改文件位置,如果出现问题,我很同情您。

然后是混合选项。它几乎完美——您可以通过查询获取文件,但您的数据库并不庞大。这能解决你所有的问题吗?可能不是。您的数据库不再可移植;您被锁定到特定的 DBMS。而且这东西还不成熟,所以你可以享受出牙的过程。谁说这可以解决所有不同的问题?

事实是,没有“最好”的方法。你只需要确定你的要求,根据它们做出最好的选择,然后当你发现你做错了事情时就接受它。

【讨论】:

谢谢 Will,我正在考虑使用 FileStream,但由于您提出的问题,您的回答让我重新思考!【参考方案4】:

我喜欢将图像存储在数据库中。只需更改数据库(无需复制文件),就可以轻松地从开发切换到生产。数据库可以像文件系统一样跟踪创建/修改日期等属性。

【讨论】:

【参考方案5】:

我个人从不出于性能目的将图像存储在数据库中。在我的所有站点中,我都有一个“/files”文件夹,我可以根据要存储的图像类型来放置子文件夹。然后我按约定命名它们。

例如,如果我要存储个人资料图片,我会将其作为 profile_2.jpg 存储在“/files/profile/”中(如果 2 是帐户的 ID)。我总是将服务器上的图像调整为我需要的最大尺寸,然后在需要时再调整较小的尺寸。所以我会保存“profile_2_thumb.jpg”和“profile_2_full.jpg”。

通过为自己创建规则,您可以简单地在代码中调用 img src="/files/profile__thumb.jpg"

反正我就是这么干的!

【讨论】:

以上是关于存储二进制或图像文件的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

提取 zip 文件并将其存储到图像或文件字段

既然 apache 的 MultipartEntityBuilder 已被弃用,那么使用 Volley 库上传图像或文件的最佳方式是啥?

谁能告诉在 SQL 中存储图像的最佳方法是啥

在 mysql 中存储二进制数据(图像、pdf、mp3、视频等)的最佳方法是啥,为啥?

在 web 应用程序中存储用户上传文件的最佳方式

像图像或 PDF 文件这样的 MIME 类型不需要 base64 或以其他方式编码吗?