7

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

  1. 数据库系统
  2. 文件系统

请你解释一下,为什么?

4

5 回答 5

10

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

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

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


文件优点
1. 对于单个 web/单个 db 服务器安装,它很快。
2. 很好理解的文件操作能力。换句话说,如果磁盘空间不足,很容易将文件移动到不同的位置。
3.可以在文件“静止”时进行病毒扫描。这使您可以利用扫描仪更新。

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


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

于 2010-01-08T16:06:32.480 回答
5

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

  • 由于系统的数据访问层只需要与 DB 而不是 DB + 文件系统的接口,因此复杂性有所降低。
  • 您可以使用保护数据库其余部分的同样全面的基于权限的安全性来保护您的文件。
  • 通过数据库备份,您的二进制文件与其他数据一起受到保护,不会丢失。不需要单独的文件系统备份系统。

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

  • 根据文件的大小/数量,可能会占用大量空间,这可能会降低性能(取决于您的二进制文件是否存储在经常查询其他内容的表中)并延长备份时间。

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

  • 这是文件系统擅长的。文件系统可以很好地处理碎片整理,并且检索文件(比如通过 Web 服务器将视频文件流式传输)可能会比使用 db 更快。

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

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

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

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

于 2010-01-08T16:04:05.830 回答
4

没有最好的办法。

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

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

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

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

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

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

于 2010-01-08T16:05:42.910 回答
0

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

于 2010-01-08T15:53:06.500 回答
0

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

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

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

反正我就是这样做的!

于 2010-01-08T15:54:29.867 回答