1

我即将在我们的应用程序中实现一项功能,该功能允许用户“上传”PDF 或 Microsoft PowerPoint 文档,然后应用程序将在查看器中将其提供给其他用户(因此他们无法“下载”它在“另存为..”的意义上)。

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

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

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

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

4

6 回答 6

5

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

这一切都在 Oracle 10gR2 SQL 参考第 2 章第 23 页开始讨论。

于 2008-09-15T13:42:06.293 回答
1

我想这取决于你认为非常大的东西。

它确实取决于用例。如果文档只是很少被访问,那么将其放入数据库就可以了(具有获得“免费”备份的优势,例如,使用数据库)。

如果这些文件会一次又一次地被击中,你可能最好将它们直接放在磁盘上并存储位置,或者甚至(如果它的带宽真的很高)查看MogileFS之类的东西

没有人能够对此给出是或否的答案。

于 2008-09-15T13:44:03.810 回答
1

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

要对磁盘使用非常严重,您可以通过将表空间标记为这样来额外压缩表空间。类似于以下内容:

CREATE TABLESPACE binary_data1 DATAFILE some_san_location DEFAULT COMPRESS STORAGE(...)

于 2008-09-15T13:45:30.280 回答
1

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

于 2008-09-15T13:45:54.507 回答
1

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

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

于 2008-09-15T13:49:48.427 回答
1

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

于 2008-09-15T14:20:25.920 回答