我即将在我们的应用程序中实现一项功能,允许用户“上传”PDF或Microsoft PowerPoint文档,然后应用程序将其提供给查看器中的其他用户(因此他们无法访问“下载”它在'另存为......'的意义上。)
我已经知道如何在数据库列中保存和检索任意二进制信息,但由于这将是我们应用程序的一个常用功能,我担心该解决方案会导致数据库表格庞大(因为我们知道我们的客户之一会想把视频放在PowerPoint文档中。)
我知道有一种方法可以在Oracle中创建“目录”对象,但有没有办法使用此功能来存储和检索保存在数据库服务器上其他位置的二进制文件?
或者我对数据库大小过于偏执?
(为了完整性,我们的应用程序是.Net WinForms使用CoreLab / DevArt OraDirect.Net drivers到Oracle 10g)
答案 0 :(得分:5)
几个选项:您可以将BLOB列放在自己的表空间中,具有自己的存储特性;您可以将BLOB存储在自己的表中,通过ID列链接到另一个表。在任何一种情况下,如您所建议的那样,您可以将列定义为BFILE,这意味着实际文件存储在数据库外部的目录中。可能存在的问题是BFILE LOB不参与事务,并且不能与数据库的其余部分一起恢复。
这一点在Oracle 10gR2 SQL参考,第2章,从第23页开始讨论。
答案 1 :(得分:1)
我想这取决于你认为非常大的东西。
这确实取决于用例。如果只是很少访问文档,那么将它放入数据库就可以了(具有获得“免费”备份的优势,例如,使用数据库)。
如果这些是一遍又一遍的文件,你可能最好将它们直接放在磁盘上然后存储位置,甚至(如果它真的很高的带宽)看起来像{{3 }}
没有人能够给你一个是或否答案。
答案 2 :(得分:1)
您可以使用普通的LOB列类型并为该字段设置存储参数,使其位于单独的表空间中。在可以处理大量数据的地方创建表空间,并将影响降至最低。
对于磁盘使用情况非常偏执,你可以通过标记它来另外压缩表空间。有点像:
创建TABLESPACE binary_data1 DATAFILE some_san_location 默认压缩存储(...)
答案 3 :(得分:1)
根据我的经验,包含附件文件名的简单VARCHAR2字段是一种更好,更简单的解决方案。文件系统大小比数据库大小更容易管理。
答案 4 :(得分:1)
数据必须存在于某个地方,无论它是数据库的内部数据,还是只存储指向(服务器)可访问文件路径的链接,您仍然在咀嚼空间。
我过去刚刚使用过简单的LOB字段,似乎工作正常。如果您将数据保留在数据库中至少保持较低的备份麻烦 - 您可能需要备份大量数据,但是当您还原数据时,它们都会存在。拆分二进制文件意味着如果您不小心备份内容,可能会破坏数据库或丢失数据。
答案 5 :(得分:1)
仅存储链接或可用于构建链接的ID的一个原因是您通常用于Oracle DB的存储相当昂贵。如果你有很多大文件,那么将它们放在较便宜的磁盘阵列上通常会更具成本效益。