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

时间:2010-01-08 15:45:10

标签: database image upload binary store

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

  1. 数据库系统
  2. 档案系统
  3. 请您解释,为什么?

5 个答案:

答案 0 :(得分:9)

没有真正的最佳方式,只是一堆权衡。

数据库优点
1.在集群环境中处理起来容易得多 2.不依赖文件服务器等附加资源 3.无需在负载平衡环境中设置“同步”操作 4.备份自动包含文件。

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


文件优点
1.对于单个Web /单数据库服务器安装,它很快 2.熟悉操作文件的能力。换句话说,如果磁盘空间不足,可以很容易地将文件移动到其他位置 3.文件“静止”时可以扫描病毒。这使您可以利用扫描仪更新。

档案缺失
1.在多Web服务器环境中,需要可访问的共享。哪个也应该聚集在一起进行故障转移 2.处理文件访问的其他安全要求。您必须小心Web服务器和/或共享不允许文件执行 3.事务备份必须考虑文件系统。


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

答案 1 :(得分:4)

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

  • 自复杂以来,复杂性有所降低 您系统需要的数据访问层 只有DB的接口而不是DB + 文件系统。
  • 您可以使用以下方法保护您的文件 相同的综合权限 保护其他人的安全 数据库。
  • 您的二进制文件受到保护 与其他人一起反对损失 您的数据通过数据库备份。 没有单独的文件系统备份系统 必需的。

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

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

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

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

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

  • 稍微复杂的数据访问 层。需要自己的备份系统。 需要考虑参考 完整性问题(例如删除 数据库中的指针需要 导致删除文件 没有'孤儿'文件 文件系统)。

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

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

答案 2 :(得分:2)

没有最好的办法。

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

我知道有三种方式......一种是数据库中的字节数组。二,作为文件存储在数据库中的路径。三,作为混合(仅当DB允许时,例如FileStream类型)。

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

第二个对于大量文件很有用。您可以将它们存储在NAS设备上,逐步备份它们,保持数据库小等等。但是,当您有大量文件时,就会开始遇到文件系统中的限制。如果你将它们传播到网络上,就会出现延迟问题,用户权利问题等。另外,如果您的网络被重新安排,我会对您表示同情。现在你必须在数据库上运行大量更新来改变你的文件位置,如果有什么东西搞砸了,我会很同情你。

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

事实是,没有“最好”的方式。你只需要确定你的要求,根据它们做出最好的选择,然后当你弄清楚你做错了什么时就把它吸了。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

通过为自己创建规则,您只需在代码中调用img src =“/ files / profile__thumb.jpg”

无论如何我都是这样做的!