在数据库中将文档存储为Blobs - 有什么缺点吗?

56
我的文档管理系统的要求如下:
  1. 必须防止简单复制目录、文件等的盗窃。
  2. 必须防范传统病毒感染(物理文件感染)。
  3. 检索速度必须快。
  4. 资料库不应对普通用户(目录)浏览可见。
我决定将所有文档(以及扫描的图像)作为数据库中的二进制大对象存储,到目前为止我的经验非常好,并且文档检索非常快速,它符合上述所有标准,并且还有一些附加优势,例如自动将文档与相关实体一起存储,轻松快速地搜索内容,删除所有打开和命名文档等用户活动等。
我的问题是,这种设计和实现是否存在任何严重风险或者我是否忽略了什么?
编辑说明:DB是PostgreSQL,可以很好地处理BLOB,并且可以良好地扩展。该环境是多用户环境。
8个回答

42

当您的数据库变得越来越大时,备份就会变得更加困难。还原一个包含超过100GB数据的表格并不是一件让人高兴的事情。

另一个问题是随着数据集的增长,所有的表管理功能都会变得越来越慢。
但这可以通过将数据表中仅包含两个字段来解决:ID和BLOB。

只有在备份数据集达到瓶颈后,通过主键检索数据才可能成为问题。


与任何大型数据集一样,需要一个服务器,将其放入和取出复制以对数据库进行快照备份。这在BLOBs方面会有什么不同呢? - Brad
1
图像与其他BLOB数据之间没有区别。但是,将BLOB数据移动到自己的表中可以加快读取其他列的速度,因为不需要引用/加载BLOB数据到内存中。此外,除了图像之外,大多数Web开发都没有大量的BLOB数据。 - Jacco
@Jacco 每个长度超过1000个字符的Unicode字符串在Oracle上都需要一个CLOB,因为Oracle使用4个字节存储Unicode,并且每个值必须小于4k。很容易超出这个限制。我们需要CLOB来存储未解析的XML数据和BLOB来存储证书。 - ceving

31

我经常听到使用BLOB的主要缺点是,在某些大小以上,文件系统比存储和检索大文件更有效率。根据您的需求清单,您似乎已经考虑到了这一点。

这里有一个PDF参考文献,涵盖了BLOB的优缺点。


13

根据我的经验,一些问题包括:

  1. 速度和将文件存储在文件系统上的取舍。

  2. 缓存。我认为Web服务器会更好地缓存静态内容。数据库也可以很好地处理,但是如果数据库还要处理各种其他查询,就不要指望那些大型文档能够长时间保留在缓存中。实际上您必须将文件传输两次:一次从数据库到Web服务器,然后从Web服务器传输到客户端。

  3. 内存限制。在我上一份工作中,我们在数据库中有一个40MB的PDF,并且在日志文件中不断收到Java OutOfMemoryErrors。我们最终意识到,由于Hibernate ORM中的一个设置(如果对象是可变的,则为编辑在内存中进行副本),整个80MB PDF不止一次地读入堆中。一旦将PDF流式传输回用户,堆就被清理了,但是一次性将80MB的数据从堆中读出以流式传输文档对性能影响很大。要了解您的代码以及如何使用内存!

您的Web服务器应该能够处理大部分安全问题,但是如果文档很小而且数据库没有承受大负载,那么在数据库中存储它们我认为没有大问题。


文档大小仍将保持相对较小,但我会记住这一点,也许可以在不同服务器上拥有两个数据库或类似的解决方案。 - Johan Bresler

4

我刚开始研究SQL Server 2008的FILESTREAMing用于BLOBs,并发现一个巨大的限制(依我之见)--它只能与集成安全一起使用。如果您不使用Windows身份验证连接到DB服务器,则无法读取/写入BLOBs。许多应用程序环境无法使用Windows身份验证。在异构环境中肯定不行。

存在更好的存储BLOBs的解决方案。最佳实践是什么?


2

这篇文章涵盖了大多数问题。如果你正在使用SQL Server 2008,请查看Paul Randal在这里讨论的使用新的FILESTREAM类型的方法。


2

这取决于数据库类型。Oracle还是SQLServer?请注意一个缺点 - 恢复单个文档。


0

根据我的经验,在SQL Server和Oracle中将内容文件存储为blob,对于小型数据库和低数量的登录用户来说可以正常运作。ECM系统分离它们并使用单独的服务来流式传输内容。根据文件的大小,同时检索大文件可能会影响服务器资源。具有大量文件的数据库的归档由于恢复时间和无法从存档中检索文档而变得棘手。

如果这些文件是公司记录,并且这是记录的权威副本,您可能会遇到合规性和保留管理问题,特别是如果您存档这些文件。此外,搜索和版本控制可能成为未来的重大问题。

您可能需要调查一下带有API的ECM系统,而不是重新发明轮子。


-1

抱歉 - 我提供的答案基于SQL Server,因此维护部分不适用。但是文件I/O是在硬件级别完成的,任何数据库都会增加额外的处理步骤。

检索文档时,数据库将会施加额外的开销。当文件在磁盘上时,您只能像服务器上的I/O一样快或慢。您确实应该在数据库中管理您的元数据,但最终您需要文件的UNC并指向用户到源文件,然后离开。

从维护和管理的角度来看,处理MS SQL Server时,您将限制自己使用SAN。像Documentum这样的解决方案采用了不同的方法,在磁盘上进行简单存储,并允许您根据需要实现存储解决方案。

编辑

让我澄清一下我的说法 - 在超出盒子的物理存储容量时,使用SQL Server时您的选择有限。这实际上是Sharepoint的一个重大弱点之一,即您无法简单地连接任何类型的网络存储。


Mitch: 数据库相较于本地文件的I/O调用会造成额外的网络连接,由此导致的时间差可能是明显的,特别是当你可以使用sendfile()进行I/O时。(sendfile() info: http://articles.techrepublic.com.com/5100-10878_11-1044112.html) - Powerlord

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接