使用Oracle 10g保存和检索二进制文件的最佳方法是什么?

时间:2020-03-05 18:53:28  来源:igfitidea点击:

我将在我们的应用程序中实现一项功能,该功能允许用户"上传" PDF或者Microsoft PowerPoint文档,然后该应用程序将可用于查看器中的其他用户(这样他们就不必"下载"从"另存为.."的意义上来说)。

我已经知道如何在数据库列中保存和检索任意二进制信息,但是由于这将是我们应用程序的常用功能,因此我担心解决方案会导致数据库表非常庞大(因为我们知道我们的一位客户希望放置PowerPoint文档中的视频)。

我知道有一种在Oracle中创建"目录"对象的方法,但是有没有一种方法可以使用此功能来存储和检索数据库服务器上其他位置保存的二进制文件?

还是我对数据库的大小过于偏执?

(为完整起见,我们的应用程序是使用CoreLab / DevArt OraDirect.Net驱动程序到Oracle 10g的.Net WinForms)

谢谢帮助:o)

解决方案

回答

几个选择:我们可以将BLOB列放在具有自己的存储特性的表空间中;我们可以将BLOB存储在自己的表中,并通过ID列链接到另一个表。在我们建议的任何一种情况下,都可以将列定义为BFILE,这意味着实际文件是从数据库外部存储在目录中的。可能要担心的是BFILE LOB不参与事务,并且无法与数据库的其余部分恢复。

从第23页开始的《 Oracle 10gR2 SQL参考》第2章对此进行了讨论。

回答

我想这取决于我们认为巨大的东西。

它确实取决于用例。如果仅很少访问文档,则将其放到数据库中就可以了(具有获得"免费"备份(例如通过数据库)的优势)。

如果这些文件将要被一遍又一遍地查找,则最好将它们直接放在磁盘上并存储位置,甚至(如果其带宽确实很高)查找MogileFS之类的文件

没有人能够为我们提供"是"或者"否"的答案。

回答

我们可以使用普通的LOB列类型并设置该字段的存储参数,使其位于单独的表空间上。在可以处理大量数据的地方创建表空间,可以最大程度地减少影响。

要对磁盘使用情况产生严重的偏执,可以另外通过标记表空间来压缩表空间。类似于以下内容:

创建表空间
binary_data1
数据文件
some_san_location
默认压缩存储(...)

回答

以我的经验,包含附件文件名的简单VARCHAR2字段是一种更好,更轻松的解决方案。文件系统大小比数据库大小容易管理得多。

回答

数据必须存在于某个地方,无论是在数据库内部还是在仅存储指向(服务器)可访问文件路径的链接,我们仍在咀嚼空间。

我过去只使用过简单的LOB字段,它似乎工作正常。如果至少将数据保留在数据库中,则可以减少备份麻烦,则可能有很多数据要备份,但是当我们还原它们时,这些数据将全部存在。拆分二进制文件意味着,如果我们对备份内容不小心,可能会破坏数据库或者丢失数据。

回答

仅存储链接或者可用于构建链接的ID的一个原因是,通常用于Oracle DB的存储相当昂贵。如果我们有很多大文件,通常将它们放在价格较低的磁盘阵列上更具成本效益。