2008-09-15 44 views
1

我即将在我们的应用程序中实现一项功能,允许用户“上传”PDF或Microsoft PowerPoint文档,然后该应用程序将在查看器中提供给其他用户(这样他们就不会“下载'在'另存为'意义上)。使用Oracle 10g保存和检索二进制文件的最佳方式是什么?

我已经知道如何在数据库列中保存和检索任意二进制信息,但由于这将是我们应用程序的常用功能,所以我担心该解决方案会导致极大的数据库表(因为我们知道我们的客户之一将要把PowerPoint视频文件)。

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

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

(出于完整性我们的应用程序是使用CoreLab/DevArt OraDirect.Net drivers净的WinForms到Oracle 10g)

感谢您的帮助:O)

回答

5

两个选择:你可以把BLOB列在其自己的表空间,与它自己的存储特性;您可以将BLOB存储在其自己的表中,并通过ID列链接到另一个表。在任何情况下,如您所建议的,您可以将该列定义为BFILE,这意味着实际文件将从数据库的外部存储在目录中。可能有一个问题是,BFILE LOB不参与事务,并且不能与数据库的其余部分一起恢复。

这是在Oracle 10gR2中SQL引用的所有讨论,第2章,开始第23页

1

上我想这取决于你认为极大地大。

它确实取决于用例。如果文档只是很少被访问,那么把它放入数据库就没有问题了(例如,获得“免费”备份的好处,例如数据库)。

如果这些是要被打了一遍又一遍,你可能会更好地把他们直接在磁盘上只存储位置,甚至(如果它真的高带宽)文件看看像MogileFS

没有人能够给你一个是或否的答案。

1

您可以使用正常的LOB列类型,并为该字段设置存储参数,使其位于单独的表空间中。在可以处理大量数据的地方创建表空间,并将影响降至最低。

要严重超级偏执地关于磁盘使用情况,您还可以通过将其标记为这样来压缩表空间。沿着线的东西:

CREATE TABLESPACE binary_data1 DATAFILE some_san_location DEFAULT COMPRESS存储(...)

1

在我的经验中,包含附件的文件名一个简单的VARCHAR2场是一个更好的和更容易解决。文件系统的大小比数据库的大小更容易管理。

1

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

我刚刚使用了简单的LOB字段,它似乎工作正常。如果您至少保留了数据库中的数据,那么您的备份问题就会降低 - 您可能需要备份大量数据,但是当您恢复数据时,它们都会在那里。将二进制数据拆分出来意味着如果您不小心备份什么,可能会破坏数据库或丢失数据。

1

只存储链接或可用于构建链接的ID的一个原因是,您通常用于Oracle DB的存储器相当昂贵。如果你有很多大文件,把它们放在一个更便宜的磁盘阵列上通常会更具成本效益。

相关问题