代码之家  ›  专栏  ›  技术社区  ›  jitbit

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

  •  1
  • jitbit  · 技术社区  · 17 年前

    我将在我们的应用程序中实现一个允许用户“上传”PDF或Microsoft PowerPoint文档的功能,然后该应用程序将在查看器中提供给其他用户(这样他们就不会从“另存为…”的意义上“下载”该文档)。

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

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

    或者我对数据库的大小过于偏执?

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

    6 回复  |  直到 6 年前
        1
  •  5
  •   Allan    17 年前

    有两个选项:您可以将BLOB列放在自己的表空间中,并具有自己的存储特性;您可以将BLOB存储在自己的表中,通过ID列链接到另一个表。在这两种情况下,您都可以将列定义为bfile,这意味着实际文件是从数据库外部存储在目录中的。可能存在的问题是bfile lob不参与事务,并且不能与数据库的其余部分一起恢复。

    这在第23页开始的Oracle10GR2 SQL参考第2章中都有讨论。

        2
  •  1
  •   Matthew Watson    17 年前

    我想这取决于你认为的巨大。

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

    如果这些文件将被一次又一次地攻击,那么您最好将它们直接放在磁盘上并只存储位置,或者甚至(如果它的带宽真的很高)查找类似 MogileFS

    没有人能给你一个肯定或否定的答案。

        3
  •  1
  •   Bad Hedgehog    17 年前

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

    要认真对待磁盘使用情况,可以通过标记表空间来额外压缩表空间。沿着这条线的东西:

    创建表空间 Bialayl DATA1 数据文件 一些圣保罗的位置 默认压缩存储(…)

        4
  •  1
  •   JosephStyons    17 年前

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

        5
  •  1
  •   MarcE    17 年前

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

    我过去只使用简单的LOB字段,它似乎工作得很好。如果您将数据保存在数据库中,那么至少您可以将备份的麻烦保持在较低的水平—您可能有很多数据需要备份,但是当您恢复数据时,这些数据都会存在。如果不小心备份什么,将二进制文件拆分意味着可能会破坏数据库或丢失数据。

        6
  •  1
  •   Lost Plugin Writer    17 年前

    仅存储链接或可用于构建链接的ID的一个原因是,通常用于Oracle数据库的存储相当昂贵。如果你有很多大文件,把它们放在一个更便宜的磁盘阵列上通常更划算。

    推荐文章